springMVC3学习(七)--Interceptor拦截器

来源:互联网 发布:win7 java环境变量配置 编辑:程序博客网 时间:2024/04/29 12:45

Spring为我们提供了:org.springframework.web.servlet.HandlerInterceptor接口,

org.springframework.web.servlet.handler.HandlerInterceptorAdapter适配器,

实现这个接口或继承此类,可以非常方便的实现自己的拦截器。

有以下三个方法:

Action之前执行

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public boolean preHandle(HttpServletRequest request,  
  2.             HttpServletResponse response, Object handler)  

生成视图之前执行

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public void postHandle(HttpServletRequest request,  
  2.             HttpServletResponse response, Object handler, ModelAndView modelAndView)  

最后执行,可用于释放资源

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public void afterCompletion(HttpServletRequest request,  
  2.             HttpServletResponse response, Object handler, Exception e)  

分别实现预处理、后处理(调用了Service并返回ModelAndView,但未进行页面渲染)、返回处理(已经渲染了页面)

在preHandle中,可以进行编码、安全控制等处理;

在postHandle中,有机会修改ModelAndView;

在afterCompletion中,可以根据ex是否为null判断是否发生了异常,进行日志记录。

参数中的Object handler是下一个拦截器。


如何使用拦截器

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

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public class MyInterceptor implements HandlerInterceptor {...}  

在springMVC的配置文件中配置有三种方法

一、拦截所有URL

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <mvc:interceptors>  
  2.     <bean class="com.itmyhome.MyInterceptor" />  
  3. </mvc:interceptors>  

二、拦截匹配的URL

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <mvc:interceptors>  
  2.     <mvc:interceptor>  
  3.         <mvc:mapping path="/login" />  
  4.         <bean class="com.itmyhome.MyInterceptor"></bean>  
  5.     </mvc:interceptor>  
  6. </mvc:interceptors>  

三、HandlerMappint上的拦截器

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">  
  2.     <property name="interceptors">  
  3.         <list>  
  4.             <bean class="com.itmyhome.MyInterceptor"></bean>  
  5.         </list>  
  6.     </property>  
  7. </bean>  

如果使用了<mvc:annotation-driven />, 它会自动注册DefaultAnnotationHandlerMapping 与

AnnotationMethodHandlerAdapter 这两个bean,所以就没有机会再给它注入interceptors属性,就无法指定拦截器。

当然我们可以通过人工配置上面的两个Bean,不使用 <mvc:annotation-driven />,

就可以给interceptors属性注入拦截器了。


拦截器MyInterceptor类

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. import javax.servlet.http.HttpServletRequest;  
  2. import javax.servlet.http.HttpServletResponse;  
  3. import org.springframework.web.servlet.HandlerInterceptor;  
  4. import org.springframework.web.servlet.ModelAndView;  
  5.   
  6. public class MyInterceptor implements HandlerInterceptor {  
  7.   
  8.     public void afterCompletion(HttpServletRequest request,  
  9.             HttpServletResponse response, Object handler, Exception e)  
  10.             throws Exception {  
  11.         System.out.println("******afterCompletion******");  
  12.   
  13.     }  
  14.   
  15.     public void postHandle(HttpServletRequest request,  
  16.             HttpServletResponse response, Object handler, ModelAndView arg3)  
  17.             throws Exception {  
  18.         System.out.println("******postHandle******");  
  19.   
  20.     }  
  21.   
  22.     /** 
  23.      * 如果返回false 从当前拦截器往回执行所有拦截器的afterCompletion方法,再退回拦截器链 如果返回true 
  24.      * 执行下一个拦截器,直到所有拦截器都执行完毕 再运行被拦截的Controller 
  25.      * 然后进入拦截器链从最后一个拦截器往回运行所有拦截器的postHandle方法 
  26.      * 接着依旧是从最后一个拦截器往回执行所有拦截器的afterCompletion方法 
  27.      */  
  28.     public boolean preHandle(HttpServletRequest request,  
  29.             HttpServletResponse response, Object handler) throws Exception {  
  30.         System.out.println("******preHandle******");  
  31.         return true;  
  32.     }  
  33. }  

spring配置文件

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <!-- 拦截所以URL  
  2. <mvc:interceptors>  
  3.     <bean class="com.itmyhome.MyInterceptor" />  
  4. </mvc:interceptors>  
  5.  -->  
  6.  <!-- 拦截匹配URL -->  
  7. <mvc:interceptors >  
  8.     <mvc:interceptor>  
  9.         <mvc:mapping path="/login" />  
  10.         <bean class="com.itmyhome.MyInterceptor"></bean>  
  11.     </mvc:interceptor>  
  12. </mvc:interceptors>  
  13.   
  14. <!-- HandlerMappint上的拦截器  
  15. <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">  
  16.     <property name="interceptors">  
  17.         <list>  
  18.             <bean class="com.itmyhome.MyInterceptor"></bean>  
  19.         </list>  
  20.     </property>  
  21. </bean>-->  
  22.   
  23.   
  24. <!-- 默认扫描的包路径-->  
  25. <context:component-scan base-package="com.itmyhome" />   
  26. <!-- 添加注解驱动 -->  
  27. <mvc:annotation-driven />  
  28.   
  29. <!-- 如果使用HandlerMappint拦截器则注释以上注册驱动的方法,使用以下人工配置bean -->  
  30. <!--  <bean class="com.itmyhome.Login"></bean>-->  
  31.   
  32. <!-- 处理器 -->  
  33. <bean name="/login" class="com.itmyhome.Login"></bean>  
  34.   
  35. <!-- HandlerMapping   
  36. <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>-->  
  37. <!-- HandlerAdapter   
  38. <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>-->  
  39.   
  40. <!-- 定义跳转的文件的前后缀 -->  
  41. <bean id="viewResolver"  
  42.     class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
  43.     <property name="prefix" value="/" />  <!-- 默认放在WebRoot下 -->  
  44.     <property name="suffix" value=".jsp" />   
  45. </bean>  

测试URL:http://localhost:8080/spring_Interceptor/login

查看后台会执行拦截器代码

项目源码下载:http://download.csdn.net/detail/itmyhome/7372023

0 0
原创粉丝点击