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);
}
}