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

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

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

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

有以下三个方法:

Action之前执行

public boolean preHandle(HttpServletRequest request,  

            HttpServletResponse response, Object handler)  

生成视图之前执行

​​​​​​​public void postHandle(HttpServletRequest request,  

            HttpServletResponse response, Object handler, ModelAndView modelAndView)  

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

 

​​​​​​​public void afterCompletion(HttpServletRequest request,  

            HttpServletResponse response, Object handler, Exception e)  

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

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

在postHandle中,有机会修改ModelAndView;

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

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

如何使用拦截器

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

​​​​​​​public class MyInterceptor implements HandlerInterceptor {...}  


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

一、拦截所有URL

​​​​​​​<mvc:interceptors>  
    <bean class="com.itmyhome.MyInterceptor" />  
</mvc:interceptors>  

二、拦截匹配的URL

<mvc:interceptors>  
    <mvc:interceptor>  
        <mvc:mapping path="/login" />  
        <bean class="com.itmyhome.MyInterceptor"></bean>  
    </mvc:interceptor>  
</mvc:interceptors>  

三、HandlerMappint上的拦截器

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">  
    <property name="interceptors">  
        <list>  
            <bean class="com.itmyhome.MyInterceptor"></bean>  
        </list>  
    </property>  
</bean>  

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

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

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

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

拦截器MyInterceptor类

import javax.servlet.http.HttpServletRequest;  

import javax.servlet.http.HttpServletResponse;  

import org.springframework.web.servlet.HandlerInterceptor;  

import org.springframework.web.servlet.ModelAndView;  

  

public class MyInterceptor implements HandlerInterceptor {  

  

    public void afterCompletion(HttpServletRequest request,  

            HttpServletResponse response, Object handler, Exception e)  

            throws Exception {  

        System.out.println("******afterCompletion******");  

  

    }  

  

    public void postHandle(HttpServletRequest request,  

            HttpServletResponse response, Object handler, ModelAndView arg3)  

            throws Exception {  

        System.out.println("******postHandle******");  

  

    }  

  

    /** 

     * 如果返回false 从当前拦截器往回执行所有拦截器的afterCompletion方法,再退回拦截器链 如果返回true 

     * 执行下一个拦截器,直到所有拦截器都执行完毕 再运行被拦截的Controller 

     * 然后进入拦截器链从最后一个拦截器往回运行所有拦截器的postHandle方法 

     * 接着依旧是从最后一个拦截器往回执行所有拦截器的afterCompletion方法 

     */  

    public boolean preHandle(HttpServletRequest request,  

            HttpServletResponse response, Object handler) throws Exception {  

        System.out.println("******preHandle******");  

        return true;  

    }  

}  

​​​​​​​spring配置文件

​​​​​​​<!-- 拦截所以URL  

<mvc:interceptors>  

    <bean class="com.itmyhome.MyInterceptor" />  

</mvc:interceptors>  

 -->  

 <!-- 拦截匹配URL -->  

<mvc:interceptors >  

    <mvc:interceptor>  

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

        <bean class="com.itmyhome.MyInterceptor"></bean>  

    </mvc:interceptor>  

</mvc:interceptors>  

  

<!-- HandlerMappint上的拦截器  

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">  

    <property name="interceptors">  

        <list>  

            <bean class="com.itmyhome.MyInterceptor"></bean>  

        </list>  

    </property>  

</bean>-->  

  

  

<!-- 默认扫描的包路径-->  

<context:component-scan base-package="com.itmyhome" />   

<!-- 添加注解驱动 -->  

<mvc:annotation-driven />  

  

<!-- 如果使用HandlerMappint拦截器则注释以上注册驱动的方法,使用以下人工配置bean -->  

<!--  <bean class="com.itmyhome.Login"></bean>-->  

  

<!-- 处理器 -->  

<bean name="/login" class="com.itmyhome.Login"></bean>  

  

<!-- HandlerMapping   

<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>-->  

<!-- HandlerAdapter   

<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>-->  

  

<!-- 定义跳转的文件的前后缀 -->  

<bean id="viewResolver"  

    class="org.springframework.web.servlet.view.InternalResourceViewResolver">  

    <property name="prefix" value="/" />  <!-- 默认放在WebRoot下 -->  

    <property name="suffix" value=".jsp" />   

</bean>  


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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沙漏无语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值