`

springmvc对静态资源的访问

 
阅读更多

在web.xml文件中经常看到这样的配置<servlet-name>default</servlet-name>,这个配置的作用是:对客户端请求的静态资源如图片、JS文件等的请求交由默认的servlet进行处理,如下所示:

<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.png</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.gif</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.ico</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.gif</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>

下面是从http://elf8848.iteye.com/blog/875830中摘录的一些资料

 

如何你的DispatcherServlet拦截"*.do"这样的有后缀的URL,就不存在访问不到静态资源的问题。

如果你的DispatcherServlet拦截"/",为了实现REST风格,拦截了所有的请求,那么同时对*.js,*.jpg等静态文件的访问也就被拦截了。

我们要解决这个问题。

 

目的:可以正常访问静态文件,不可以找不到静态文件报404。

 
方案一:激活Tomcat的defaultServlet来处理静态文件

Xml代码  收藏代码
  1. <servlet-mapping>   
  2.     <servlet-name>default</servlet-name>  
  3.     <url-pattern>*.jpg</url-pattern>     
  4. </servlet-mapping>    
  5. <servlet-mapping>       
  6.     <servlet-name>default</servlet-name>    
  7.     <url-pattern>*.js</url-pattern>    
  8. </servlet-mapping>    
  9. <servlet-mapping>        
  10.     <servlet-name>default</servlet-name>       
  11.     <url-pattern>*.css</url-pattern>      
  12. </servlet-mapping>    
  13. 要配置多个,每种文件配置一个   

要写在DispatcherServlet的前面, 让 defaultServlet先拦截请求,这样请求就不会进入Spring了,我想性能是最好的吧。

 

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

 

 


方案二: 在spring3.0.4以后版本提供了mvc:resources ,  使用方法:

Xml代码  收藏代码
  1. <!-- 对静态资源文件的访问 -->    
  2. <mvc:resources mapping="/images/**" location="/images/" />  

  
/images/**映射到ResourceHttpRequestHandler进行处理,location指定静态资源的位置.可以是web application根目录下、jar包里面,这样可以把静态资源压缩到jar包中。cache-period 可以使得静态资源进行web cache 
 
如果出现下面的错误,可能是没有配置<mvc:annotation-driven />的原因。 
报错WARNING: No mapping found for HTTP request with URI [/mvc/user/findUser/lisi/770] in DispatcherServlet with name 'springMVC'

 

使用<mvc:resources/>元素,把mapping的URI注册到SimpleUrlHandlerMapping的urlMap中,
key为mapping的URI pattern值,而value为ResourceHttpRequestHandler,
这样就巧妙的把对静态资源的访问由HandlerMapping转到ResourceHttpRequestHandler处理并返回,所以就支持classpath目录,jar包内静态资源的访问.
另外需要注意的一点是,不要对SimpleUrlHandlerMapping设置defaultHandler.因为对static uri的defaultHandler就是ResourceHttpRequestHandler,
否则无法处理static resources request.

 

 

方案三 ,使用<mvc:default-servlet-handler/>

Xml代码  收藏代码
  1. <mvc:default-servlet-handler/>  

 

会把"/**" url,注册到SimpleUrlHandlerMapping的urlMap中,把对静态资源的访问由HandlerMapping转到org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler处理并返回.
DefaultServletHttpRequestHandler使用就是各个Servlet容器自己的默认Servlet.

 

 

补充说明:多个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 是匹配 "/**"的,所以一定会匹配上,就可以响应图片。

 

 

访问一个图片,还要走层层匹配。不知性能如何?

最后再说明一下,方案二、方案三 在访问静态资源时,如果有匹配的(近似)总拦截器,就会走拦截器。如果你在拦截中实现权限检查,要注意过滤这些对静态文件的请求。

如何你的DispatcherServlet拦截 *.do这样的URL后缀,就不存上述问题了。还是有后缀方便。

分享到:
评论

相关推荐

    SpringMVC访问静态资源

    在Spring MVC框架中,处理动态请求是其核心功能,但同时它也需要支持对静态资源的访问,例如HTML、CSS、JavaScript、图片等。这些静态资源是构建用户界面必不可少的部分,通常用于提供页面布局、样式和交互逻辑。在...

    防止SpringMVC拦截器拦截js等静态资源文件的解决方法

    在本文中,我们讨论了三种解决SpringMVC拦截器拦截静态资源文件的方法,并对这些方法的优劣进行了分析。 方案一是在拦截器中排除静态资源路径。在SpringMVC的配置文件中(通常是spring-mvc.xml),可以通过配置元素...

    springmvc静态资源访问

    ### Spring MVC 中静态资源访问详解 #### 一、引言 在Web开发中,静态资源如CSS、JavaScript、图片等是构建用户界面不可或缺的一部分。Spring MVC作为一款流行的Java Web框架,提供了灵活的方式来处理这些静态资源...

    springmvc如何访问静态资源

    该txt文档主要讲了在利用springmvc框架来搭建项目时有什么方法可以访问静态资源。

    SpringMVC访问静态资源的方法

    本文将介绍如何在SpringMVC中配置访问静态资源。 首先,我们需要了解SpringMVC的默认配置。在`web.xml`文件中,`DispatcherServlet`通常被配置为监听所有URL模式(例如,`&lt;url-pattern&gt;/&lt;/url-pattern&gt;`),这意味...

    SpringMvc静态资源访问实现方法代码实例

    SpringMvc静态资源访问实现方法代码实例 SpringMvc静态资源访问实现方法代码实例介绍了如何在SpringMvc框架中访问静态资源的方法代码实例。该实例通过示例代码详细介绍了如何配置SpringMvc来访问静态资源,从而为...

    SpringMVC访问静态资源的三种方式小结

    方案一适用于希望完全控制静态资源处理的情况,方案二适用于需要在Spring MVC内管理静态资源的场景,而方案三则提供了一种简洁的解决方案,不需要对每种静态资源类型进行显式配置。理解并灵活运用这些方法,可以提高...

    springmvc-demo03-静态资源访问处理.zip

    对于安全性,我们可以通过Spring Security来限制对某些静态资源的访问。例如,禁止未登录用户访问特定的CSS或JavaScript文件: ```java @Configuration @EnableWebSecurity public class SecurityConfig extends ...

    springMVC静态资源

    然而,有时我们可能需要自定义静态资源的路径或者对静态资源的处理方式进行调整。这可以通过在Spring MVC的配置类中添加`WebMvcConfigurer`接口的实现来完成。例如,我们可以在`addResourceHandlers`方法中指定额外...

    SpringMVC专栏8、RESTful案例static静态资源

    在Spring MVC中,`/static`是默认的静态资源目录,当浏览器发起对这些静态资源的请求时,Spring MVC会自动处理并返回相应的文件。 1. **配置静态资源**: 在Spring MVC的配置中,我们可以通过`...

    SSM笔记-SpringMVC的CRUD和静态资源

    SpringMVC默认不处理静态资源(如CSS、JavaScript、图片等),为了使这些资源正常访问,我们需要在`web.xml`或`DispatcherServlet`的配置中添加映射规则。 ```xml &lt;!-- web.xml --&gt; &lt;servlet-name&gt;dispatcher ...

    详解SpringMVC中设置静态资源不被拦截的问题

    此外,还可以考虑使用Spring Security等安全框架,它们提供了更灵活的控制方式,可以针对静态资源设定特殊的访问规则,而无需在拦截器中处理。 总的来说,Spring MVC中处理静态资源不被拦截的关键在于正确配置静态...

    详解springmvc拦截器拦截静态资源

    为了确保静态资源能够正常访问,我们需要在 Spring MVC 的配置中明确指定它们的映射路径,如下所示: ```xml **" location="/static/resources" /&gt; **" location="/static/css/" /&gt; **" location="/static/images/...

    SpringMVC使用的Swagger UI静态资源

    **Spring MVC 使用 Swagger UI 静态资源** Swagger 是一个强大的工具,专为 RESTful API 设计,它允许开发者通过 YAML 或 JSON 语言编写接口定义,进而生成清晰、交互式的文档,同时支持代码生成,方便客户端和...

    SpringMVC访问图片

    在`web.xml`中,可以通过`&lt;servlet-mapping&gt;`元素配置DispatcherServlet,让其排除对静态资源的处理,例如: ```xml &lt;servlet-name&gt;dispatcher &lt;url-pattern&gt;/ &lt;!-- 静态资源过滤器 --&gt; &lt;filter-name&gt;...

    smbms静态资源.zip

    在实际开发中,静态资源通常会被部署到Web服务器的公共目录下,以便浏览器可以直接访问。开发过程中,开发者可能使用诸如Webpack、Gulp等工具进行资源打包和优化,合并多个CSS或JS文件,减少HTTP请求,提高加载速度...

    SpringMVC如何在生产环境禁用Swagger的方法

    但是,在生产环境中,Swagger 可能会带来一些安全隐患,因为它提供了对 API 的访问入口。因此,在生产环境中,我们需要禁用 Swagger,以保护我们的 API。 要禁用 Swagger,我们可以使用 SpringBoot 的配置类来...

    springMVC3学习(四)--访问静态文件如js,jpg,css(源码)

    springMVC3学习(四)--访问静态文件如js,jpg,css(源码) 文章地址:http://blog.csdn.net/itmyhome1990/article/details/25987411

    SpringBoot静态资源处理共5页.pdf.zip

    在SpringBoot中,静态资源的处理默认由SpringMVC的`ResourceHandlerRegistry`进行。以下是一些关键知识点: 1. **默认配置**:SpringBoot默认将`src/main/resources/static`、`src/main/resources/public`或`src/...

    SpringMVC_staticpage

    3. **静态资源处理**: SpringMVC可以通过配置允许直接访问项目中的静态资源目录,如`/static`, `/resources`等,这样可以直接返回静态HTML文件。 4. **预渲染(Prerendering)**: 当动态内容需要转化为静态页面时,...

Global site tag (gtag.js) - Google Analytics