SpringMVC静态资源放行规则
在springmvc的配置文件中有三种拦截规则,本章不多做介绍
-
/
:拦截除了JSP之外的所有请求 -
/*
:拦截所有请求 -
*.xxx
:拦截*.xxx后缀的请求
SpringMVC的放行规则为三种:
项目目录结构:
放行规则一:Tomcat中的缺省Servlet放行
查看Tomcat/conf/web.xml,发现其中有配置一个名为default的servlet,该servlet是Tomcat服务器提供的一个专门帮我们处理静态资源的servlet
使用缺省servlet放行必须先引入相应依赖:
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-catalina</artifactId>
<version>8.5.41</version>
</dependency>
在springmvc的配置文件中添加如下配置:
<!--配置缺省servlet-->
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
</servlet>
<!--*.html的请求交给缺省servlet(放行)-->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
<!--*.png的请求交给缺省servlet(放行)-->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.png</url-pattern>
</servlet-mapping>
<!--*.js的请求交给缺省servlet(放行)-->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--配置springmvc配置文件的位置-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:dispatcher-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
缺省servlet
放行的原理:如果缺省servlet
中已经配置了后缀的这些请求(如hello.html、hello.js)则进入缺省servlet
不进入SpringMVC
的DispatcherServlet
,那么就必须保证这些请求不能被SpringMVC
拦截到,因此SpringMVC
的拦截规则不能为/*
测试访问:http://localhost:8080/js/jquery-3.3.1.min.js
注意:缺省servlet只能处理静态资源,JSP不属于静态资源,缺省servlet不能放行!
可以做个小测试:
....省略部分缺省servlet配置代码
<servlet-mapping>
<servlet-name>default</servlet-name>
<!-- 如果是jsp请求交给缺省servlet处理-->
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
....省略部分DispatcherSerlvet配置代码
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<!-- 保证能拦截到jsp请求-->
<url-pattern>*.from</url-pattern>
</servlet-mapping>
会出现如下情况,把JSP页面当做静态资源处理直接把代码放入前端
放行规则二:resource资源放行
修改web.xml配置:
....省略DispacherServlet配置代码
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
在springmvc中配置静态资源放行:
<!--
mapping:需要映射的虚拟路径,也就是放行的目录规则
/js/* : 放行js请求路径下的任意请求,但是更深一级目录不会被放行
/js/**:放行js请求路径下的任意请求,包括子包孙包
location: 真实的项目路径
-->
<mvc:resources mapping="/js/**" location="/js/" />
测试放行路径:http://localhost:8080/js/jquery-3.3.1.min.js
测试未放行路径:http://localhost:8080/css/css.css
此种放行原理是:请求必须进入springmvc
被拦截到,然后springmvc
通过resource
放行目录映射规则,发现该请求应该被放行,springmvc
手动将此请求放行(当然,如果springmvc
没有拦截到也是直接放行,如果使用了filter
情况下另外)
注意:此种放行资源也是针对于静态资源,JSP不属于静态资源!
可以做个小测试,springmvc拦截JSP并且通过resource放行
web.xml
:
....省略DispatcherServlet配置代码
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
springmvc配置文件
:
<mvc:resources mapping="/jsp/**" location="/jsp/" />
浏览器访问:http://localhost:8080/jsp/hello.jsp
如果是常见的浏览器能解析的格式,直接按照协议返回,如果不是浏览器能直接解析的会返回下载头导致下载该jsp页面
放行规则三:<mvc:default-servlet-handler />
修改web.xml
:
<!--拦所有请求(包括jsp)-->
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
修改springmvc配置文件:
<!--
default-servlet-name:指定缺省servlet的名字,如果为default可以不写
-->
<mvc:default-servlet-handler default-servlet-name="default"/>
此种放行springmvc
会在Spring MVC
上下文中定义一个DefaultServletHttpRequestHandler
,对进入到DispacherServlet
的请求进行检查,如果发现是静态资源那么将请求交给Tomcat
中的缺省servlet
进行放行。
测试访问:http://localhost:8080/js/jquery-3.3.1.min.js
注意:<mvc:default-servlet-handler />
放行底层也是基于Tomcat的缺省servlet,因此也不能针对JSP放行,如果访问jsp也是会出现第一种放行测试时的问题,把jsp页面代码直接显示到前端
测试访问:http://localhost:8080/index.jsp
三种放行总结
放行规则 | 进入springmvc | 由谁来放行 |
---|---|---|
方式1 | 否 | 缺省servlet |
方式2 | 是 | springmvc自己放行 |
方式3 | 是 | 缺省servlet |