Home Interceptor的使用
Post
Cancel

Interceptor的使用

定义拦截器

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中就可以直接获取来使用了。

This post is licensed under CC BY 4.0 by the author.