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

 更新时间:2017年01月20日 16:13:24   作者:wei906  
本篇文章主要介绍了详解springmvc拦截器拦截静态资源,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。

springmvc拦截器interceptors

springmvc拦截器能够对请求的资源路径进行拦截,极大的简化了拦截器的书写。但是,千万千万要注意一点:静态资源的放行。

上代码:

<mvc:resources mapping="/resources/**" location="/static/resources" /> 
  <mvc:resources mapping="/static/css/**" location="/static/css/" /> 
  <mvc:resources mapping="/static/images/**" location="/static/images/" /> 
  <mvc:resources mapping="/static/js/**" location="/static/js/" /> 
<mvc:interceptors> 
    <!-- 使用bean定义一个Interceptor,直接定义在mvc:interceptors根下面的Interceptor将拦截所有的请求  
    <bean class="com.myTree.interceptor.LoginInterceptor" />--> 
    <mvc:interceptor> 
      <mvc:mapping path="/**" /> 
      <!-- 需排除拦截的地址 -->  
      <mvc:exclude-mapping path="/Login"/>  
      <mvc:exclude-mapping path="/login"/>  
      <mvc:exclude-mapping path="/sattic/**"/>  
      <!-- 定义在mvc:interceptor下面的表示是对特定的请求才进行拦截的 --> 
      <beans:bean class="com.myTree.interceptor.LoginInterceptor" > 
      </beans:bean> 
    </mvc:interceptor> 
  </mvc:interceptors> 

问题来了,在请求jsp页面的时候,你的静态资源的访问仍然会被自定义拦截器拦截,这会导致程序运行的效率大大下降,还会不停的跳转到拦截器的逻辑。主要原因是

<mvc:mapping path="/**" /> 

会对所有的请求资源进行拦截,虽然静态资源已经排除了,但还是会被拦截到。

如何解决这个bug呢?

主要有三种方式:

1、修改请求的url地址。

 如果请求的url地址都是以*.do结尾,那么拦截器中的配置可以变为拦截以do结尾的资源,静态资源自然就不会被拦截到了;
2、在自定义拦截器中对资源进行判断,如果满足需要排除的资源,就进行放行。

<!-- 拦截器配置 -->  
  <mvc:interceptors>  
   <!-- session超时 -->  
   <mvc:interceptor>  
    <mvc:mapping path="/*/*"/>  
    <bean class="com.myTree.interceptor.LoginInterceptor">  
     <property name="allowUrls">  
      <list>  
       <!-- 如果请求中包含以下路径,则不进行拦截 -->  
       <value>/login</value>  
       <value>/js</value>  
       <value>/css</value>  
       <value>/image</value>  
       <value>/images</value>  
      </list>  
     </property>  
    </bean>  
   </mvc:interceptor>  
  </mvc:interceptors>  

在拦截器中设定不拦截的属性: 

/** 
 * 处理登录拦截器 
 */  
public class LoginInterceptor implements HandlerInterceptor{  
    
  public String[] allowUrls;//还没发现可以直接配置不拦截的资源,所以在代码里面来排除  
    
  public void setAllowUrls(String[] allowUrls) {  
    this.allowUrls = allowUrls;  
  }  
  
  @Override  
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response,  
      Object handler) throws Exception {<pre name="code" class="java"> <span style="white-space:pre"> </span>String requestUrl = request.getRequestURI().replace(request.getContextPath(), "");   
    System.out.println(requestUrl);  
    if(null != allowUrls && allowUrls.length>=1){  
      for(String url : allowUrls) {   
        if(requestUrl.contains(url)) {   
          return true;   
        }   
      } 
} 

3、设置web.xml中的默认拦截器,不拦截静态资源

在springmvc的Dispatcher中配置<mvc:default-servlet-handler />(一般Web应用服务器默认的Servlet名称是"default",所以这里我们激活Tomcat的defaultServlet来处理静态文件,在web.xml里配置如下代码即可:)

<!--该servlet为tomcat,jetty等容器提供,将静态资源映射从/改为/static/目录,如原来访问http://localhost/foo.css,现在http://localhost/static/foo.css -->  
<!-- 不拦截静态文件 -->  
<servlet-mapping>  
  <servlet-name>default</servlet-name>  
  <url-pattern>/js/*</url-pattern>  
  <url-pattern>/css/*</url-pattern>  
  <url-pattern>/images/*</url-pattern>  
  <url-pattern>/fonts/*</url-pattern>  
</servlet-mapping>  

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • java合并多个文件的实例代码

    java合并多个文件的实例代码

    在本篇文章里小编给大家整理的是关于java合并多个文件的实例代码,有需要的朋友们可以参考学习下。
    2020-02-02
  • Java8函数式接口UnaryOperator用法示例

    Java8函数式接口UnaryOperator用法示例

    这篇文章主要介绍了Java8函数式接口UnaryOperator用法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Spring BeanUtils忽略空值拷贝的方法示例代码

    Spring BeanUtils忽略空值拷贝的方法示例代码

    本文用示例介绍Spring(SpringBoot)如何使用BeanUtils拷贝对象属性忽略空置,忽略null值拷贝属性的用法,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2022-03-03
  • Java大文本并行计算实现过程解析

    Java大文本并行计算实现过程解析

    这篇文章主要介绍了Java大文本并行计算如何实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • SpringBoot中@RestControllerAdvice @ExceptionHandler异常统一处理类失效原因分析

    SpringBoot中@RestControllerAdvice @ExceptionHandler异常统一处

    这篇文章主要介绍了SpringBoot中@RestControllerAdvice @ExceptionHandler异常统一处理类失效原因,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Java 配置log 将日志信息输出到指定日志文件中

    Java 配置log 将日志信息输出到指定日志文件中

    这篇文章主要介绍了Java 配置log 将日志信息输出到指定日志文件中,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • Struts中action线程安全问题解析

    Struts中action线程安全问题解析

    这篇文章主要介绍了Struts中action线程安全问题解析,涉及实例代码,还是挺不错的,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10
  • 关于SpringCloudStream配置问题

    关于SpringCloudStream配置问题

    这篇文章主要介绍了关于SpringCloudStream配置问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • 浅谈Java中的class类

    浅谈Java中的class类

    这篇文章主要介绍了浅谈Java中的class类,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • 关于jackson序列化和feign返回值的问题

    关于jackson序列化和feign返回值的问题

    这篇文章主要介绍了关于jackson序列化和feign返回值的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03

最新评论