您的位置:首页 > 编程语言 > Java开发

springMVC3学习--Interceptor拦截器

2014-05-22 18:00 417 查看
Spring为我们提供了:org.springframework.web.servlet.HandlerInterceptor接口,

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

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

有以下三个方法:

Action之前执行

[java] view
plaincopy





public boolean preHandle(HttpServletRequest request,

HttpServletResponse response, Object handler)

生成视图之前执行

[java] view
plaincopy





public void postHandle(HttpServletRequest request,

HttpServletResponse response, Object handler, ModelAndView modelAndView)

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

[java] view
plaincopy





public void afterCompletion(HttpServletRequest request,

HttpServletResponse response, Object handler, Exception e)

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

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

在postHandle中,有机会修改ModelAndView;

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

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

如何使用拦截器

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

[java] view
plaincopy





public class MyInterceptor implements HandlerInterceptor {...}

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

一、拦截所有URL

[html] view
plaincopy





<mvc:interceptors>

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

</mvc:interceptors>

二、拦截匹配的URL

[html] view
plaincopy





<mvc:interceptors>

<mvc:interceptor>

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

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

</mvc:interceptor>

</mvc:interceptors>

三、HandlerMappint上的拦截器

[html] view
plaincopy





<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类

[java] view
plaincopy





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配置文件

[html] view
plaincopy





<!-- 拦截所以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

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

项目源码下载:http://download.csdn.net/detail/itmyhome/7372023
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: