某些网站,是需要用户登录才能访问,如果对每一个页面判断用户是否登录,会造成代码冗余,在拦截器中进行鉴权操作可以减少代码的冗余.
图片是慕课网-格鲁老师的流程图
这里面涉及两个知识点:拦截器和ThreadLocal
有两个步骤:
1.实现HandlerInterceptor接口,编写拦截器
2.将拦截器加载入WebMvcConfigurerAdapter中,绑定拦截的urlpathpattern
拦截器
HandlerInterceptor是Spring提供的处理器拦截器接口,以下为源码.
public interface HandlerInterceptor {
//Controller 执行之前执行,返回 true 表示继续流程,false 中断当前流程,但会执行之前拦截器的 afterCompletion 方法
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
//Controller 方法调用之后,视图渲染之前执行
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
}
//渲染视图之后执行
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}
}
ThreadLocal
多个线程访问同一个变量,容易出现并发问题,我们经常采用同步来解决这个问题.
而ThreadLocal使每个线程都访问的是自己的变量,避免了线程安全的问题
下面写个例子来验证一下
public class ThreadLocaleTest {
public static ThreadLocal<String> threadLocal = new ThreadLocal<>();
public static void main(String[] args) {
Thread first = new Thread(new Runnable() {
@Override
public void run() {
threadLocal.set(