我需要你就如何解决这个问题提出建议。我在服务器上有一个带有spring security的grails webservice,以及客户端上的ext js web页面。会话超时(web.xml)为30分钟,在此不活动时间后,用户已成功登录。
现在我需要从客户端(ajax)进行轮询以从服务器获取新信息。这种情况每2分钟就会在后台发生。 (推送服务在这里会很好,但我暂时不能使用它......)
由于2分钟的请求间隔,永远不会达到30分钟超时,用户永远不会自动注销。
如何在不延长会话的情况下创建ajax请求?
此致 grailsfan
答案 0 :(得分:1)
一般情况下你不能。创建会话后,会在请求进入时始终更新(lastAccessTime)。
您必须自己实现此功能。我做了几次,但并不难。
您的想法是,使用System.currentTimeMillis()
内的Grails before-Filter
更新session.lastAccessMillis。更新应仅针对非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 :(得分:-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()
}
}
}
}
}