SpringMVC - 静态资源放行

什么是静态资源?

css、js、图片、html等都是静态资源

放行静态资源

1、不使用 springmvc 框架分析

不使用 springmvc 框架,这些静态资源请求都会由 tomcat 的默认的 default 进行处理。

2、使用了 springmvc 框架分析

当配置的 DispatcherServlet 的映射路径不为 / 时,对静态资源的请求最终会由 tomcat 的默认配置来处理,所以不影响静态资源的正常访问。
如果配置的 DispatcherServlet 的映射路径为 / 时,会覆盖掉tomcat的默认的 default 配置,所以需要在 springmvc 文件中进行配置,对静态资源进行放行。

一、在 springmvc.xml 中放行 - 需要开启 <mvc:annotation-driven /> 注解驱动

1、对全部资源放行

在springmvc文件中配置上 <mvc:default-servlet-handler/> ,发出静态资源请求后,请求传到 DispatcherServlet,DispatcherServlet 调用 RequestMappingHandlerMapping 进行映射匹配,匹配不成功,DispatcherServlet 最终会将请求转交给 tomcat 默认 default 进行处理。

<mvc:default-servlet-handler/>

2、对指定目录下的资源放行 - <mvc:resources/>

如果配置了拦截器,需要在拦截器中进行过滤,否则会被拦截;

* 代表一级目录,** 代表多级目录

<mvc:resources location="/css/" mapping="/css/**" />
<mvc:resources location="/js/" mapping="/js/**" />
<mvc:resources location="/fonts/" mapping="/fonts/**" />
<mvc:resources location="/picture/" mapping="/picture/**" />
<mvc:resources location="/admin/" mapping="/admin/**" />

补充说明:多个HandlerMapping的执行顺序问题

DefaultAnnotationHandlerMapping 的 order 属性值是:0
<mvc:resources/ > 自动注册的 SimpleUrlHandlerMapping的 order 属性值是: 2147483646
<mvc:default-servlet-handler/> 自动注册的 SimpleUrlHandlerMapping 的 order 属性值是: 2147483647 

Spring会先执行order值比较小的。

当访问一个 a.jpg 图片文件时,先通过 DefaultAnnotationHandlerMapping 来找处理器,一定是找不到的,我们没有叫 a.jpg 的Action。

再按order值升序找,由于最后一个 SimpleUrlHandlerMapping 是匹 "/**"的,所以一定会匹配上,再响应图片。

二、在web.xml中放行:

1、在 web.xml 配置前端控制器 DispatcherServlet 的时候指定 url-pattern 以扩展名结尾;例如:*.do,*.html 等;

