欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SpringMVC静态资源放行规则

程序员文章站 2022-07-10 18:11:10
...

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

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

SpringMVC的放行规则为三种:

项目目录结构:
SpringMVC静态资源放行规则

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

查看Tomcat/conf/web.xml,发现其中有配置一个名为default的servlet,该servlet是Tomcat服务器提供的一个专门帮我们处理静态资源的servlet
SpringMVC静态资源放行规则
使用缺省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不进入SpringMVCDispatcherServlet,那么就必须保证这些请求不能被SpringMVC拦截到,因此SpringMVC的拦截规则不能为/*

测试访问:http://localhost:8080/js/jquery-3.3.1.min.js
SpringMVC静态资源放行规则

注意:缺省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静态资源放行规则

放行规则二: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静态资源放行规则
测试未放行路径:http://localhost:8080/css/css.css
SpringMVC静态资源放行规则
此种放行原理是:请求必须进入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
SpringMVC静态资源放行规则
注意:<mvc:default-servlet-handler />放行底层也是基于Tomcat的缺省servlet,因此也不能针对JSP放行,如果访问jsp也是会出现第一种放行测试时的问题,把jsp页面代码直接显示到前端

测试访问:http://localhost:8080/index.jsp
SpringMVC静态资源放行规则

三种放行总结

放行规则 进入springmvc 由谁来放行
方式1 缺省servlet
方式2 springmvc自己放行
方式3 缺省servlet