Spring Boot深度课程系列
峰哥说技术—2020庚子年重磅推出、战胜病毒、我们在行动
12 峰哥说技术:Spring Boot 注册拦截器
拦截器的原理很简单,是 AOP 的一种实现,专门拦截对动态资源的后台请求,即拦截对控制层的请求。使用场景比较多的是判断用户是否有权限请求后台,更拔高一层的使用场景也有,比如拦截器可以结合 websocket 一起使用,用来拦截 websocket 请求,然后做相应的处理等等。
在Spring Boot中拦截器的使用比较简单,分为两步,一是定义拦截器,二是配置拦截器即可。下面通过一个案例来说明.
案例:拦截器的简单使用。
步骤:
1)创建Spring Boot项目,添加web依赖。
2)定义拦截器MyIntercepter
public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle(),在Controller方法之前执行========>"); //返回true继续执行,否则取消当前请求 return true; }
@Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception { System.out.println("postHandle(),执行Controller后面的接口方法后调用,但是视图还没有被渲染=======>"); }
@Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception { System.out.println("整个请求处理完毕,视图也渲染完毕,做清理工作======>"); } }
|
3)定义拦截器MyIntercepterConfig,实现WebMvcConfigurer接口即可。
在 Spring Boot 2.0 之前,我们都是直接继承 WebMvcConfigurerAdapter 类,然后重写 addInterceptors 方法来实现拦截器的配置。但是在 Spring Boot 2.0 之后,该方法已经被废弃了(当然,也可以继续用),取而代之的是 WebMvcConfigurationSupport和WebMvcConfigurer。但是WebMvcConfigurationSupport对于静态资源会被拦截。因此建议使用WebMvcConfigurer,它不会导致静态资源被拦截的问题。
@Configuration public class WebMvcConfig implements WebMvcConfigurer{ @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new MyInterceptor()) .addPathPatterns("/**") .excludePathPatterns("/test"); } }
|
这里的addPathPatterns("/**"),是请求的映射规则,excludePathPatterns("/test")表示被排除拦截路径。
编写IndexController类
@RestController public class IndexController { @GetMapping("/hello") public String hello(){ return "hello Spring Boot"; } @GetMapping("/test") public String hello1(){ return "hello Spring test"; } }
|
4)测试:在浏览器中输入http://localhost:8080/hello,浏览器和控制台结果如下:
在浏览器中输入http://localhost:8080/test,浏览器和控制台结果如下:
这说明/test路径请求真的被排除。