拦截器 jwt Threadlocal

目录

一、登录认证问题

二、拦截器

三、ThreadLocal

3.1 使用场景

3.2 使用



一、登录认证问题

在未登录的情况下,不应该访问到其他资源,而是应该回到登录页面

使用jwt令牌技术(令牌就是一段字符串)

Header( ), 记录令牌类型和签名算法等
PayLoad( 载荷 ), 携带自定义的信息
Signature( 签名 ), 对头部和 载荷 进行加密计算得来

使用:

1、首先需要在pom文件中引入jwt令牌的坐标拦截器 jwt Threadlocal_第1张图片

2、调用api进行使用(将来使用的时候都是使用已经提供好的工具类)

拦截器 jwt Threadlocal_第2张图片

以后在登录成功的时候生成一个jwt令牌token

实例:

拦截器 jwt Threadlocal_第3张图片

将来我们在调用其它接口的时候,需要验证jwt令牌token的合法性(多个接口都需要验证,我们可以使用拦截器完成校验)

二、拦截器

1、首先定义一个类实现HandlerInterceptor接口并且重写preHandle方法

拦截器 jwt Threadlocal_第4张图片

实例:我们在方法里面校验令牌

拦截器 jwt Threadlocal_第5张图片

2、写一个web配置类实现webMvcConfigurer接口,并且在addInterceptors方法(添加拦截器)里面通过@Autowired注解获取并把我们刚刚编写的拦截器给它注册进去

拦截器 jwt Threadlocal_第6张图片

实例(登录和注册的接口不进行拦截):拦截器 jwt Threadlocal_第7张图片

三、ThreadLocal

3.1 使用场景

在每个线程内需要保存全局变量(例如在拦截器中获取用户信息),可以让不同方法直接使用,避免参数传递的麻烦。

1、用来存储数据:set()和get()

2、使用ThreadLocal存储的数据是线程安全的

3、用完使用remove方法进行释放

3.2 使用

使用threadlocal工具类

public class ThreadLocalUtil {
    //提供ThreadLocal对象,
    private static final ThreadLocal THREAD_LOCAL = new ThreadLocal();

    //根据键获取值
    public static  T get(){
        return (T) THREAD_LOCAL.get();
    }
	
    //存储键值对
    public static void set(Object value){
        THREAD_LOCAL.set(value);
    }


    //清除ThreadLocal 防止内存泄漏
    public static void remove(){
        THREAD_LOCAL.remove();
    }
}

在拦截器中存储用户的数据

拦截器 jwt Threadlocal_第8张图片

在接口中获取ThreadLocal存储的数据

拦截器 jwt Threadlocal_第9张图片

ThreadLocal的清除(防止内存泄漏)

场所:请求发过来的时候,我们解析它携带的token并且把它存到ThreadLocal里面,接下来这个请求放行了之后,在响应完成之后这一次请求结束了就不再使用了,就可以把它移除掉

我们可以在拦截器LoginInterceptor类中的afterCompletion方法中清空ThreadLocal中的数据

你可能感兴趣的:(spring,boot,后端,java)