原因: 因为用户信息存储在threadLocal中 ,所以在子线程中无法获取
SecurityContextHolder 中有三种存储策略
public static final String MODE_THREADLOCAL = "MODE_THREADLOCAL"; public static final String MODE_INHERITABLETHREADLOCAL = "MODE_INHERITABLETHREADLOCAL"; public static final String MODE_GLOBAL = "MODE_GLOBAL";
第一中就是 默认的放在 threadLocal 中 ,所以在子线程中无法取到用户信息
第二种 : MODE_INHERITABLETHREADLOCAL 这种 策略就是存储在 InheritableThreadLocal 中 ,InheritableThreadLocal 可以在子线中获取用户信息
设置存储策略 :
在java 启动参数中 设置 : -Dspring.security.strategy=MODE_INHERITABLETHREADLOCAL