• 08【SpringMVC的放行规则】



    二、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.tomcatgroupId>
        <artifactId>tomcat-catalinaartifactId>
        <version>8.5.41version>
        
        <scope>providedscope>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    回顾Maven依赖范围:

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

    在web.xml中配置:

    <servlet>
        <servlet-name>springmvcservlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
        <init-param>
            <param-name>contextConfigLocationparam-name>
            <param-value>classpath:dispatcher-servlet.xmlparam-value>
        init-param>
    servlet>
    <servlet-mapping>
        <servlet-name>springmvcservlet-name>
        
        <url-pattern>/url-pattern>
    servlet-mapping>
    
    
    
    <servlet>
        <servlet-name>defaultservlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServletservlet-class>
    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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

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

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

    2.3 resources放行

    web.xml:

    <servlet>
        <servlet-name>springmvcservlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
        <init-param>
            <param-name>contextConfigLocationparam-name>
            <param-value>classpath:dispatcher-servlet.xmlparam-value>
        init-param>
    servlet>
    <servlet-mapping>
        <servlet-name>springmvcservlet-name>
        
        <url-pattern>/url-pattern>
    servlet-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    SpringMVC配置文件中配置:

    
    <mvc:resources mapping="/js/**" location="/js/" />
    <mvc:resources mapping="/css/**" location="/css/" />
    <mvc:resources mapping="/imgs/**" location="/imgs/" />
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

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


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

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

    在这里插入图片描述

    2.4 Handler放行

    在SpringMVC配置文件中添加:

    <mvc:default-servlet-handler />
    
    • 1

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

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

    
    <url-pattern>/*url-pattern>
    
    • 1
    • 2

    访问: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名称" />
    
    • 1

    2.5 放行规则小结

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

  • 相关阅读:
    前端笔试练习题——JS7 无重复数组、JS8 数组排序
    Spirng MVC——获取参数详解
    Windows程序运行机制
    【利用AI让知识体系化】拍了拍AST
    贝壳网webpack案例
    数据链路层
    热修复Class流派和Dex流派实现原理
    Springboot-‘@Getter‘ not applicable to type,报错是因为没有引用lombok依赖
    深入理解强化学习——马尔可夫决策过程:马尔可夫决策过程和马尔可夫过程/马尔可夫奖励过程的区别
    java虚拟机详解篇八(运行时数据区概述)
  • 原文地址:https://blog.csdn.net/Bb15070047748/article/details/128105523