之所以要把 新令牌 保存到 ThreadLocalToken 里面,是因为要向 AOP 切面类 传递这个 新令牌 。 虽然 OAuth2Filter 中有 doFilterInternal() 方法,我们可以得到响应并且写入 新令牌 。但是
这个做非常麻烦,首先我们要通过 IO 流读取响应中的数据,然后还要把数据解析成 JSON 对象,
最后再放入这个新令牌。如果我们定义了 AOP 切面类 ,拦截所有 Web 方法返回的 R 对象 ,然后
在 R 对象 里面添加 新令牌 ,这多简单啊。但是 OAuth2Filter 和 AOP 切面类之间没有调用关
系,所以我们很难把 新令牌 传给 AOP 切面类 。
这里我想到了 ThreadLocal ,只要是同一个线程,往 ThreadLocal 里面写入数据和读取数据是 完全相同的。在Web 项目中,从 OAuth2Filter 到 AOP 切面类 ,都是由同一个线程来执行的,中 途不会更换线程。所以我们可以放心的把新令牌保存都在 ThreadLocal 里面, AOP 切面类 可以成 功的取出新令牌,然后往 R 对象 里面添加新令牌即可。
ThreadLocalToken 是我自定义的类,里面包含了 ThreadLocal 类型的变量,可以用来保存线程
安全的数据,而且避免了使用线程锁。
————————————————
4.4 创建ThreadLocalToken类
```package com.example.emos.wx.config.shiro;
import org.springframework.stereotype.Component;
@Component
public class ThreadLocalToken {
private ThreadLocal local=new ThreadLocal<>();
public void setToken(String token){
local.set(token);
}
public String getToken(){
return local.get();
}
public void clear(){
local.remove();
}
}
```