防止会话在Jetty中的最后访问时间更新

时间:2013-11-15 12:47:10

标签: java session jetty session-timeout lastaccesstime

是否可以指示Jetty服务器在访问特定servlet时不更新会话的上次访问时间?

我们的用例是一个HTML页面,它每5分钟在后台发送异步请求以刷新其内容。会话的超时设置为30分钟。 这种配置的一个不幸的问题是,当用户在浏览器的选项卡中打开该页面时,会话永不过期,因为每个异步请求都会更新会话的访问时间。

为了正确起见,我不得不承认我还没有尝试任何东西,因为我无法在互联网上找到任何帮助。如果我要求的是不可能的,我正在考虑将访问时间存储在由应用程序直接控制的会话变量中。必须在处理请求之前(在servlet的doGetdoPost方法中)检查此值,并且需要手动使会话无效。有更好的解决方案吗?

1 个答案:

答案 0 :(得分:3)

Servlet无法区分请求是由某个脚本还是人类生成的,因为这两个请求都来自同一个浏览器,因此发送相同的JSESSIONID。因此,您必须标记这些请求以区分其来源。您可以通过某些标头或请求参数标记它们。

我喜欢你在会话变量中存储访问时间的想法(它会在servlet会话到期时捎带) 在这种情况下,您的算法将是:

if isUser(request){ 
    session.lastRobotAccess == null
}else{
    if (session.lastRobotAccess == null) {
       session.lastRobotAccess = current_time
    } else {
       if(current_time - session.lastRobotAccess > session.timeout){
          session.invalidate
       }
    }
}

当请求到达servlet容器时,它首先由过滤器(如果已定义)处理,然后由servlet处理。 Filters are useful for

  

过滤器的常见方案是您要应用的方案   对组的请求或响应进行预处理或后处理   servlet,而不仅仅是一个servlet。如果你需要修改   只需要一个servlet的请求或响应,就没有必要创建一个   filter - 直接在servlet本身中执行所需的操作。

由于您可以从过滤器访问会话,因此它们更适合您的逻辑。您不会通过额外的检查来污染servlet的逻辑,并且可以将其应用于其他servlet。过滤器也是servlet规范的一部分,因此可以在任何容器中使用。

你已经知道了这件事,但我只是把它们放在“纸上”:-D