2014-09-12 78 views
0

在Spring MVC中,我可以通过以下代码获取所有会话。如果浏览器关闭或电源关闭,是否可以使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安全传递的所有用户会话。对于某些用户,我关闭了浏览器而无需注销,并且我预计此会话将不会添加到我的activeSessionsId 列表中,但它不是那样的。

我观察到所有sessionId都添加在activeSessionsId中。

其实明智的我知道会话创建是由服务器端发生的。但请任何人让我知道无论我尝试的是否有可能在春季MVC的情况下。

回答

0

一般来说,当我关闭浏览器时,我所说的服务器将无法知道我关闭了浏览器 - 除非您以某种方式告诉它。通常情况下,您可以使用一些javascript来执行此操作,并侦听浏览器关闭事件并调用服务器以告诉他们关闭了浏览器。

在此调用,您可以无效该用户的会话,并且应该从你的活动会话列表

或者删除它,你,你这会在一定的时间到期删除会话服务器上添加会话超时。

1

从服务器的角度来看,您必须承认您无法知道浏览器是否关闭。好吧,你可以尝试使用JavaScript关闭窗口时,送东西,但什么可能发生:

  • 网络可以在任何时候往下走(系统,调制解调器,代理),自愿或不
  • 电源可以熄灭,自愿或不
  • JavaScript可以被禁用
  • 用户可以使用模拟浏览器(硒,Python或Java或...代码),可以选择忽略的JavaScript
  • 的全部或部分

因此,如果你想使用JavaScript,它将在绝大多数用例中工作,但始终为不需要的静默断开保持会话超时,无论你做什么都可能会发生。

相关问题