在Spring MVC中,我可以通过以下代码获取所有会话。
int active= sessionRegistry.getAllPrincipals().size();
List<String> activeSessionsId = new ArrayList<String>();
for(int i=0;i<active;i++){
List<SessionInformation> si=
sessionRegistry.getAllSessions(sessionRegistry.getAllPrincipals().get(i), false);
for(SessionInformation s:si){
System.out.println("SessionId="+s.getSessionId());
activeSessionsId.add(s.getSessionId());
}
}
这里的sessionRegistory是我的春季给定的bean,我像这样配置它:
<beans:bean id="sessionRegistry" class="org.springframework.security.core.session.SessionRegistryImpl" />
然后像这样在我的控制器中自动接线:
@Resource(name="sessionRegistry")
private SessionRegistryImpl sessionRegistry;
我认为activeSessionsId列表将仅包含活动会话,但它包含我登录并由Spring Security传递的所有用户会话。对于某些用户,我关闭了浏览器而未注销,并且希望此会话不会添加到我的activeSessionsId中
列表,但事实并非如此。
我观察到所有sessionId都添加到activeSessionsId中。
实际上,从概念上讲,我知道会话创建是在服务器端进行的。但是,请问任何一个让我知道我正在尝试的事情,在Spring MVC的情况下是否可能。
最佳答案
从服务器的角度来看,您必须承认您不知道浏览器是否已关闭。好的,您可以尝试使用javascript在关闭窗口时发送一些消息,但是任何事情都可能发生:
网络可以在任何时候(无论是否自愿)崩溃(系统,调制解调器,代理)
电源可以自动关闭或自动关闭
javascript可以被禁用
用户可以使用无头浏览器(Selenium,Python或Java或...代码)来选择忽略全部或部分javascript
因此,如果需要,请使用javascript,它将在绝大多数用例中都可以使用,但是请始终保持会话超时,以防止在执行任何操作时仍然可能发生的不必要的无提示断开连接。
关于java - 如果关闭浏览器或关闭电源,是否可以使Spring MVC session 无效?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25810767/