在之前的开发中,我们会在每一个Service中对token做处理,相同的逻辑一定是要进行统一处理的,该如何处理呢?
由于程序是运行在web容器中,每一个HTTP请求都是一个独立线程,也就是可以理解成我们编写的应用程序运行在一个多线程的环境中,那么我们就可以使用ThreadLocal在HTTP请求的生命周期内进行存值、取值操作。
说明:
- 用户的每一个请求,都是一个独立的线程
- 图中的TL就是ThreadLocal,一旦将数据绑定到ThreadLocal中,那么在整个请求的生命周期内都可以随时拿到ThreadLocal中当前线程的数据。
根据上面的分析,我们只需要在Controller请求之前进行对token做校验,如果token有效,则会拿到User对象,然后将该User对象保存到ThreadLocal中即可,最后放行请求,在后续的各个环节中都可以获取到该数据了。
如果token无效,给客户端响应401状态码,拦截请求,不再放行到Controller中。
由此可见,这个校验的逻辑是比较适合放在拦截器中完成的。
第一步
编写注解NoAuthorization
package com.tanhua.common.utils;
import java.lang.annotation.*;
@Target(ElementType.METHOD)//定义在方法上
@Retention(RetentionPolicy.RUNTIME)//注解的时间
@Documented//标识是一个注解
public @interface NoAuthorization {
}
编写UserThreadLocal存放user
package com.tanhua.common.utils;
import com.tanhua.common.pojo.User;
public class UserThreadLocal {
private static final ThreadLocal<User> LOCAL = new ThreadLocal<>();
private UserThreadLocal(){
}
/**
* 将对象放入到ThreadLocal
*
* @param user
*/
public static void