二、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中有配置
配置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
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
一般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会特殊处理(下载、无法解析等)!