您好,欢迎来到年旅网。
搜索
您的当前位置:首页springmvc中静态资源放行、自定义视图解析、restful、WEB-INF下的资源请求混淆问题

springmvc中静态资源放行、自定义视图解析、restful、WEB-INF下的资源请求混淆问题

来源:年旅网

实验结论

接下来说一下我得出的结论:
1. jsp文件不会经过单元方法匹配问题(但html、css、js、image等都会经过单元方法匹配)
2. 静态资源放行的优先级低于单元方法的匹配,静态资源放行的url不要和单元方法冲突,若冲突则静态资源放行不生效
3. WEB-INF下的资源虽然不能通过浏览器直接访问,但是我们可以通过请求转发和静态资源放行的机制访问
4. 访问jsp时不会经过静态资源放行(但html会)

踩坑记录

情景一:

代码

静态资源放行、自定义视图解析器

<!-- 3.配置静态资源放行    -->
    <mvc:resources mapping="/js/**" location="/WEB-INF/js/"></mvc:resources>
    
    <mvc:resources mapping="/css/**" location="WEB-INF/css/"></mvc:resources>
    <mvc:resources mapping="/images/**" location="WEB-INF/images/"></mvc:resources>

    <!--  4.配置自定义视图解析器  -->
    <bean id="resourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/page/"></property>
        <property name="suffix" value=" "></property>
    </bean>

通过这段代码配置了静态资源放行以及自定义视图,我们可以看到当url匹配js/xxx、css/xxx、images/xxx的时候,我们可以通过静态资源放行跳转到WEB-INF/js(css、images)下的资源。我不配置后缀名的想法是我想通过该视图解析器访问WEB-INF/page下的任何资源,如果设置了后缀名就将资源类型限定死了。

restful代码

@RequestMapping("{page}/{url}")
    public String getPage(@PathVariable String url){
        System.out.println("restful:"+url);
        return url;
    }

该段代码的作用是配合自定义视图解析器使得浏览器可以访问WEB-INF下的资源

文件层级

结果

@RequestMapping("{url}/{xxx}")
    public String getPage(@PathVariable String url){
        System.out.println("restful:"+url);
        return url;
    }

不少小伙伴问,不是说jsp文件的请求不会和单元方法匹配嘛,这不还是匹配到了restful格式的方法,是的,的确匹配到了,但是它压根不是jsp请求。大家仔细看看
http://localhost:8080/springMVC_02_war_exploded/index.jsp/xxx这个格式是jsp请求嘛,jsp只是路径的一段而已,此时服务器将index.jsp解析为一个层级而已而不是jsp文件。

情景二

刚刚我们已经测试了jsp文件的请求不会经过单元方法,那它会经过静态资源放行吗?

代码

 <!-- 3.配置静态资源放行    -->
    <mvc:resources mapping="/js/**" location="/WEB-INF/js/"></mvc:resources>
    <mvc:resources mapping="/page/**" location="/WEB-INF/page/"></mvc:resources>
    <mvc:resources mapping="/css/**" location="WEB-INF/css/"></mvc:resources>
    <mvc:resources mapping="/images/**" location="WEB-INF/images/"></mvc:resources>

    <!--  4.配置自定义视图解析器  -->
    <bean id="resourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/page/"></property>
        <property name="suffix" value=""></property>
    </bean>
单元方法
@RequestMapping("{url}")
    public String getPage(@PathVariable String url){
        System.out.println("restful:"+url);
        return url;
    }

文件层级

结果

情景三

此时我想比较静态资源放行的转发和单元方法匹配谁优先级更高。

代码

 <!-- 3.配置静态资源放行    -->
    <mvc:resources mapping="/js/**" location="/WEB-INF/js/"></mvc:resources>
    <mvc:resources mapping="/page/**" location="/page/"></mvc:resources>
    <mvc:resources mapping="/css/**" location="WEB-INF/css/"></mvc:resources>
    <mvc:resources mapping="/images/**" location="WEB-INF/images/"></mvc:resources>

    <!--  4.配置自定义视图解析器  -->
    <bean id="resourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/page/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>
    @RequestMapping("{url}")
    public String getPage(@PathVariable String url){
        System.out.println("restful:"+url);
        return url;
    }

我们注意,此时我给自定义视图加上了后缀,我可以通过访问/index来跳转到/WEB-INF/page/index.jsp文件。

文件层级

结果


成功访问,我们再改文件层级再次验证若单元方法失败后,静态资源放行还能否执行?

我们将WEB-INF/page下的index.html移到了page下,并且去掉自定义视图解析器的后缀名添加,因为html可以被过静态资源放行和单元方法两者匹配到。此时请求page/html,单元方法匹配肯定失效,若是静态资源放行仍能执行则应该正确访问,若是单元方法失败后静态资源放行不再执行则报404

显然,单元方法和静态资源放行不能的url设置不应该冲突,若发生冲突的话静态资源放行则不再执行。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- oldu.cn 版权所有 浙ICP备2024123271号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务