ThreadLocal和InheritableThreadLocal
一、两者区别:
ThreadLocal:为每一个线程创建一个副本,每个副本线程隔离。但是他不支持继承。
InheritableThreadLocal:支持继承。这里的继承不是extends,是指线程的继承。也就是说新起一个线程可以拥有老线程的数据。
二、异步线程把SpringSecurity当前用户信息context带到子线程。
- 需要加个参数 -Dspring.security.strategy=MODE_INHERITABLETHREADLOCAL
- 或者增加代码块
static {
SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL);
}
- 如果使用了线程池,则添加如下配置
@Bean
public DelegatingSecurityContextAsyncTaskExecutor taskExecutor(ThreadPoolTaskExecutor delegate) {
return new DelegatingSecurityContextAsyncTaskExecutor(delegate);
}
为什么要添加线程池
如果用的是线程池的话,子线程每次使用完,以前被赋值的用户context不会被清理掉。而且下次再调用这个子线程的时候也不会重新设置当前父线程的用户上下文。所以要给异步线程加个DelegatingSecurityContextAsyncTaskExecutor