如果浏览器关闭或电源关闭,是否可以使spring mvc会话无效?

时间:2014-09-12 14:34:59

标签: java spring 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 security传递的所有用户会话。对于一些用户我没有注销就关闭了浏览器,我希望这个会话不会被添加到我的activeSessionsId中 列表,但它不是那样的。

我发现在activeSessionsId中添加了所有sessionId。

实际上是概念明智的我知道会话创建是由服务器端发生的。但是请任何人让我知道我正在尝试的是在Spring MVC的情况下是否可能。

2 个答案:

答案 0 :(得分:1)

从服务器的角度来看,您必须承认您无法知道浏览器是否已关闭。好的,您可以尝试使用javascript在关闭窗口时发送内容,但任何可能会发生:

  • 网络可以在任何时候(系统,调制解调器,代理),自愿或不自愿
  • 电源可以自动关闭
  • 可以停用javascript
  • 用户可以使用无头浏览器(Selenium,Python或Java或...代码),可以选择忽略全部或部分javascript

因此,如果您愿意,可以使用javascript,它可以在绝大多数用例中使用,但始终保持会话超时,以便在您执行任何操作时仍然可以发生不需要的静默断开连接。

答案 1 :(得分:0)

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

在此次通话中,您可以使该用户的会话无效,并将其从您的活动会话列表中删除

或者,您在服务器上添加会话超时,这将在一定时间到期后删除会话。