1

我有一个 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;
    }
}

有任何想法吗?

4

1 回答 1

2

在构造函数中获取会话并将其保存在实例变量中,Session 和 Request 对象是线程绑定的,如果您在与处理原始请求的线程不同的线程中执行 runnable,您将无法访问它们。

于 2012-10-16T09:42:20.170 回答