<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--
        contextConfigLocation不是必须的, 如果不配置contextConfigLocation,
        springmvc的配置文件默认找:WEB-INF/servlet的name+"-servlet.xml"
     -->
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/springmvc.xml</param-value>
    </init-param>
    <!-- 配置springmvc什么时候启动,参数必须为整数 -->
    <!-- 如果等于0或大于0,则springmvc随服务器的启动而启动 -->
    <!-- 小于0,则在第一次访问的时候启动 -->
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <!--
        1. /*  拦截所有   jsp  js png .css
        2. *.action *.do 拦截以do action 结尾的请求
        3. /  拦截所有 (不包括jsp) (包含.js .png.css)
     -->
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

2、激活 Tomcat 的 defaultServlet 来处理静态文件

在 web.xml 配置 default servlet-mapping 的 url-pattern ,以目录形式和扩展名形式。要写在DispatcherServlet的前面,让 defaultServlet 先拦截,这个就不会进入Spring了;

不同的 servlet 容器/应用服务器,处理这些静态资源的 servlet 的名字不大一样:

● Tomcat、Jetty、JBoss、and GlassFish 默认 Servlet 的名字 -- "default"
● Google App Engine 默认 Servlet的名字 -- " _ah_default"
● Resin 默认 Servlet的名字 -- "resin-file"
● WebLogic 默认 Servlet的名字 -- " FileServlet"
● WebSphere 默认 Servlet的名字 -- " SimpleFileServlet" 

* 代表一级目录,** 代表多级目录

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/admin/*</url-pattern>
    <url-pattern>*.css</url-pattern>
    <url-pattern>*.tff</url-pattern>
    <url-pattern>*.woff</url-pattern>
    <url-pattern>*.js</url-pattern>
    <url-pattern>*.png</url-pattern>
</servlet-mapping>

其他请求不到静态资源的可能原因

一、jsp 或者 html 界面引用 js 文件错误

编写script时没有写完整,有些浏览器还不报错。

错误:<script type="text/javascript" src="${pageContext.request.contextPath }/css/main.min.css" />
正确:<script type="text/javascript" src="${pageContext.request.contextPath }/css/main.min.css"></script>

二、在WEB-INF目录下的静态资源只有服务器能访问,客户端无法直接访问

众所周知,WEB-INF 是被保护的目录,不允许客户端进行访问,这里就涉及两个概念:

请求转发 和 重定向

请求转发会间接的由服务器去访问WEB-INF,所以可以访问,

重定向请求静态资源属于客户端进行请求,所以不能访问静态资源。

原文地址:https://www.cnblogs.com/Dm920/p/12152613.html

时间: 2024-08-03 00:43:03

SpringMVC - 静态资源放行的相关文章

spring mvc静态资源放行

方式一:在springmvc.xml中放行 1,全部资源放行 <!--springmvc.xml中添加--> <!-- 全部资源放行 --> <mvc:default-servlet-handler/> 2,选择部分资源放行 <!-- 静态资源放行 --> <mvc:resources location="/images/" mapping="/images/**"/> <mvc:resources

静态资源放行

<!-- 对静态资源放行  --> <mvc:resources location="/css/" mapping="/css/**"/> <mvc:resources location="/js/" mapping="/js/**"/> <mvc:resources location="/fonts/" mapping="/fonts/**"/

关于springmvc静态资源路径问题

web.xml配置,servlet-mapping的url-pattern设置成“/”,/就是指拦截所有的url,但不包括.jsp..html..js这样的文件. 因为根目录webapp下的所有静态资源在web.xml中设置了/导致被过滤,所以在springmvc的配置文件中进行配置,将这些静态资源交由dispatchservlet去处理,选择需要被放行的资源文件,springmvc进行配置: <mvc:default-servlet-handler/>是放行所有的静态资源文件,当然也可以用&

SpringMVC静态资源处理[转]

SpringMvc配置DispatchServlet对所有请求进行过滤: <servlet> <servlet-name>mvc-dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> <

springMvc静态资源拦截问题

测试的时候发现:如果直接访问web项目的html等静态资源,不能访问 原因如下: 当web.xml中url-pattern配置为"/"时,会导致系统中的静态资源被拦截 如何解决: 1)修改url-pattern    2)进行静态资源映射     3)开放tomcat的defaultServlet 我测试了解决方案2和3,做了如下的配置: web.xml: <!-- springmvc核心 --> <servlet> <servlet-name>sp

springmvc 静态资源 配置

SpringMVC提供<mvc:resources>来设置静态资源,但是增加该设置如果采用通配符的方式增加拦截器的话仍然会被拦截器拦截,可采用如下方案进行解决: 方案一.拦截器中增加针对静态资源不进行过滤(涉及spring-mvc.xml) 1 <mvc:resources location="/" mapping="/**/*.js"/> 2 <mvc:resources location="/" mapping=

SpringMVC静态资源拦截的问题

通常在web.xml中的核心控制器的DispatcherServlet中的url-pattern属性配置成类似“/”的拦截路径,但是会出现静态资源找不到的问题,比如js脚本.图片.css等无法加载,那么我们就需要进行一定的处理了: 1.配置web.xml 既然是web.xml搞得事,自然它本身就能处理,加入下面的节点即可 1 <servlet-mapping> 2 <servlet-name>springmvc</servlet-name> 3 <url-patt

配置静态资源放行的情况

<!--静态资源全部放行--> <mvc:default-servlet-handler></mvc:default-servlet-handler> 上面这一种替代下面的N种方法 <!--<mvc:resources mapping="/js/*" location="/js/"></mvc:resources>--> <!--<mvc:resources mapping=&quo

springmvc 静态资源访问的问题

<mvc:resources mapping="/images/**" location="/images/" cache-period="31556926"/> <mvc:resources mapping="/js/**" location="/js/" cache-period="31556926"/> <mvc:resources mapping=&