十、如何使用拦截器?

自定义一个拦截器,要实现HandlerInterceptor接口:

Java代码 

 收藏代码

  1. public class MyInteceptor implements HandlerInterceptor {     
  2.     略。。。  
  3. }    

 

Spring MVC并没有总的拦截器,不能对所有的请求进行前后拦截。
Spring MVC的拦截器,是属于HandlerMapping级别的,可以有多个HandlerMapping ,每个HandlerMapping可以有自己的拦截器。
当一个请求按Order值从小到大,顺序执行HandlerMapping接口的实现类时,哪一个先有返回,那就可以结束了,后面的HandlerMapping就不走了,本道工序就完成了。就转到下一道工序了。
拦截器会在什么时候执行呢? 一个请求交给一个HandlerMapping时,这个HandlerMapping先找有没有处理器来处理这个请求,如何找到了,就执行拦截器,执行完拦截后,交给目标处理器。
如果没有找到处理器,那么这个拦截器就不会被执行。

 


在spring MVC的配置文件中配置有三种方法:


方案一,(近似)总拦截器,拦截所有url

Java代码 

 收藏代码

  1.      
  2.       
  3.   

为什么叫“近似”,前面说了,Spring没有总的拦截器。

会为每一个HandlerMapping,注入一个拦截器。总有一个HandlerMapping是可以找到处理器的,最多也只找到一个处理器,所以这个拦截器总会被执行的。起到了总拦截器的作用。

如果是REST风格的URL,静态资源也会被拦截。

 

 
方案二, (近似) 总拦截器, 拦截匹配的URL。

Xml代码 

 收藏代码

  1.     
  2.       
  3.              
  4.             
  5.         
  6.     

就是比 方案一多了一个URL匹配。

如果是REST风格的URL,静态资源也会被拦截。

 

 

 

方案三,HandlerMappint上的拦截器。

如果是REST风格的URL,静态资源就不会被拦截。因为我们精准的注入了拦截器。

Xml代码 

 收藏代码

  1.        
  2.         
  3.             
  4.                
  5.             
  6.         
  7.    

  如果使用了, 它会自动注册DefaultAnnotationHandlerMapping 与AnnotationMethodHandlerAdapter 这两个bean,所以就没有机会再给它注入interceptors属性,就无法指定拦截器。

当然我们可以通过人工配置上面的两个Bean,不使用 ,就可以 给interceptors属性 注入拦截器了。

 

其实我也不建议使用 ,而建议手动写详细的配置文件,来替代,这就控制力就强了。

如何替换 ?他到底做了什么工作,请看,最后面的 十九节  到底做了什么工作。

转载请注明出处:原文地址:http://elf8848.iteye.com/blog/875830

 

 

你可能感兴趣的:(SpringMVC运行原理)