Spring MVC 中的 Interceptor 拦截器主要用来拦截用户的请求并进行相应的处理,比如用它来进行权限验证、判断是否登录等,实现方式有如下两种:

    • 实现接口:org.springframework.web.servlet.HandlerInterceptor
    • 继承适配器:org.springframework.web.servlet.handler.HandlerInterceptorAdapter

    拦截器实现:
    1、实现 HandlerInterceptor 接口

    1. public class DemoInterceptor implements HandlerInterceptor {
    2. /**
    3. * 在目标 Handler() 方法执行之前执行
    4. * 返回true,执行handler方法
    5. * 返回false,拦截,不执行handler方法
    6. *
    7. * @param request
    8. * @param response
    9. * @param handler
    10. * @return
    11. * @throws Exception
    12. */
    13. @Override
    14. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    15. return false;
    16. }
    17. /**
    18. * 请求到达后,在目标handler()方法执行后,视图方法执行前做处理
    19. *
    20. * @param request
    21. * @param response
    22. * @param handler
    23. * @param modelAndView
    24. * @throws Exception
    25. */
    26. @Override
    27. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    28. }
    29. /**
    30. * 请求到达且视图生成后
    31. *
    32. * @param request
    33. * @param response
    34. * @param handler
    35. * @param ex
    36. * @throws Exception
    37. */
    38. @Override
    39. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    40. }
    41. }

    2、拦截器配置:

    在 mvc.xml 中配置

    1. <!-- 方式一 -->
    2. <mvc:interceptors>
    3. <!--
    4. 使用bean定义一个Interceptor
    5. 直接定义在mvc:interceptors根下面的Interceptor将拦截所有请求
    6. -->
    7. <bean class="com.example.interceptors.DemoInterceptor"/>
    8. </mvc:interceptors>
    9. <!-- 方式二(推荐) -->
    10. <mvc:interceptors>
    11. <!--
    12. 定义在 mvc:interceptor 下,自定义需要拦截的请求
    13. 如果存在多个拦截器满足处理的要求,依据配置顺序先后执行
    14. -->
    15. <mvc:interceptor>
    16. <!-- 通过mvc:mapping配置需要拦截的资源,支持统配符,可配置多个,/**表示拦截所有请求 -->
    17. <mvc:mapping path="/**" />
    18. <!-- 通过mvc:exclude-mapping 配置不需要拦截的资源,支持通配符,支持多个 -->
    19. <mvc:exclude-mapping path="/login/**"/>
    20. <bean class="com.example.interceptors.DemoInterceptor"/>
    21. </mvc:interceptor>
    22. </mvc:interceptors>

    或在 java 配置类中进行配置:

    1. @Configuration
    2. @ComponentScan(basePackages = {"com.example"}, useDefaultFilters = false,
    3. includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value = Controller.class)})
    4. @EnableWebMvc
    5. public class WebConfig implements WebMvcConfigurer {
    6. // 实现WebMvcConfigurer并覆写addInterceptors接口
    7. @Override
    8. public void addInterceptors(InterceptorRegistry registry) {
    9. registry.addInterceptor(new DemoInterceptor()).addPathPatterns("/**");
    10. }
    11. }