SpringMVC中处理静态资源的几种方式

简介: SpringMVC中处理静态资源的几种方式

【1】设置默认Servlet

即将DispatcherServlet请求映射设置为 / ,将会拦截所有的请求。注意哦,有可能不能访问静态资源。

<servlet>
    <servlet-name>spring</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring-servlet.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>spring</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

<mvc:default-servlet-handler/>

通常在SpringMVC的配置文件中配置如下标签配套使用(解决静态资源不能访问问题)

<mvc:default-servlet-handler/>

其XSD文档说明如下:

解释如下:

将在SpringMVC的上下文中定义一个DefaultServletHttpRequestHandler来处理静态资源(其实就是将请求转发给默认的servlet)。


配置一个handler通过转发请求到Servlet 容器的默认servlet来处理静态资源。使用该handler将会允许DispatcherServlet 的url-pattern为'/';同时使用Servlet 容器的默认servlet处理静态资源。该handler将会转发所有请求到默认servlet。因此将该handler的执行顺序放到所有请求处理的最后是非常重要的。如果您使用“annotation driven”标签,或者设置自定义HandlerMapping实例,则会出现这种情况。请确保将其“order”属性设置为低于DefaultServletHttpRequestHandler的值,即Integer.MAX_VALUE。一般WEB服务器默认的servlet的名称为default。若所使用的WEB服务器默认的Servlet名称不是default,则需要通过default-servlet-name 属性指定!



不同服务器下默认servlet名字

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


a96ecbe27db2fa8ff25c6a3c579efbf2.png

② Controller跳转失效

使用上述配置,你会发现正常的Controller跳转失效了!


XSD说明最后一段话说明,要么配置标签,要么手动注册请求映射处理bean于xml中,并设置order属性值小于DefaultServletHttpRequestHandler的order属性值!


常用的解决方式为配置标签,详情点击查看请求映射失效。

【2】url-pattern设置为*.do

解决静态资源的思路是,在SpringMVC.xml中,拦截设置为"*.do",而不是"/"。这样就不会拦截静态资源的请求。

