我不清楚使session
无效的适当方法是保证在多个并发线程访问代码路径时不会抛出运行时异常。
为了便于讨论,假设我有多个要注销的传入请求,并且他们有一个共享会话。
方法1:只是使会话无效。
session.get().invalidate()
如果两个线程成功达到原始会话,并且两个名为RuntimeException
的无效通知只能在每个会话中调用一次,则会导致invalidate()
。
方法2:获取会话的互斥锁
此外,此处甚至无法在synchronize
处获取互斥锁,因为:
synchronize(WebUtils.getSessionMutex(session.get())) {
if (session.get(false) != null) {
session.invalidate();
}
}
此方法与方法1具有完全相同的问题。如果两个线程获得对共享会话的访问权限,则对getSessionMutex
(引用:)的调用将导致RuntimeException
,因为它会导致在无效会话中调用getAttribute
。
方法3 :缓存要同步的对象。
从传入请求中获取原始会话ID。使用此id缓存对象以进行同步。
这可行,但似乎有很多开销。
希望有人采用更简洁的方法4。