Java 将RequestAttributes传递给新线程后,会话将丢失
我有一个web应用程序(使用spring和vaadin),我需要创建一个辅助线程来完成一些工作(我不能用另一种方法来完成这项工作,因为现有的代码我无法更改)。在这个线程中,我需要访问会话。我发现了这个有用的答案:Java 将RequestAttributes传递给新线程后,会话将丢失,java,multithreading,spring,session,web-applications,Java,Multithreading,Spring,Session,Web Applications,我有一个web应用程序(使用spring和vaadin),我需要创建一个辅助线程来完成一些工作(我不能用另一种方法来完成这项工作,因为现有的代码我无法更改)。在这个线程中,我需要访问会话。我发现了这个有用的答案: 一切正常,但在线程启动后,当我尝试获取会话时,我会得到null。但是我仍然可以得到会话id public RequestAwareRunnable() { this.requestAttributes = RequestContextHolder.getRequestAttr
一切正常,但在线程启动后,当我尝试获取会话时,我会得到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;
}
}
有什么想法吗 在构造函数中获取会话并将其保存在实例变量中,会话和请求对象是线程绑定的,如果您在处理原始请求的线程以外的线程中执行runnable,您将无法访问它们。但是ServletRequestAttributes不应该保留它吗?我还考虑过存储会话,但如何在请求中设置会话?我希望避免使用反射并将所有属性复制到新创建的会话对象。