web.xml中的会话超时


67

我正在尝试了解Web.xml中会话配置的真正目的,用于会话超时。

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

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

我的应用程序正在导入/上载.txt文件,因为要导入的记录数百万条,因此该文件将花费超过1个小时的时间。但是,尽管我的应用程序仍在导入正在进行的.txt文件,但是会话在1小时后超时。这样的应用程序不应超时,因为该应用程序在后台执行某些任务。


在会话超时标签内增加您的电话号码。坦克
Adalarasan_Serangulam 2013年

7
如果正在进行任何进程,我认为会话将​​不会过期。如果该时间段内应用程序处于空闲状态,则会话期满。如果正在进行某些后台进程,您的空闲状态将不空闲。
Jeevan Patil

4
我不确定您的应用程序导入方式。如果应用程序正在等待I / O完成,则肯定它处于空闲状态,并且会超时
Joe2013年

您是否已在客户端设置了JavaScript计时器,以在60分钟后请求退出页面?如果是这样,则需要在开始上传之前将其禁用。
jt。

8
我只是想知道答案中没有人提到这可能是设计缺陷问题。如果您要进行如此长时间的处理,则很可能没有理由将其耦合到用户会话。将文件上传到服务器,然后异步处理。
2015年

Answers:


43

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

当服务器仍在执行任务时,会话无效的原因是因为客户端(用户浏览器)与服务器端之间没有通过http请求之类的通信。因此,服务器无法了解用户状态,认为他正在空闲并在设置的时间后使会话无效web.xml

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

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

有人问过类似的问题,也许您可​​以在项目中调整此解决方案的各个部分。看看这个

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


3
请注意,用户登录和会话是两个独立的事物。通常,没有servlet的“注销”。服务器将需要一个“注销”页面,该页面显式调用HttpSessioninvalidate()方法。
大卫·巴拉西奇(DavidBalažic),

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

您可以在会话永不过期的地方使用“ -1”。由于您不知道线程完成将花费多少时间。


2
@PeakGen:请保持友好,不要只是反对。这样就到期了吗?在什么时间之后呢?
zb226 '16

@ zb226:在发表评论之前,请确保检查线程日期:)
PeakGen '16

2
@PeakGen:我认为线程日期不重要。其他信息将是相关的。
zb226 '16

@ zb226:线程日期很重要,因为我什至不记得这个问题是什么。无论如何,我真的没有时间争论3年的记录,如果您想将此用户的答案视为正确的答案,那么没问题,这完全取决于您。
PeakGen

9
我非常同意@ zb226的意见,“错误的会话确实过期”的注释没有提供足够的信息。会话何时过期?您基于此观察结果?尽管答案已有多年历史,但人们现在也参考这些答案!
Skrii

9

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


9

骇客方式:

当预期下载/下载较大时,可以通过编程方式增加会话超时。

session.setMaxInactiveInterval(TWO_HOURS_IN_SECONDS)

该过程结束后,您可以将超时设置回其默认值。

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


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

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


问题是,即使会话处于活动状态(正在执行某项操作),为什么它在60分钟后过期?
Suresh Atta 2013年

8

您可以看到许多选项作为问题的答案,但是,在会话永不过期的情况下,您可以使用“ -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> -->

只需评论或删除就可以了!Tan tararantan,棕褐色!


8
0和-1之间有什么区别?
efirat

5

文档说:

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


3

您可以通过两种方式针对此问题声明时间。

1)两者之间的时间间隔过长,以致无法完成文件读取。

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

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

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

1
这是一个不错的提示。非常感谢+1
Khanh Tran 2014年

1

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


0

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

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

应该完全没有超时->无限


1
问题是,即使会话处于活动状态(正在执行某项操作),为什么它在60分钟后过期?
Suresh Atta 2013年

0

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


-2

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

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


1
处理请求时,会话可能会过期。例如,如果将会话超时设置为15分钟,并且接收到的请求大约需要20分钟,并且服务器此时未收到任何请求,则会话超时。
Nikhil Das Nomula
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.