08【SpringMVC的放行规则】

时间:2022-12-05 19:53:57


二、SpringMVC的放行规则

2.1 SpringMVC提供的拦截规则

  • *.form:代表以*.form结尾的后缀请求都会进入springmvc管
  • /:代表除了JSP以外拦截所有,html、css、js等静态web资源也会拦截
  • /*:拦截所有请求

2.2 缺省Servlet放行

Tomcat提供的默认servlet(DefaultServlet),处理静态资源的(html/css/js),此Servlet在tomcat/conf/web.xml中有配置

08【SpringMVC的放行规则】

08【SpringMVC的放行规则】

配置DefaultServlet需要引入依赖:

<dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-catalina</artifactId>
    <version>8.5.41</version>
    <!--此jar包在tomcat中已经有了,但是如果不引入此依赖项目则会报错,因此依赖范围provided就行-->
    <scope>provided</scope>
</dependency>

回顾Maven依赖范围:

  • compile:编译时存在,测试时存在,运行时存在,会打入war包;(普通jar包)
  • provided:编译时存在,测试时存在,运行时不存在,不会打入war包;(servlet-api)
  • runtime:编译时不存在,测试时存在,运行时存在,会打入war包(mysql驱动)
  • Test:编译时不存在,测试时存在,运行时不存在,不会打入war包(Junit)
  • system:编译时存在,测试时存在,运行时存在,不会打入war包(仅限于本地环境)

在web.xml中配置:

<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:dispatcher-servlet.xml</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <!--拦截除了JSP之外的所有请求-->
    <url-pattern>/</url-pattern>
</servlet-mapping>


<!--代表以html的任何请求进入Tomcat默认的Servlet处理(放行)-->
<servlet>
    <servlet-name>default</servlet-name>
    <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.html</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.png</url-pattern>
</servlet-mapping>

缺省servlet放行原理是:如果是配置的后缀请求直接进入缺省servlet,而不是进入SpringMVC进行处理(不会经过SpringVMC)

Tips:配置缺省servlet放行时,SpringMVC的拦截规则不能为/*,因为缺省Servlet不能放行JSP请求,如果SpringMVC拦截规则为/*,然后缺省Servlet又不能放行,那么访问JSP时,会出现404;

2.3 resources放行

web.xml:

<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:dispatcher-servlet.xml</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <!--拦截除了JSP之外的所有请求-->
    <url-pattern>/</url-pattern>
</servlet-mapping>

在SpringMVC配置文件中配置:

<!--
    resources:配置springmvc放行
        mapping:映射地址
        location:具体目录
        /js/*代表js下面的所有资源不拦截
        /js/** 代表js下所有的资源不拦截包括子孙包
-->
<mvc:resources mapping="/js/**" location="/js/" />
<mvc:resources mapping="/css/**" location="/css/" />
<mvc:resources mapping="/imgs/**" location="/imgs/" />

<mvc:resources />由Spring MVC框架自己按配置的规则处理静态资源,并添加一些有用的附加值功能。


**注意:JSP页面不属于静态资源!** 如果是常见的浏览器能解析的格式,直接按照协议返回,如果不是浏览器能直接解析的会返回下载头导致下载该jsp页面!
  • 修改web.xml:
<!--拦截所有请求(包括JSP)-->
<url-pattern>/*</url-pattern>
  • 修改SpringMVC.xml:
<mvc:resources mapping="/jsp/**" location="/jsp/" />

访问:http://localhost:8080/jsp/demo01.jsp

08【SpringMVC的放行规则】

2.4 Handler放行

在SpringMVC配置文件中添加:

<mvc:default-servlet-handler />

SpringMVC会在Spring MVC上下文中定义一个DefaultServletHttpRequestHandler;它会像一个检查员,对进入DispatcherServlet的URL进行筛查,如果发现是静态资源的请求,就将该请求转由Web应用服务器默认的Servlet处理,如果不是静态资源的请求,才由DispatcherServlet继续处理。

这种方式同样只能放行静态资源,JSP不属于静态资源;我们将web.xml中的拦截规则改为如下:

<!--拦截所有请求(包括JSP)-->
<url-pattern>/*</url-pattern>

访问:http://localhost:8080/jsp/demo01.jsp

08【SpringMVC的放行规则】

一般Web应用服务器默认的Servlet名称是"default",因此DefaultServletHttpRequestHandler可以找到它。如果你所有的Web应用服务器的默认Servlet名称不是"default",则需要通过default-servlet-name属性显示指定:

<mvc:default-servlet-handler default-servlet-name="所使用的Web服务器默认使用的Servlet名称" />

2.5 放行规则小结

  • 1)缺省Servlet放行:请求没有进入springmvc,而是直接进入缺省servlet进行处理放行
  • 2)resource放行:实质上请求是进入了springmvc然后由springmvc自己处理资源,达到放行效果
  • 3)default-servlet-handler放行:请求进入springmvc然后对其进行筛选,发现是个"静态"资源就交给缺省servlet去处理,但是缺省servlet只会处理静态资源,如果是jsp会特殊处理(下载、无法解析等)!