需要注意的是,如果项目中用到了shiro或者其他权限框架。那么需要注意你的shiro.xml配置,示例如下:

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
     <!-- Shiro的核心安全接口,这个属性是必须的 -->
     <property name="securityManager" ref="securityManager"/>
     <!-- loginUrl认证提交地址,如果没有认证将会请求此地址进行认证,请求此地址将由formAuthenticationFilter进行表单认证 -->
     <property name="loginUrl" value="/login"/>
     <!-- Shiro连接约束配置,即过滤链的定义 -->
     <property name="filterChainDefinitions">
         <value>
             <!-- /** = anon所有url都可以匿名访问 -->
             <!-- 对静态资源设置匿名访问 -->
             /images/** = anon
             /js/** = anon
             /styles/** = anon
             <!-- 验证码,可匿名访问 -->
             /validateCode = anon  <!--验证码-->
             /doLogin = anon
             <!-- /** = authc 所有url都必须认证通过才可以访问 -->
             /**=authc
             <!--请求logout,shrio擦除sssion-->
             /logout=logout
         </value>
     </property>
 </bean>


需要注意的是虽然SpringMVC拦截的是.do,但是由于使用了shiro(或者你的其他权限框架),那么未登录情况下是不能直接访问除shiro配置文件里面允许匿名访问的路径之外的静态资源文件。


举个例子,你把静态资源文件放在了项目根目录,但是参考上面配置文件,显然不在匿名访问路径列表之内,所以会提示你先登录,登录之后才可访问项目根目录的静态资源文件。

未登录前访问项目根目录下1.jpg , 跳到登录页面:

登录后访问项目根目录下1.jpg :

另外,建议最好参考shiro配置文件,比如1.jpg放到images文件夹下,那么不用登录就可以直接访问。


【3】<mvc:resources />

通过配置,避免静态资源被拦截

<!-- 静态资源访问(不拦截此目录下的东西的访问) -->
<mvc:resources location="/js/" mapping="/js/**"/>
<mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/images/" mapping="/images/**"/>
<mvc:resources location="/bootstrap/" mapping="/bootstrap/**"/>

该标签的xsd说明文档如下:

  • 配置一个处理程序,用于为静态资源(如图像、js和css文件)提供服务,并使用优化的缓存头在web浏览器中高效加载。
  • 允许在通过Spring的资源处理可以访问的任何路径之外提供资源。


注册的handler如下:

org.springframework.web.servlet.resource.ResourceHttpRequestHandler

即,该标签注册ResourceHttpRequestHandler为静态资源的访问提供服务。


【4】<mvc:view-controller/>


确切说这里只解决不通过controller而直接访问jsp的问题。

直接访问view-name对应的jsp

jsp路径依据视图解析器配置实例

<!-- mvc:view-controller可使其直接访问路径 -->  
<mvc:view-controller path="/i18n" view-name="i18n"/>
<mvc:view-controller path="/i18n2" view-name="i18n2"/>

【5】在web.xml中作手动配置default servlet映射

在web.xml中作手动配置default servlet映射如下:

<servlet-mapping>
   <servlet-name>default</servlet-name>
   <url-pattern>*.css</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>*.mp4</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>*.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>*.html</url-pattern>
</servlet-mapping>
目录
相关文章
|
12月前
|
开发框架 前端开发 Java
【SpringMVC】入门、静态资源处理
Spring MVC 是一个基于 Java 的 Web 开发框架,它在构建 Web 应用程序时提供了良好的支持。,将应用程序的不同部分分离开来,使得开发更加在Spring MVC中,模型)表示应用程序的数据和业务逻辑,视图)负责渲染模型数据以生成最终的用户界面,控制器)接收来自用户的请求,并根据请求来调用相应的模型和视图。Spring MVC 提供了丰富的功能和特性,例如请求映射、请求参数绑定、数据校验、视图解析、拦截器、异常处理等。
|
前端开发 JavaScript Java
SpringMVC-访问静态资源
SpringMVC-访问静态资源
65 0
|
4月前
|
Java
springboot WebMvcConfigurer详解自定义配置请求静态资源
springboot WebMvcConfigurer详解自定义配置请求静态资源
119 0
|
4月前
|
缓存 前端开发 JavaScript
SpringBoot中静态资源映射处理
SpringBoot中静态资源映射处理
64 0
|
XML 前端开发 JavaScript
SpringBoot中静态资源访问
SpringBoot中静态资源访问
167 0
|
设计模式 开发框架 前端开发
springMVC的入门,学习,配置和静态资源访问问题的解决
# 引言 不知不觉,之前的文章生成器已经迎来了终章,这是网页版狗屁不通文章生成器的终章,也是狗屁不通文章生成器系列的最后一章。所以我决定精心打磨一下最后的终章部分,今天的更文我就写一个springMVC的学习部分。正好今天练习项目的开发在一些springMVC方面也是卡了很久。 # springMVC的简介 Spring MVC 是 Spring 提供的一个基于 MVC 设计模式的轻量级 Web 开发框架,本质上相当于 HttpServlet。一个Spring内置的MVC框架。与Spring有着很好的兼容。 而且SpringMVC比其他的很多 MVC 框架更具扩展性和灵活性。 # s
springMvc42-处理静态资源
springMvc42-处理静态资源
80 0
springMvc42-处理静态资源
|
前端开发
SpringMVC静态资源问题
SpringMVC静态资源问题
|
前端开发 JavaScript Java
SpringMVC - 配置不拦截静态资源
SpringMVC - 配置不拦截静态资源
369 0
SpringMVC - 配置不拦截静态资源
|
前端开发 Java Spring
【SpringMVC】SpringMVC基础-静态资源映射、拦截器配置、@ControllerAdvice与其他基本配置(2)
【SpringMVC】SpringMVC基础-静态资源映射、拦截器配置、@ControllerAdvice与其他基本配置
206 0
【SpringMVC】SpringMVC基础-静态资源映射、拦截器配置、@ControllerAdvice与其他基本配置(2)