web.xml 中的会话超时

Posted

技术标签:

【中文标题】web.xml 中的会话超时【英文标题】:Session TimeOut in web.xml 【发布时间】:2013-03-01 05:52:52 【问题描述】:

我试图了解 Web.xml 中会话配置的真正目的是为了会话超时。

<!-- Session Configuration -->
<session-config>
        <session-timeout>60</session-timeout>
</session-config>

现在让我告诉你我的问题。

我的应用程序正在导入/上传一个 .txt 文件,这肯定需要 1 个多小时,因为要导入数百万条记录。 但是会话在 1 小时后超时,尽管我的应用程序仍在导入正在进行的 .txt 文件。 这样的应用程序不应超时,因为应用程序正在后台执行某些任务。

【问题讨论】:

在会话超时标签内增加您的号码。如果您有任何问题,请联系我。坦克 如果有任何进程正在进行,我认为会话不会过期。如果应用程序在该时间段内空闲,则会话过期。如果一些后台进程正在进行,你的不是空闲的。 我不确定您的应用程序导入是如何工作的。如果应用程序正在等待 I/O 完成,那么它肯定是空闲的并且会超时 您是否在客户端设置了 javascript 计时器以在 60 分钟后请求注销页面?如果是这样,您需要在开始上传之前禁用它。 我只是想知道答案中没有人提到这可能是一个设计缺陷问题。如果您正在进行如此长时间的处理,则很可能没有理由将其耦合到用户会话。将文件上传到服务器,然后异步处理。 【参考方案1】:
<session-config>
        <session-timeout>-1</session-timeout>
</session-config>

在上面的代码中"60" stands for the minutes.会话会在60 minutes.之后过期所以如果你想要更多的时间。例如-1 描述的是您的会话永不过期。

【讨论】:

问题是即使会话处于活动状态(正在做某事)为什么它会在 60 分钟后过期??【参考方案2】:
<session-config>
    <session-timeout>-1</session-timeout>
</session-config>

您可以在会话永不过期的情况下使用“-1”。因为你不知道线程完成需要多长时间。

【讨论】:

@PeakGen:请保持友善,不要只是反对。所以会过期吗?它会在什么时间之后执行此操作? @zb226:在评论之前,请务必检查线程日期:) @PeakGen:我不认为线程日期是相关的。其他信息将是相关的。 @zb226:线程日期是相关的,因为我什至不记得这个问题是什么。无论如何,我真的没有时间争论 3 年的记录,如果您想将此用户的答案视为正确的答案,那没问题,完全取决于您。 我非常同意@zb226 的评论“错误。会话确实过期”没有提供足够的信息。会话何时到期?你这个观察的依据是什么?尽管答案已经有好几年了,但人们现在也在参考这些答案!【参考方案3】:

如果您不希望出于某种目的发生超时:

<session-config>
    <session-timeout>0</session-timeout>
</session-config>

应该根本没有超时 -> 无限

【讨论】:

问题是即使会话处于活动状态(正在做某事)为什么它会在 60 分钟后过期??【参考方案4】:

设置一个永不过期的会话超时是不可取的,因为您会可靠地让用户在每次完成后按下注销按钮,以防止您的服务器负载过大(取决于用户数量和硬件)。另外,您可能会遇到一些您宁愿避免的安全问题。

在服务器仍在处理任务时会话无效的原因是因为客户端(用户浏览器)和服务器端之间没有通过例如http请求。因此,服务器无法了解用户状态,认为他处于空闲状态并在您的web.xml 中设置的时间之后使会话无效。

要解决这个问题,您有几种可能性:

您可以在任务运行时ping您的后端以触摸会话并防止它过期 增加服务器内部的&lt;session-timeout&gt;,但我不建议这样做 在专用线程中运行您的任务,该线程在工作时接触(扩展)会话,或在线程完成时通知用户

问了一个类似的问题,也许您可​​以在您的项目中调整此解决方案的部分内容。看看this。

希望这有帮助,玩得开心!

【讨论】:

