拦截器从功能的角度来讲和过滤器(Filter)类似,但有本质区别
FIlter是Servlet规范的一部分,能够拦截任意请求,常用于设置编码、登录验证等。
拦截器属于SpringMVC规范的一部分,只能拦截DIspatcherServlet拦截到的内容,一般拦截Controller,所以经常用于抽取公共代码。

使用方式

自定义拦截器实现HandlerInterceptor接口

  1. import org.springframework.lang.Nullable;
  2. import org.springframework.web.servlet.HandlerInterceptor;
  3. import org.springframework.web.servlet.ModelAndView;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. public class MyInterceptor implements HandlerInterceptor {
  7. /**
  8. * 请求预处理,用于初始化操作
  9. * 如果返回false:不再调用控制器的方法以及后面的postHandle、afterCompletion方法
  10. */
  11. public boolean preHandle(HttpServletRequest request,
  12. HttpServletResponse response,
  13. Object handler) throws Exception {
  14. System.out.println("preHandle-------");
  15. return true;
  16. }
  17. /**
  18. * Controller方法调用之后调用,在DispatcherServlet渲染视图之前调用
  19. * 在这里对请求进行后续处理,比如设置请求头、使用modelAndView改变转发路径等
  20. */
  21. public void postHandle(HttpServletRequest request,
  22. HttpServletResponse response,
  23. Object handler,
  24. @Nullable ModelAndView modelAndView) throws Exception {
  25. System.out.println("postHandle-------");
  26. }
  27. /**
  28. * 在DispatcherServlet渲染视图之后调用
  29. * 可以理解在response.getWriter().write()后调用或者在request.getRequestDispatcher().forward()转发
  30. * 后调用再或者在response.sendRedirect()重定向之后调用
  31. */
  32. public void afterCompletion(HttpServletRequest request,
  33. HttpServletResponse response,
  34. Object handler, @Nullable Exception ex) throws Exception {
  35. System.out.println("afterCompletion-------");
  36. }
  37. }

配置拦截器

  1. <mvc:interceptors>
  2. <!-- 可以配置多个拦截器-->
  3. <mvc:interceptor>
  4. <!-- 需要拦截的路径,包括子路径-->
  5. <mvc:mapping path="/**"/>
  6. <!-- 排查所有的html-->
  7. <mvc:exclude-mapping path="/**/*.html"/>
  8. <!-- 排查所有的png-->
  9. <mvc:exclude-mapping path="/**/*.png"/>
  10. <!-- 排查所有的jpg-->
  11. <mvc:exclude-mapping path="/**/*.jpg"/>
  12. <!-- 排查所有的js-->
  13. <mvc:exclude-mapping path="/**/*.js"/>
  14. <!-- 自定义的拦截器-->
  15. <bean class="com.lff.MyInterceptor" />
  16. </mvc:interceptor>
  17. </mvc:interceptors>

这样就OK啦