`

Spring MVC 静态资源的访问

阅读更多
问题描述:
    我们在spring mvc框架中为了是URL更符合RESTful风格,通常在web.xml中会配置spring框架servlet 的 url 拦截为  "/"  ,也就是拦截所有资源的url请求,这样一来,所有的资源包括, js  | css |  图片  |  所有静态资源都将经过框架的servlet拦截。不应该是这样的。所以有了对应servlet的url拦截为“/”的时候,对静态资源访问不应该经过servlet拦截的问题处理。如果  servlet-mapping  的 url-pattern  为  “*.do”,就是只拦截有一定后缀的url,那么就不会有静态资源访问的问题了。


一、spring mvc 下默认访问的三种方式

1>.第一种   访问tomcat容器的默认页面
<welcome-file-list> 
  <welcome-file>/index.html</welcome-file> 
</welcome-file-list>

这种方式通常用来访问我们的初始页面
2>.第二种   spirng mvc 默认index controller 方式
(如果在tomcat容器没有配置默认页面,怎spring mvc 会主动去寻找/index的controller,如果有则会调用,没有则会显示404页面)
@RequestMapping(value="/index")
public ModelAndView index(HttpServletRequest request, HttpServletResponse response){
       return new ModelAndView("index");
}

3>.第三种   spirng mvc 配置根节点访问“/”方式
@RequestMapping(value="/") 
public ModelAndView index(HttpServletRequest request,HttpServletResponse response){ 
         return new ModelAndView("index"); 
}

或者
<mvc:view-controller path="/" view-name="home"/>

This is a shortcut for defining a ParameterizableViewController that immediately forwards to a view when invoked.

三种方法优先级别是  1>3>2

二、spring mvc 使用RESTFull 的url风格拦截所有资源请求时的静态资源的访问配置,避免被spring mvc框架的匹配,因为这是没有必要的,可恶的。

.如果spring mvc框架的servlet-mapping的url-pattern为 “/”  ,若我们没有处理静态资源,就会造成静态资源的访问出现  404

解决方案:
1>.激活web应用服务器(如Tomcat)的defaultServlet来处理静态文件
 <servlet-mapping>
		<servlet-name>default</servlet-name>
		<url-pattern>*.jpg</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>

要配置多个,每种文件配置一个  
要写在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"

2>.在spring3.0.4以后版本提供了  <mvc:resources />
<mvc:resources mapping="/static/**" location="/static/" />

/static/**映射到 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.

3>.使用<mvc:default-servlet-handler/>
<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 是匹配"/**"的,所以一定会匹配上,再响应图片。

加载一个静态资源是却要经过框架servlet的层层pattern,不必要的性能开销。
最后还是特别强调,像一开始说的,如果框架servlet的url-pattern是指定后缀的,如 “*.go” ,那么框架的url拦截就只会匹配后缀带 .go  的request,就不会有静态资源访问的问题了。
分享到:
评论

相关推荐

    springmvc静态资源访问

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

    Spring MVC和springboot静态资源处理.rar

    在Java Web开发中,Spring MVC和Spring Boot是两个非常重要的框架,它们都提供了对静态资源的处理机制。静态资源通常包括HTML、CSS、JavaScript、图片等文件,是构成Web应用程序用户体验的重要部分。本篇文章将详细...

    Spring MVC 教程快速入门 深入分析

    七、Spring MVC如何访问到静态的文件:描述了如何配置Spring MVC来处理静态资源,如图片、JavaScript和CSS文件等。 八、Spring MVC请求如何映射到具体的Action中的方法:说明了如何配置映射器(HandlerMapping)将...

    狂神说SpringSecurity静态资源.rar

    SpringSecurity提供了CORS配置,确保只有特定来源的请求能够访问资源,防止跨站请求伪造(CSRF)攻击。 3. **CSRF防护**:SpringSecurity默认开启CSRF防护,对于需要用户交互的HTTP方法(如POST、PUT、DELETE),会...

    基本的spring mvc + spring security实现的登录(无数据库)

    - 接下来的请求会被Spring Security的权限检查,根据AccessDecisionManager决定是否允许访问资源。 4. **STS(Spring Tool Suite)**: - **集成开发环境**:STS是Eclipse的扩展,专为Spring开发提供了一系列工具,...

    Spring mvc 教程

    ### Spring MVC 教程知识点详解 #### Spring Web MVC 框架简介 Spring Web MVC 是 Spring Framework 的一个重要组成部分,主要用于构建基于 Java 的 Web 应用程序。它提供了一个灵活且强大的 MVC 实现,使得开发者...

    spring mvc restful service

    5. **项目结构**:一个典型的Spring MVC Maven项目结构包括`src/main/java`(存放源代码)、`src/main/resources`(存放配置文件和静态资源)、`src/main/webapp/WEB-INF`(存放`web.xml`配置文件)等。 6. **配置...

    Spring+Spring MVC+Spring JDBC+MySql实现简单登录注册

    在本项目中,我们主要利用Spring框架,包括其核心模块Spring、MVC模块Spring MVC以及数据访问/集成模块Spring JDBC,结合MySQL数据库来构建一个基础的登录注册系统。以下是这个项目涉及的关键技术点: 1. **Spring...

    Spring MVC入门教程

    七、spring mvc 如何访问到静态的文件,如jpg,js,css? 八、spring mvc 请求如何映射到具体的Action中的方法? 九、spring mvc 中的拦截器: 十、spring mvc 如何使用拦截器? 十一、spring mvc 如何实现全局的异常...

    第四章 Spring MVC Rest风格的url、静态资源标签

    在本章中,我们将深入探讨Spring MVC框架中的RESTful风格URL设计以及如何处理静态资源。REST(Representational State Transfer)是一种软件架构风格,常用于Web服务设计,它强调通过HTTP方法(如GET、POST、PUT、...

    Spring MVC 教程 快速入门 深入分析

    七、spring mvc 如何访问到静态的文件,如jpg,js,css? 八、spring mvc 请求如何映射到具体的Action中的方法? 九、spring mvc 中的拦截器: 十、spring mvc 如何使用拦截器? 十一、spring mvc 如何实现全局的异常...

    spring mvc

    - **权限验证**:检查用户是否具有访问资源的权限。 - **记录日志**:记录请求和响应的信息。 - **预处理**:对请求进行预处理,例如数据转换等。 #### 十、Spring MVC 拦截器的使用 在 Spring MVC 中使用拦截器...

    Spring MVC框架简介和使用

    - **静态资源管理**:支持静态资源(如 CSS、JavaScript 文件)的管理。 - **RESTful 风格的支持**:易于构建符合 RESTful 设计原则的应用程序。 ### 简单的 HelloWorld 实现 为了展示如何使用 Spring MVC 构建一...

    spring mvc+spring+maven框架项目,纯净项目

    4. **src/main/webapp**: Web应用目录,包含静态资源(如HTML、CSS、JavaScript)、WEB-INF下的web.xml(Web应用部署描述符)以及Spring MVC的视图解析路径。 5. **src/test**: 测试代码目录,使用JUnit进行单元测试...

    spring mvc demo下载地址

    4. **WebContent目录**:通常包含Web应用的静态资源,如HTML、CSS、JavaScript文件,以及Spring MVC的视图解析路径,如JSP或Thymeleaf模板。 5. **src目录**:源代码目录,包括Java源文件和可能的资源文件。在...

    spring mvc项目创建

    3. **创建目录结构**:按照 Maven 的标准目录结构,创建 `src/main/java`(存放源代码)、`src/main/resources`(存放配置文件)和 `src/main/webapp`(存放静态资源和 WEB-INF 文件夹)。 4. **配置 ...

    spring mvc mybatis velocity 示范

    Spring MVC、MyBatis 和 Velocity 是三个在Java Web开发中广泛应用的开源框架。Spring MVC 是Spring框架的一部分,用于构建高效、灵活的Web应用程序。MyBatis 是一个优秀的持久层框架,它支持定制化SQL、存储过程...

    spring mvc_04

    在本教程"spring mvc_04"中,我们将深入探讨如何使用MultiActionController来实现静态资源的访问。尽管在现代Spring MVC应用中,我们通常会推荐使用基于注解的@Controller或@RestController,但理解...

    jQuery Spring MVC

    1. **引入依赖**:在项目中添加jqGrid的JavaScript和CSS资源,通常通过CDN或者本地静态资源引用。 2. **配置视图解析**:在Spring MVC配置中,设置视图解析器支持JSP或Thymeleaf等模板引擎。 3. **创建控制器**:...

Global site tag (gtag.js) - Google Analytics