SpringMVC静态资源放行规则

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

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

SpringMVC的放行规则为三种:

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

项目目录结构:
SpringMVC静态资源放行规则_第1张图片

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

查看Tomcat/conf/web.xml,发现其中有配置一个名为default的servlet,该servlet是Tomcat服务器提供的一个专门帮我们处理静态资源的servlet
SpringMVC静态资源放行规则_第2张图片
使用缺省servlet放行必须先引入相应依赖:

<dependency>
    <groupId>org.apache.tomcatgroupId>
    <artifactId>tomcat-catalinaartifactId>
    <version>8.5.41version>
dependency>

在springmvc的配置文件中添加如下配置:


<servlet>
    <servlet-name>defaultservlet-name>
    <servlet-class>org.apache.catalina.servlets.DefaultServletservlet-class>
    <init-param>
        <param-name>debugparam-name>
        <param-value>0param-value>
    init-param>
    <init-param>
        <param-name>listingsparam-name>
        <param-value>falseparam-value>
    init-param>
servlet>
    
<servlet-mapping>
    <servlet-name>defaultservlet-name>
    <url-pattern>*.htmlurl-pattern>
servlet-mapping>
    
<servlet-mapping>
    <servlet-name>defaultservlet-name>
    <url-pattern>*.pngurl-pattern>
servlet-mapping>
    
<servlet-mapping>
    <servlet-name>defaultservlet-name>
    <url-pattern>*.jsurl-pattern>
servlet-mapping>

<servlet>
    <servlet-name>dispatcherservlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
    
    <init-param>
        <param-name>contextConfigLocationparam-name>
        <param-value>classpath:dispatcher-servlet.xmlparam-value>
    init-param>
    <load-on-startup>1load-on-startup>
servlet>
<servlet-mapping>        
    <servlet-name>dispatcherservlet-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静态资源放行规则_第3张图片

注意:缺省servlet只能处理静态资源,JSP不属于静态资源,缺省servlet不能放行!
可以做个小测试:

    ....省略部分缺省servlet配置代码
    <servlet-mapping>
	    <servlet-name>defaultservlet-name>
	    
	    <url-pattern>*.jspurl-pattern>
	servlet-mapping>

	....省略部分DispatcherSerlvet配置代码
	<servlet-mapping>
	    <servlet-name>dispatcherservlet-name>
	    
	    <url-pattern>*.fromurl-pattern>
	servlet-mapping>

会出现如下情况,把JSP页面当做静态资源处理直接把代码放入前端
SpringMVC静态资源放行规则_第4张图片

放行规则二:resource资源放行

修改web.xml配置:

....省略DispacherServlet配置代码
<servlet-mapping>
    <servlet-name>dispatcherservlet-name>
    <url-pattern>/url-pattern>
servlet-mapping>

在springmvc中配置静态资源放行:


<mvc:resources mapping="/js/**" location="/js/" />

测试放行路径:http://localhost:8080/js/jquery-3.3.1.min.js
SpringMVC静态资源放行规则_第5张图片
测试未放行路径:http://localhost:8080/css/css.css
SpringMVC静态资源放行规则_第6张图片
此种放行原理是:请求必须进入springmvc被拦截到,然后springmvc通过resource放行目录映射规则,发现该请求应该被放行,springmvc手动将此请求放行(当然,如果springmvc没有拦截到也是直接放行,如果使用了filter情况下另外)

注意:此种放行资源也是针对于静态资源,JSP不属于静态资源!
可以做个小测试,springmvc拦截JSP并且通过resource放行

web.xml

....省略DispatcherServlet配置代码
<servlet-mapping>
    <servlet-name>dispatcherservlet-name>
    <url-pattern>/*url-pattern>
servlet-mapping>

springmvc配置文件

<mvc:resources mapping="/jsp/**" location="/jsp/" />

浏览器访问:http://localhost:8080/jsp/hello.jsp
如果是常见的浏览器能解析的格式,直接按照协议返回,如果不是浏览器能直接解析的会返回下载头导致下载该jsp页面

放行规则三:

修改web.xml


<servlet-mapping>
    <servlet-name>dispatcherservlet-name>
    <url-pattern>/*url-pattern>
servlet-mapping>

修改springmvc配置文件:


<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静态资源放行规则_第7张图片
注意:放行底层也是基于Tomcat的缺省servlet,因此也不能针对JSP放行,如果访问jsp也是会出现第一种放行测试时的问题,把jsp页面代码直接显示到前端

测试访问:http://localhost:8080/index.jsp
SpringMVC静态资源放行规则_第8张图片

三种放行总结

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

你可能感兴趣的:(Java,SpringMVC,放行静态资源,放行规则,SpringMVC放行静态资源,SpringMVC静态资源处理)