SpringMVC静态资源放行规则

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

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

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

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

SpringMVC的放行规则为三种:

项目目录结构:
在这里插入图片描述

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

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

<dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-catalina</artifactId>
    <version>8.5.41</version>
</dependency>

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

<!--配置缺省servlet-->
<servlet>
    <servlet-name>default</servlet-name>
    <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
    <init-param>
        <param-name>debug</param-name>
        <param-value>0</param-value>
    </init-param>
    <init-param>
        <param-name>listings</param-name>
        <param-value>false</param-value>
    </init-param>
</servlet>
    <!--*.html的请求交给缺省servlet(放行)-->
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.html</url-pattern>
</servlet-mapping>
    <!--*.png的请求交给缺省servlet(放行)-->
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.png</url-pattern>
</servlet-mapping>
    <!--*.js的请求交给缺省servlet(放行)-->
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.js</url-pattern>
</servlet-mapping>

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--配置springmvc配置文件的位置-->
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:dispatcher-servlet.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>        
    <servlet-name>dispatcher</servlet-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
在这里插入图片描述

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

    ....省略部分缺省servlet配置代码
    <servlet-mapping>
	    <servlet-name>default</servlet-name>
	    <!-- 如果是jsp请求交给缺省servlet处理-->
	    <url-pattern>*.jsp</url-pattern>
	</servlet-mapping>

	....省略部分DispatcherSerlvet配置代码
	<servlet-mapping>
	    <servlet-name>dispatcher</servlet-name>
	    <!--  保证能拦截到jsp请求-->
	    <url-pattern>*.from</url-pattern>
	</servlet-mapping>

会出现如下情况,把JSP页面当做静态资源处理直接把代码放入前端
在这里插入图片描述

放行规则二:resource资源放行

修改web.xml配置:

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

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

<!--
    mapping:需要映射的虚拟路径,也就是放行的目录规则
        /js/* : 放行js请求路径下的任意请求,但是更深一级目录不会被放行
        /js/**:放行js请求路径下的任意请求,包括子包孙包
    location: 真实的项目路径      
-->
<mvc:resources mapping="/js/**" location="/js/" />

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

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

web.xml

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

springmvc配置文件

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

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

放行规则三:<mvc:default-servlet-handler />

修改web.xml

<!--拦所有请求(包括jsp)-->
<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

修改springmvc配置文件:

<!--
    default-servlet-name:指定缺省servlet的名字,如果为default可以不写
-->
<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
在这里插入图片描述
注意:<mvc:default-servlet-handler />放行底层也是基于Tomcat的缺省servlet,因此也不能针对JSP放行,如果访问jsp也是会出现第一种放行测试时的问题,把jsp页面代码直接显示到前端

测试访问:http://localhost:8080/index.jsp
在这里插入图片描述

三种放行总结

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

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

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

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

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