阻止在码头中更新会话的上次访问时间


是否可以

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

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

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

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 处理。筛选器可用于:

筛选器的常见方案是要在其中应用的方案 对组的请求或响应进行预处理或后处理 的 servlet,而不仅仅是单个 servlet。如果需要修改 仅对一个 servlet 的请求或响应,无需创建 filter — 只需直接在 servlet 本身中执行所需的操作即可。

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

你已经知道这些事情,但我只是把它们放在"纸上":-D

相关内容

  • 没有找到相关文章

最新更新