返回 导航

其他

hangge.com

SpringBoot - 拦截器的注册和使用(附样例)

作者:hangge | 2019-10-24 08:20
    Spring MVC 中提供了 AOP 风格的拦截器,拥有更加精细的拦截处理能力。Spring Boot 中拦截器的注册与使用更加方便,下面通过样例进行演示。

1,创建拦截器

首先我们实现 HandlerInterceptor 接口自定义一个拦截器 MyInterceptor1,内容如下:
(1)拦截器中的方法将按 preHandle -> Controller -> postHandle -> afterCompletion 的顺序执行,注意:
  • 只有 preHandle 方法返回 truepostHandleafterCompletion 才有可能被执行;
  • 如果 preHandle 方法返回 false,则该拦截器的 postHandleafterCompletion 必然不会被执行。
(2)当拦截器链内存在多个拦截器时:
  • 其中 preHandle 方法返回 true 的拦截器的 afterCompletion 会执行。
  • 只有所有拦截器的 preHandle 方法都返回 truepostHandle 才会执行。
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyInterceptor1 implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
                             Object handler) throws Exception {
        System.out.println("MyInterceptor1>>>preHandle");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response,
                           Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor1>>>postHandle");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
                                Object handler, Exception ex) throws Exception {
        System.out.println("MyInterceptor1>>>afterCompletion");
    }
}

2,配置拦截器

接着需要定义一个配置类来配置拦截器。自定义类只需实现 WebMvcConfigurer 接口,实现接口中的 addInterceptors 方法即可。
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new MyInterceptor1())
            .addPathPatterns("/**") // 配置拦截路径(所有路径都拦截)
            .excludePathPatterns("/hello2"); // 配置排除的路径
    }
}

3,运行测试

(1)首先我们通过浏览器访问接口 /hello1,可以看到控制台输出信息如下,说明拦截器成功启用:

(2)接着访问接口 /hello2,由于该路径被排除再外,因此就没有被拦截:
评论

全部评论(0)

回到顶部