在web.xml中的Session TimeOut

时间:2013-03-13 10:36:16

标签: java java-ee servlets web.xml

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

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

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

我的应用程序正在导入/上传.txt文件,由于需要导入数百万条记录,因此该文件的使用时间超过1小时。 但是,虽然我的应用程序仍在导入正在进行的.txt文件,但会话在1小时后超时。 当应用程序在后台执行某项任务时,此类应用程序不应超时。

12 个答案:

答案 0 :(得分:40)

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

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

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

  • 您可以在任务运行时 ping 您的后端触摸会话并防止其过期
  • 增加服务器内的<session-timeout>,但我不推荐这个
  • 在专用线程中运行您的任务,该线程在工作时触摸(扩展)会话或在线程完成时通知用户

有一个类似的问题,也许你可以在你的项目中调整这个解决方案的一部分。看看this

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

答案 1 :(得分:36)

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

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

答案 2 :(得分:9)

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

答案 3 :(得分:9)

Hacky方式:

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

session.setMaxInactiveInterval(TWO_HOURS_IN_SECONDS)

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

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

答案 4 :(得分:7)

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

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

答案 5 :(得分:6)

文档说:

  

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

答案 6 :(得分:5)

您可以看到许多选项作为问题的答案,但是您可以使用&#34; -1&#34;会话永不过期的地方。因为您不知道线程完成所需的时间。 E.g:

   <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> -->

只需评论或删除它即可! Tan tararantan,晒黑!

答案 7 :(得分:3)

你可以用两种方式为这个问题申报时间..

1)要么在这段时间之间花费太长时间才能完成文件阅读。

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

2)宣布永不过期的时间。

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

答案 8 :(得分:1)

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

答案 9 :(得分:0)

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

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

应该导致根本没有超时 - &gt;无限

答案 10 :(得分:0)

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

答案 11 :(得分:-2)

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

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