定义拦截器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@Slf4j
public class CustomHandlerInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(@NotNull HttpServletRequest request,
@NotNull HttpServletResponse response,
@NotNull Object handler) throws Exception {
log.info("preHandle:请求前调用");
//返回 false 则请求中断
return true;
}
@Override
public void postHandle(@NotNull HttpServletRequest request,
@NotNull HttpServletResponse response,
@NotNull Object handler,
ModelAndView modelAndView) throws Exception {
log.info("postHandle:请求后调用");
}
@Override
public void afterCompletion(
@NotNull HttpServletRequest request,
@NotNull HttpServletResponse response,
@NotNull Object handler, Exception ex
) throws Exception {
log.info("afterCompletion:请求调用完成后回调方法,即在视图渲染完成后回调");
}
}
注册
1
2
3
4
5
6
7
8
9
10
11
@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
//注册拦截器 拦截规则
//多个拦截器时 以此添加 执行顺序按添加顺序
registry.addInterceptor(new CustomHandlerInterceptor()).addPathPatterns("/**");
}
}
单次请求数据共享
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class DemoInterceptor : HandlerInterceptor {
companion object {
val demoLocalThread = object : ThreadLocal<String>() {
override fun initialValue(): String {
return ""
}
}
}
@Throws(Exception::class)
override fun preHandle(request: HttpServletRequest, response: HttpServletResponse, handler: Any): Boolean {
val init = demoLocalThread.get()
val name = request.getHeader("name")
demoLocalThread.set(init + "name: $name" + "\npreHandle thread ${Thread.currentThread()}")
return true
}
@Throws(Exception::class)
override fun postHandle(request: HttpServletRequest, response: HttpServletResponse, handler: Any, modelAndView: ModelAndView?) {
val init = demoLocalThread.get()
demoLocalThread.set(init + "\npostHandler thread ${Thread.currentThread()}")
}
@Throws(Exception::class)
override fun afterCompletion(request: HttpServletRequest, response: HttpServletResponse, handler: Any, ex: Exception?) {
val init = demoLocalThread.get()
demoLocalThread.set(init + "\nafterCompletion thread ${Thread.currentThread()}")
println(demoLocalThread.get())
demoLocalThread.remove()
}
}
使用threadlocal实现,用户登陆信息获取到时可以存入threadLocal,这样在controller中就可以直接获取来使用了。