java - Spring 延迟结果丢失了 http session

标签 java spring spring-mvc tomcat asynchronous

我在异步模式下使用带有 Spring MVC 和 Spring 安全性的 Tomcat 7。

然后我使用 DeferredResult 发出异步请求。该机制工作正常,但问题是当 deferredResult 执行 setResult() 并返回 promise 时,我丢失了所有 session ,并且我的下一个请求给我一个 403 禁止,因为我没有在我的 SecurityContextHolder 上进行身份验证。

我猜是因为 promise 的返回是在另一个没有 session 的线程中完成的。

有人可以在这里把我引向正确的方向。

解决方案:onCompletion 回调方法我传递我在 map 中创建 deferredResult 时放置的 session 。

      deferredResult.onCompletion(new Runnable() {
        @Override
        public void run() {
            request.getSession().setAttribute(SPRING_SECURITY_CONTEXT, securityContextContainer.get(deferredResult));
            securityContextContainer.remove(deferredResult);
        }
    });

最佳答案

解决方案:onCompletion 回调方法我传递我在 map 中创建 deferredResult 时放置的 session 。

  deferredResult.onCompletion(new Runnable() {
    @Override
    public void run() {
        request.getSession().setAttribute(SPRING_SECURITY_CONTEXT, securityContextContainer.get(deferredResult));
        securityContextContainer.remove(deferredResult);
    }
});

关于java - Spring 延迟结果丢失了 http session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29716119/

相关文章:

java - 元素 MyElement 在点 (x, y) 不可点击...其他元素将收到点击

java - 测试 Quartz CronTrigger 触发器

java - RequestMapping 无法正常工作

spring-mvc - 为内部依赖于 ContextLoader.getCurrentWebApplicationContext() 的 Spring MVC 应用程序编写 Junit 测试

java - 使用 Spring Boot 将 Oracle 数据传输到 SQL Server

java - 在 Servlet 中强制浏览器下载 - Spring

java - activemq 代理启动后是否可以创建虚拟目的地和复合队列?

java - Java 中的 XPATH : parent node missing

java.sql.SQLException : Access denied for user 'root' @'localhost' (using password: YES) 异常

java - 如何在 Spring 中处理 DataIntegrityViolationException?