08【SpringMVC的放行规则】

追求适度,才能走向成功;人在顶峰,迈步就是下坡;身在低谷,抬足既是登高;弦,绷得太紧会断;人,思虑过度会疯;水至清无鱼,人至真无友,山至高无树;适度,不是中庸,而是一种明智的生活态度。

导读:本篇文章讲解 08【SpringMVC的放行规则】,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文


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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/131653.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!