接下来说一下我得出的结论:
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
本站由北京市万商天勤律师事务所王兴未律师提供法律服务