SpringBoot之HandlerInterceptor拦截器的使用

>> 饿了么、美团外卖红包领取地址<<

在web项目中,拦截器可以用于拦截请求,比较常用的用法是做登陆拦截、权限校验、防重复提交等。

在SpringBoot中使用拦截器也非常的简单,只需要实现HandlerInterceptor接口即可,接口有preHandle、postHandle与afterCompletion这3个方法,分别对应请求的各个时期。

1、preHandle
调用时间:Controller方法处理之前
执行顺序:链式Intercepter情况下,Intercepter按照声明的顺序一个接一个顺序执行
返回结果为true,则会执行2和3过程;若返回false,则中断执行

2、postHandle
调用时间:Controller方法处理完之后,DispatcherServlet进行视图的渲染之前,也就是说在这个方法中你可以对ModelAndView进行操作
执行顺序:链式Intercepter情况下,Intercepter按照声明的顺序倒序执行

3、afterCompletion
调用时间:DispatcherServlet进行视图的渲染之后
执行顺序:链式Intercepter情况下,Intercepter按照声明的顺序倒序执行

一个拦截器A的代码示例:

@Component
public class AInterceptor implements HandlerInterceptor {

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

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

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

}

为了使拦截器生效,我们还需要新增一个配置类。该配置类需要实现WebMvcConfigurer接口:

/**
 * web配置
 */
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private AInterceptor aInterceptor;

    @Autowired
    private BInterceptor bInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(aInterceptor)
                .addPathPatterns("/**");
        registry.addInterceptor(bInterceptor)
                .addPathPatterns("/**");

    }

}

如代码所示,我们指定拦截器A拦截的url路径为/**,也就是针对所有请求都进行拦截。这里的pathPatterns就是需要拦截的url路径的地址,支持通配符配置。

可以注意到,我们这里配置了2个拦截器A和B。在一个项目中,是可以存在多个拦截器的,而多个拦截器则会形成一个拦截器链,拦截器链是有顺序的,也就是上文提到的:拦截器的声明顺序。上文代码的拦截器链的声明顺序为A-B。

AB拦截器代码都一样,只是输出标识不一样,下面是一个测试用例用于演示拦截器3个方法的调用顺序:

A----preHandle
B----preHandle
业务逻辑
B----postHandle
A----postHandle
B----afterCompletion
A----afterCompletion

到这里,拦截器的使用就介绍完了。

代码:https://gitee.com/lqccan/blog-demo/tree/master/SpringBoot/interceptor


觉得内容还不错?打赏个钢镚鼓励鼓励!!👍

年年好1.2米丝绒布全背胶金字对联《贺岁呈祥》2023兔年不带福字
¥19.90
美加净轻香滋养手部身体乳护手霜 250ml 国际调香大师 告别干燥护手霜
¥45.50
佳帮手擦玻璃神器双面清洗擦窗器家用伸缩杆窗户刮洗清洁工具 玻璃刮水
¥25.90
修正腰椎间盘突出膏贴护腰椎突出症远红外磁疗筋骨贴骨质增生骨刺贴腰痛贴腰部酸疼痛腰间盘突出专用贴
¥35.00
墨斗鱼 无火香薰120ml蓝风铃香型0130卧室香氛藤条香薰送男友女生情人节创意实用礼物室内空气清新剂持久留香
¥39.80
sharemood衣柜衣橱蜡片香片香包香皂礼盒香氛香薰挂件室内洗手间除臭
¥40.30
绿联 苹果数据线MFi认证 快充充电线适用iPhone14/13Pro/12/11/X/8/iPadi手机Lightning充电器USB电源线1米
¥46.90
实瞳SEED 可芙蕾Sister原装进口 日本美瞳小直径 男女彩色隐形眼镜月抛 1片装 流韵 700度
¥32.00