2013-03-13 80 views
58

我想了解Web.xml中会话配置的会话超时的真正目的。web.xml中的Session TimeOut

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

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

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

+0

在会话超时标记内增加您的号码。如果您有任何疑问,请联系我。坦克 – 2013-03-13 10:41:30

+7

如果有任何进程正在进行,我认为会话不会过期。如果应用程序在该段时间内空闲,会话将到期。如果一些后台进程正在进行,您的闲置人员不会闲置。 – 2013-03-13 10:49:15

+4

我不确定你的应用程序导入是如何工作的。如果应用程序正在等待I/O完成,那么它肯定是空闲的,并且会超时 – Joe2013 2013-03-13 10:54:25

回答

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

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

+0

问题是即使会话处于活动状态(执行某些操作),为什么会在60分钟后过期? – 2013-03-13 10:46:44

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

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

+2

@PeakGen:请这么好,不要只是反对。所以它过期了?在什么时候这样做? – zb226 2016-08-03 09:12:52

+0

@ zb226:评论前,请务必检查线程日期:) – 2016-08-03 09:53:34

+2

@PeakGen:我不认为线程日期是相关的。其他信息将是相关的。 – zb226 2016-08-18 15:59:11

0

如果您不想超时发生了某种目的的更多信息:

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

应导致没有超时的话 - >无限

+0

问题是,即使会话处于活动状态(执行某些操作),为什么会在60分钟后过期? – 2013-03-13 10:48:44

38

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

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

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

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

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

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

+2

请注意,用户登录和会话是两件独立的事情。一般来说servlet没有“注销”。服务器需要一个“注销”页面来明确调用_HttpSession_的_invalidate()_方法。 – 2013-11-21 17:14:30

9

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

-2

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

这可能会导致延迟导致会话过期。

+0

当请求正在处理时,会话可能过期。对于例如如果会话超时设置为15分钟,并且收到的请求时间为20分钟,并且服务器此时未收到任何请求,则会话超时。 – user1707141 2015-10-14 19:45:56

9

哈克的方式:

当大量上传/下载,预计您可以编程增加会话超时。

session.setMaxInactiveInterval(TWO_HOURS_IN_SECONDS) 

当过程结束时,您可以将超时设置恢复为其默认值。

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

3

您可以用两种方法对这个问题申报时间..

1)要么放弃过很长一段时间,你的文件读取是在这段时间之间完成。

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

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

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

这是一个不错的提示。非常感谢+1 – 2014-05-20 17:46:21

4

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

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

或者,如果你不想超时发生了某种目的:

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

另一个选择可能是增加的数量为1000,等,等,BLA BLA,喇嘛。

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

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

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

只是评论或删除就是它! Tan tararantan,晒黑!

+4

0和-1之间有什么区别? – efirat 2016-02-10 19:57:37

1

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

5

的文档说:

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

0

你应该考虑拆分大文件块,并依靠多线程处理能力,在一次处理多个文件 OR 让使用TimerTask的运行作为后台任务的全过程,并另写查询就知道如果可以知道文件或记录的处理时间,则可以显示包含进度条的浏览器的状态。