0
点赞
收藏
分享

微信扫一扫

SpringMVC静态资源放行规则


在springmvc的配置文件中有三种拦截规则,本章不多做介绍

  • ​/​​:拦截除了JSP之外的所有请求
  • ​/*​​:拦截所有请求
  • ​*.xxx​​:拦截*.xxx后缀的请求

SpringMVC的放行规则为三种:

  • ​​缺省servlet放行​​
  • ​​resource放行​​
  • ​​mvc:default-servlet-handler放行​​

项目目录结构:

SpringMVC静态资源放行规则_放行静态资源



放行规则一:Tomcat中的缺省Servlet放行

查看Tomcat/conf/web.xml,发现其中有配置一个名为default的servlet,该servlet是Tomcat服务器提供的一个专门帮我们处理静态资源的servlet

SpringMVC静态资源放行规则_放行规则_02


使用缺省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​

SpringMVC静态资源放行规则_SpringMVC_03

注意:缺省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页面当做静态资源处理直接把代码放入前端

SpringMVC静态资源放行规则_放行规则_04



放行规则二: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​

SpringMVC静态资源放行规则_放行静态资源_05


测试未放行路径:​​http://localhost:8080/css/css.css​

SpringMVC静态资源放行规则_放行规则_06


此种放行原理是:请求必须进入​​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页面



放行规则三:

修改​​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​

SpringMVC静态资源放行规则_SpringMVC_07


注意:​​<mvc:default-servlet-handler />​​放行底层也是基于Tomcat的缺省servlet,因此也不能针对JSP放行,如果访问jsp也是会出现第一种放行测试时的问题,把jsp页面代码直接显示到前端测试访问:​​http://localhost:8080/index.jsp​

SpringMVC静态资源放行规则_放行规则_08

三种放行总结

放行规则

进入springmvc

由谁来放行

方式1


缺省servlet

方式2


springmvc自己放行

方式3


缺省servlet


举报

相关推荐

0 条评论