请注意,用户登录和会话是两个独立的东西。一般来说,servlet 没有“注销”。服务器需要一个显式调用 HttpSessioninvalidate() 方法的“注销”页面。【参考方案5】:

通过 javascript 定期(比如每 60 秒一次)向服务器发送 AJAX Http 请求,以保持与服务器的会话,直到文件上传完成。

【讨论】:

【参考方案6】:

通常在请求处理发生时会话不会过期。我认为有一个 LB 或介于两者之间的东西,它读取整个文件然后调用 Web 容器。

这可能会导致导致会话到期的延迟。

【讨论】:

在处理请求时会话可能会过期。例如如果 session-timeout 设置为 15 分钟,并且它收到一个大约需要 20 分钟的请求,而服务器在这段时间内没有收到任何请求,则会话超时。【参考方案7】:

破解方法:

当需要大量上传/下载时,您可以通过编程方式增加会话超时。

session.setMaxInactiveInterval(TWO_HOURS_IN_SECONDS)

当流程结束时,您可以将超时设置回默认值。

但是.. 当您使用 Java EE 时,上传/下载不需要一个完整的小时,更好的方法是异步运行任务(例如通过 JMS)。

【讨论】:

【参考方案8】:

对于这个问题,你可以通过两种方式声明时间。

1) 要么给你的文件读取完成的时间太长。

<session-config>
    <session-timeout> 1000 </session-timeout>
</session-config>

2) 声明会话永不过期的时间。

<session-config>
    <session-timeout>-1</session-timeout>
</session-config>

【讨论】:

这是一个不错的提示。非常感谢 +1【参考方案9】:

您可以看到许多选项作为您问题的答案,但是您可以使用“-1”表示会话永不过期。由于您不知道线程完成需要多长时间。例如:

   <session-config>
        <session-timeout>-1</session-timeout>
    </session-config>

或者,如果您不希望出于某种目的发生超时:

<session-config>
    <session-timeout>0</session-timeout>
</session-config>

另一种选择是将数字增加到 1000 等等,等等,bla,bla,bla。

但是如果你真的想停止并且你认为你的应用程序没有必要强制用户注销,只需添加一个注销按钮,用户将决定何时离开。

如果您不需要强制注销,并且您正在加载可能需要时间的文件,您可以执行以下操作来解决问题,具体取决于服务器和您的计算机速度以及文件的大小。

<!-- sets the default session timeout to 60 minutes. -->
   <!-- <session-config>
     <session-timeout>60</session-timeout>
   </session-config> -->

只需评论或删除即可!棕褐色,棕褐色!

【讨论】:

0和-1有区别吗?【参考方案10】:

我推荐的另一个选项是创建一个单独的无状态应用程序,它可以接收大文件。在您的主应用上打开一个新窗口或 iframe,它将接受文件并通过该窗口发送文件,然后在使用 Javascript 开始上传后隐藏该窗口或 iframe。

【讨论】:

【参考方案11】:

文档说:

session-timeout 元素定义了此 Web 应用程序中创建的所有会话的默认会话超时间隔。指定的超时必须以整数分钟数表示。如果超时为 0 或更小,则容器确保会话的默认行为永远不会超时。如果未指定此元素,则容器必须设置其默认超时时间。

【讨论】:

【参考方案12】:

您应该考虑将大文件拆分为多个块,并依靠多线程功能一次处理多个文件 要么 使用 TimerTask 让整个进程作为后台任务运行,并编写另一个查询以从浏览器中了解其状态,如果您知道文件或记录的处理时间,则可以显示进度条。

【讨论】:

以上是关于web.xml 中的会话超时的主要内容,如果未能解决你的问题,请参考以下文章

在 spring-boot Web 应用程序中未考虑 web.xml 会话超时?

Apache Tomcat 应用程序的默认会话超时

更改 Spring Web 应用程序的默认会话超时

如何更改 Jahia 中的会话超时?

tomcat 会话超时设置

如何在 Java Web 应用程序中动态设置会话超时?