一、拦截器介绍
============
(1)拦截器概念介绍
拦截器(Interceptor)是Spring的核心功能之一,它可以在用户请求Action的之前或之后进行一些业务处理。
很多从ASP.NET转过来的开发人员把它叫做过滤器。
(2)拦截器方法执行顺序
按照拦截器的执行前后顺序依次为:preHandle、postHandle、afterCompletion。
preHandle:该方法将在请求处理之前执行。
postHandle:该方法在Action执行后,DispatcherServlet返回视图之前执行。
afterCompletion:该方法在整个请求结束之后执行,这个方法主要作用是用于资源清理工作。
(3)拦截器的类型
拦截器按照拦截范围,分为全局拦截器和局部拦截器。
全局拦截器拦截所有请求,局部拦截器只拦截特定请求。
二、开发拦截器步骤
(1)定义拦截器实现类
首先定义一个拦截器的实现类。
(2)实现拦截接口
HandlerInterceptor接口或WebRequestInterceptor接口,任意实现一个接口都可以,这两个接口都包括三个方法:preHandle、postHandle、afterCompletion。
我们可以根据实际情况做不同的实现。
(3)注册拦截器
注册全局拦截器
1<mvc:interceptors> 2 <bean class="包名.拦截器实现类的类名" /> 3</mvc:interceptors>
注册局部拦截器
1<mvc:interceptors> 2 <mvc:interceptor> 3 <mvc:mapping path="/Controller/action"> 4 <bean class="包名.类名" /> 5 </mvc:mapping> 6 </mvc:interceptor> 7</mvc:interceptors>
三、实现注解式权限验证步骤
=================
在Spring MVC中,可以通过在Action方法上加拦截器注解的方式来确定是否拦截。这种应用很普遍。
接下来我们来实现这种应用。
(1)添加自定义注解
1package com.uni2uni.interceptor; 2 3import java.lang.annotation.Documented; 4import java.lang.annotation.ElementType; 5import java.lang.annotation.Inherited; 6import java.lang.annotation.Retention; 7import java.lang.annotation.RetentionPolicy; 8import java.lang.annotation.Target; 9 10@Documented 11@Inherited 12@Target(ElementType.METHOD) 13@Retention(RetentionPolicy.RUNTIME) 14public @interface Auth { 15 boolean validate() default true; 16}
(2)实现自定义拦截器
1package com.uni2uni.interceptor; 2import javax.servlet.http.HttpServletRequest; 3import javax.servlet.http.HttpServletResponse; 4import javax.servlet.http.HttpServletRequest; 5import javax.servlet.http.HttpServletResponse; 6import org.springframework.web.method.HandlerMethod; 7import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; 8public class AuthInterceptor extends HandlerInterceptorAdapter { 9 @Override 10 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 11 12 if(handler.getClass().isAssignableFrom(HandlerMethod.class)){ 13 AuthPassport authPassport = ((HandlerMethod) handler).getMethodAnnotation(AuthPassport.class); 14 15 //没有声明注解,或者声明不验证权限 16 if(authPassport == null || authPassport.validate() == false) 17 return true; 18 else{ 19 //在这里实现自己的权限验证逻辑 20 if(false)//如果验证成功返回true(这里直接写false来模拟验证失败的处理) 21 return true; 22 else//如果验证失败 23 { 24 //返回到登录界面 25 response.sendRedirect("account/login"); 26 return false; 27 } 28 } 29 } 30 else 31 return true; 32 } 33}
(3)注册自定义拦截器
springMVC.xml中配置拦截器代码如下所示:
1<mvc:interceptors> 2 <!-- 国际化操作拦截器 如果采用基于(请求/Session/Cookie)则必需配置 --> 3 <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" /> 4 <!-- 如果不定义 mvc:mapping path 将拦截所有的URL请求 --> 5 <bean class="com.uni2uni.interceptor.AuthInterceptor"></bean> 6</mvc:interceptors>
(4)在Action上添加拦截器注解
1 @AuthPassport 2 @RequestMapping(value={"/demo1-post"}) 3 public ModelAndView demo1(){ 4 ModelAndView modelAndView= new ModelAndView(); 5 modelAndView.setViewName("demo1-post"); 6 7 return modelAndView; 8 }
四、Demo下载
============
本Demo实现了一个简单的自定义拦截器,如下图所示:

Demo下载:http://pan.baidu.com/s/1eQd4SD0
五、知识扩展
==============
(1)拦截器执行顺序
拦截器是执行是按照配置的先后顺序执行的。