【问题标题】:Grails / Ext js: Make request without extending the session (Session Timeout)Grails / Ext js:在不延长会话的情况下发出请求(会话超时)
【发布时间】:2014-07-02 02:59:43
【问题描述】:
我需要您就如何解决这个问题提出建议。我在服务器上有一个带有spring security的grails webservice,在客户端上有一个ext js网页。会话超时 (web.xml) 为 30 分钟,在该时间不活动之后,用户被成功记录。
现在我需要从客户端(ajax)轮询以从服务器获取新信息。这每 2 分钟在后台发生一次。 (这里有推送服务很好,但我现在不能使用它......)
由于 2 分钟的请求间隔,永远不会达到 30 分钟的超时,并且永远不会自动注销用户。
- 我在客户端使用会话 cookie,每次请求都会将其传输到服务器。
- 在这个特定的 ajax 请求中,我还添加了 BasicAuthentication 参数,以防止 Spring Security 使用请求中的会话 ID - 但这不起作用。
- 无法从此请求中删除 JSESSION ID,它始终由浏览器添加。
如何在不扩展会话的情况下创建 ajax 请求?
问候,
圣杯粉丝
【问题讨论】:
标签:
javascript
ajax
spring
session
grails
【解决方案1】:
一般你不能。创建会话后,当有请求进入时,它总是会更新 (lastAccessTime)。
您必须自己实现此功能。我做了几次,没那么难。
这个想法是,您使用 Grails before-Filter 内的 System.currentTimeMillis() 更新 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()
}
}
}
}
}
【解决方案2】:
来自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()
}
}
}
}
}