Spring MVC 4的Interceptor拦截器与Struts2的拦截器类似,其主要目的是对所有的URL请求进行拦截处理,处理某些规则的请求,如权限验证,判断用户是否登陆等。


    在Spring MVC 4中使用拦截器,必须先在Spring.xml中配置使用拦截器,配置的方法有两种:一种是传统的bean方式配置,另外一种是使用 http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd 定义的<mvc:interceptors>。具体实现代码如下:


    方案一:使用bean配置interceptors拦截器

<beans>
    <bean id="handlerMapping"
            class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
        <property name="interceptors">
            <list>
                <ref bean="loginInterceptor"/>
            </list>
        </property>
    </bean>

    <bean id="loginInterceptor" class="com.favccxx.favblog.interceptor.LoginInterceptor">
    </bean>
<beans>

   方法二: 使用<mvc:interceptors>配置拦截器,
<mvc:interceptors>
  <mvc:interceptor>
   <!-- 默认所有的请求都进行拦截 -->
   <mvc:mapping path="/*"/>
   <bean class="com.favccxx.favblog.interceptor.LoginInterceptor"></bean>
  </mvc:interceptor>
</mvc:interceptors>




无论采用哪种方式,实际上都采用了注解的方法,并继承了 AbstractHandlerMapping类将 interceptors 拦截器注入进去。AbstractHandlerMapping类的属性如下图所示:


spacer.gif


    在Spring MVC 4 中的类要实现拦截器处理映射必须要实现 org.springframework.web.servlet 包下的HandlerInterceptor接口,该接口定义了三个方法: preHandle(...)在处理器调用之前被调用; postHandle(...)在处理器调用之后执行;而afterCompletion(...)在请求结束之后调用。这三种方法提供了足够的灵活性来做各种各样的预处理和后处理。

    preHandle(...)方法会返回布尔值,可以使用该方法终止或继续执行的处理链。当返回true时,处理链继续执行。否则的话,DispatcherServlet会假设拦截器已经处理了请求(如渲染适当的视图),不再执行其它拦截器和当前的处理器。

    Spring MVC 4同样提供了两种方式实现拦截器,一种是实现HandlerInterceptor接口;另外一种是继承HandlerInterceptorAdapter类,不过HandlerInterceptorAdapter类也实现了HandlerInterceptor接口,所以归根结底还是如上文所述,拦截器必须实现HandlerInterceptor接口。


    实现拦截器
public class LoginInterceptor implements HandlerInterceptor {

public boolean preHandle(HttpServletRequest request,
   HttpServletResponse response, Object handler) throws Exception {
  // TODO Auto-generated method stub
  System.out.println("------" + System.nanoTime());
  return true;
}

public void afterCompletion(HttpServletRequest request,
   HttpServletResponse response, Object handler, Exception ex)
   throws Exception {
  // TODO Auto-generated method stub

}

public void postHandle(HttpServletRequest request,
   HttpServletResponse response, Object handler,
   ModelAndView modelAndView) throws Exception {
  FavUser favUser = (FavUser) (request.getSession()).getAttribute(SysConstants.USER_SESSION_KEY);
  if (favUser == null) {
   modelAndView.setViewName("redirect:/login");
  }
}

}