Spring MVC:setComplete()不保证会话清理

时间:2017-09-30 18:05:37

标签: java spring spring-mvc session

我正在解决非常棘手的问题,有时候用户会看到他们之前会话中的值。我有Spring MVC控制器来处理来自用户的AJAX请求。我有接下来的2个处理程序方法:

@PostMapping("/notifications")
void performLongRunningOperation() {
    // some operation which may take about 10 seconds
}

@PostMapping("/cancel")
void cancel(SessionStatus sessionStatus) {
    sessionStatus.setComplete();
}

问题是如果cancel()performLongRunningOperation()完成执行之前完成执行,则setComplete()无效。更准确地说,setComplete()清除会话,但会话恢复到执行期间的状态  performLongRunningOperation()方法。

我找到的唯一解决方案是根本不使用setComplete()而是手动管理会话状态(即,在会话中保留一些SessionHolder对象的实例并将其设置为null当用户请求取消会话时此对象)。该解决方案解决了初始问题,但现在我需要关注SessionHolder的正确同步。

问题是:当一个人不完全知道处理程序方法完成执行的顺序时(如果它可以被使用的话),如何在一个场景中使用setComplete()方法? / p>

演示此问题的Spring Boot项目是here

0 个答案:

没有答案