峰哥说技术:16-Spring Boot 注册拦截器

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路径请求真的被排除。

原文地址:https://www.cnblogs.com/027kgc/p/12502212.html