我正在解决非常棘手的问题,有时候用户会看到他们之前会话中的值。我有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。