spring_拦截器

本文介绍了在SpringBoot中如何使用HandlerInterceptorAdapter创建自定义拦截器,实现AOP思想。通过预处理(preHandle)、后处理(postHandle)和完成处理(afterCompletion)方法,可以在请求执行前后进行相应的操作,如权限校验、日志记录等。示例代码展示了拦截器的使用方法,并在拦截器中使用ThreadLocal保存局部变量。
摘要由CSDN通过智能技术生成

aop思想
在SpringBoot中我们可以使用HandlerInterceptorAdapter这个适配器来实现自己的拦截器。这样就可以拦截所有的请求并做相应的处理。
在HandlerInterceptorAdapter中主要提供了以下的方法:
preHandle:在方法被调用前执行。在该方法中可以做类似校验的功能。如果返回true,则继续调用下一个拦截器。如果返回false,则中断执行,也就是说我们想调用的方法不会被执行,但是你可以修改response为你想要的响应。
postHandle:在方法执行后调用。
afterCompletion:在整个请求处理完毕后进行回调,也就是说视图渲染完毕或者调用方已经拿到响应。

/**
 * Auther: ruoyu
 * Date: 19-2-18
 * Description: 创建自定义拦截器 正常情况下可以直接继承 HandlerInterceptor, HandlerInterceptorAdapter 暂时还不知道之前使用上的区别
 */
public class MyTestInterceptor extends HandlerInterceptorAdapter {

    private String name;

    private int num = new Random().nextInt(100);

    private ThreadLocal<Integer> data = ThreadLocal.withInitial(()-> new Random().nextInt(100));

    public MyTestInterceptor(String name) {
        this.name = name;
    }

    /**
     * 在方法执行前拦截
     *
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//        return super.preHandle(request, response, handler);

        System.out.println("本地现成变量为:"+data.get());

        System.out.println("this hash = "+ Objects.hash(this));

        System.out.println("在方法执行前进行了拦截:num= " + num + " ThreadName=" + Thread.currentThread().getName());

        return true;

    }

    /**
     * 在方法执行后拦截
     *
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//        super.postHandle(request, response, handler, modelAndView);

        System.out.println("本地现成变量为:"+data.get());

        System.out.println("this hash = "+ Objects.hash(this));

        System.out.println("在方法执行后进行了拦截:num= " + num + " ThreadName=" + Thread.currentThread().getName());

    }

    /**
     * 在请求处理完成后 调用方得到响应后
     *
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//        super.afterCompletion(request, response, handler, ex);

        System.out.println("本地现成变量为:"+data.get());
        System.out.println("this hash = "+ Objects.hash(this));
        System.out.println("在请求处理完成后 调用方得到响应后:num= " + num + " ThreadName=" + Thread.currentThread().getName());

    }
}
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {

        //注册自定义拦截器到 拦截器链中
        registry.addInterceptor(new MyTestInterceptor("测试")).addPathPatterns("/**");
        super.addInterceptors(registry);

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值