什么是拦截器

SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。但又不同于过滤器,拦截器是AOP思想的具体实现。

  • 过滤器:servlet规范中的一部分,任何java web工程都可以使用,在url-pattern中配置了/*之后,可以对所有要访问的资源进行拦截
  • 拦截器:SpringMVC框架特有的,只有使用了SpringMVC框架的工程才能使用,拦截器只拦截走到controller控制器的请求。静态资源不会拦截(jsp,html,css,js,image...)

实现拦截器

要实现拦截器,就要实现HandlerInterceptor接口,重写接口的三个方法,一般只需要preHandle方法足够了,在处理器调用前作用

public class MyInterceptor implements HandlerInterceptor {

   //在请求处理的方法之前执行
   //如果返回true执行下一个拦截器
   //如果返回false就不执行下一个拦截器,直接在这里卡死。
   public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
       System.out.println("------------处理前------------");
       return true;
  }

   //在请求处理方法执行之后执行
   public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
       System.out.println("------------处理后------------");
  }

   //在dispatcherServlet处理后执行,做清理工作.
   public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
       System.out.println("------------清理------------");
  }
}

配置Spring-mvc.xml 注册拦截器

<!--关于拦截器的配置-->
<mvc:interceptors>
   <mvc:interceptor>
       <!--/** 包括路径及其子路径-->
       <!--/admin/* 拦截的是/admin/add等等这种 , /admin/add/user不会被拦截-->
       <!--/admin/** 拦截的是/admin/下的所有路径,包括子路径的子路径...-->
       <mvc:mapping path="/**"/>
       <!--bean配置的就是拦截器-->
       <bean class="top.hcode.interceptor.MyInterceptor"/>
   </mvc:interceptor>
</mvc:interceptors>

总结

拦截器是AOP横切的具体实现,可用于登录验证等。

评论