Grails / Ext js:在不延长会话的情况下发出请求(会话超时)

时间:2014-05-14 07:26:21

标签: javascript ajax spring session grails

我需要你就如何解决这个问题提出建议。我在服务器上有一个带有spring security的grails webservice,以及客户端上的ext js web页面。会话超时(web.xml)为30分钟,在此不活动时间后,用户已成功登录。

现在我需要从客户端(ajax)进行轮询以从服务器获取新信息。这种情况每2分钟就会在后台发生。 (推送服务在这里会很好,但我暂时不能使用它......)

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

  • 我在客户端使用会话cookie,每次请求都会转移到服务器。
  • 在这个特定的ajax请求中,我另外添加了BasicAuthentication参数,以防止Spring安全性使用请求中的会话ID - 但这不起作用。
  • 无法从此请求中删除JSESSION ID,它始终由浏览器添加。

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

此致 grailsfan

2 个答案:

答案 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()
        }
      }
    }
  }
}