68

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

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

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

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

4

12 回答 12

43

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

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

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

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

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

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

于 2013-03-13T11:16:01.253 回答
39
<session-config>
    <session-timeout>-1</session-timeout>
</session-config>

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

于 2013-03-13T10:44:17.400 回答
9

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

于 2013-03-13T11:55:27.477 回答
9

哈克方式:

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

session.setMaxInactiveInterval(TWO_HOURS_IN_SECONDS)

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

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

于 2013-03-15T17:39:36.927 回答
8
<session-config>
        <session-timeout>-1</session-timeout>
</session-config>

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

于 2013-03-13T10:40:43.437 回答
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> -->

只需评论或删除即可!谭塔拉兰坦,谭谭!

于 2014-10-07T19:24:52.707 回答
5

文档说:

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

于 2015-10-27T19:03:46.117 回答
3

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

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

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

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

<session-config>
    <session-timeout>-1</session-timeout>
</session-config>
于 2014-02-04T06:10:39.477 回答
1

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

于 2015-04-16T17:32:09.653 回答
0

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

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

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

于 2013-03-13T10:45:48.520 回答
0

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

于 2017-03-24T04:22:58.047 回答
-2

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

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

于 2013-03-13T17:55:12.660 回答