我有一个 Web 应用程序(使用 spring 和 vaadin)我需要创建一个辅助线程来做一些工作(我不能这样做,因为现有的代码我无法更改)。在这个线程中,我需要访问会话。我找到了这个有用的答案:
在 Threads of Everything 中访问作用域代理 bean
是可以的,
但是在线程启动后,当我尝试获取会话时,我得到了 null。我仍然得到会话ID...
public RequestAwareRunnable() {
this.requestAttributes = RequestContextHolder.getRequestAttributes();
this.thread = Thread.currentThread();
String sessionID = requestAttributes.getSessionId();
HttpSession session = ((ServletRequestAttributes) requestAttributes).getRequest().getSession(false);//the session is OK
}
public void run() {
try {
String sessionID = requestAttributes.getSessionId();
HttpSession session = ((ServletRequestAttributes) requestAttributes).getRequest().getSession(false); // i get null
RequestContextHolder.setRequestAttributes(requestAttributes);
onRun();
} finally {
if (Thread.currentThread() != thread) {
RequestContextHolder.resetRequestAttributes();
}
thread = null;
}
}
有任何想法吗?