2014-05-14 53 views
2

我需要您的建议如何解决这个问题。我在服务器上安装了spring安全的grails webservice,并在客户端上安装了ext js网页。会话超时(web.xml)为30分钟,并且在非活动时间之后,用户已成功登录。Grails/Ext js:请求不扩展会话(会话超时)

现在我需要从客户端(ajax)进行轮询以从服务器获取新信息。这是每隔2分钟发生在背景中的。 (推送服务在这里会很不错,但目前我不能使用它...)

由于2分钟的请求间隔,永远不会达到30分钟的超时,用户永远不会自动注销。

  • 我在客户端使用会话cookie,每次请求都将其传输到服务器。
  • 在这个特殊的ajax请求中,我额外添加了BasicAuthentication params,以防止spring安全使用请求中的会话id - 但这不起作用。
  • 无法从该请求中删除JSESSION ID,它始终由浏览器添加。

如何在不扩展会话的情况下创建ajax请求?

问候, grailsfan

回答

1

一般来说,你不能。一旦创建了会话,当请求进入时,会始终更新(lastAccessTime)。

您必须自己实现此功能。我做了几次,这并不难。

这个想法是,你更新session.lastAccessMillis与System.currentTimeMillis()Grails before-Filter。更新只适用于非XHR请求。然后,你也检查,如果这样的请求来不及太迟,否则使会话无效。

喜欢的东西

class SessionTimeoutFilters { 

    def filters = { 

    all(uri:'/**'){ 

     before = { 
     if(request.xhr) return 
     long now = System.currentTimeMillis() 
     if(!session.lastAccessMillis || TIMEOUT < now - session.lastAccessMillis) 
      session.lastAccessMillis = now 
     else 
      session.invalidate() 
     } 
     } 
    } 
    } 
} 
-1

injecteer's answer,行:

TIMEOUT < now - session.lastAccessMillis 

应该是:

TIMEOUT > now - session.lastAccessMillis 

class SessionTimeoutFilters { 

    def filters = { 

    all(uri:'/**'){ 

     before = { 
     if(request.xhr) return 
     long now = System.currentTimeMillis() 
     if(!session.lastAccessMillis || TIMEOUT > now - session.lastAccessMillis) 
      session.lastAccessMillis = now 
     else 
      session.invalidate() 
     } 
     } 
    } 
    } 
}