会话超时在web.xml
我想了解会话超时的Web.xml中的会话configuration的真正目的。
<!-- Session Configuration --> <session-config> <session-timeout>60</session-timeout> </session-config>
现在让我告诉你我的问题。
我的应用程序正在导入/上传一个.txt文件,由于有数百万条logging需要导入,所以这个文件必然要花费1个多小时。 但会话超时1小时后,虽然我的应用程序仍在导入正在进行的.txt文件。 这样的应用程序不应该超时,因为应用程序正在后台执行一些任务。
要设置永不过期的会话超时是不可取的,因为每次完成时都要靠用户按下注销button以防止服务器负载过重(取决于用户和硬件的数量),因此可靠的。 另外还有一些安全问题,你可能会遇到你宁愿避免。
在服务器还在执行任务时,会话失效的原因是因为客户端(用户浏览器)和服务器端之间没有通过例如http请求进行通信。 因此,服务器无法了解用户状态,认为他是空闲的,并在web.xml
设置的时间之后使会话无效。
为了解决这个问题,你有几种可能性:
- 您可以在任务运行时ping通后端,以触摸会话并防止它过期
- 增加服务器内的
<session-timeout>
,但我不会推荐这个 - 在一个专门的线程中运行你的任务,这个线程在工作时触及(扩展)会话,或者在线程完成时通知用户
有一个类似的问题,也许你可以在你的项目中调整这个解决scheme的一部分。 看看这个 。
希望这有助于,有乐趣!
<session-config> <session-timeout>-1</session-timeout> </session-config>
在会话永不过期的情况下,您可以使用“-1”。 既然你不知道需要多less时间才能完成这个线程。
通过javascript定期向服务器发送AJAX Http请求(每60秒一次),以维持与服务器的会话,直到file upload完成。
Hacky方式:
您可以在预计大量上传/下载时以编程方式增加会话超时。
session.setMaxInactiveInterval(TWO_HOURS_IN_SECONDS)
过程结束后,可以将超时设置恢复为默认值。
但是,当你使用Java EE时,上传/下载不需要一整小时,更好的方法是通过asynchronous方式运行任务(通过JMS例如)。
<session-config> <session-timeout>-1</session-timeout> </session-config>
在上面的代码中, "60" stands for the minutes.
会议将在60 minutes.
后过期60 minutes.
所以如果你想要更多的时间。 对于所描述的示例-1
,您的会话永不过期。
文档说:
session-timeout元素为在此Web应用程序中创build的所有会话定义默认会话超时间隔。 指定的超时时间必须以整数分钟表示。 如果超时时间为0或更短,容器将确保会话的默认行为永远不会超时。 如果未指定此元素,则容器必须设置其默认超时期限。
您可以看到许多选项作为您的问题的答案,但是您可以在会话永不过期的情况下使用“-1”。 既然你不知道需要多less时间才能完成这个线程。 例如:
<session-config> <session-timeout>-1</session-timeout> </session-config>
或者,如果你不想为了某种目的而发生超时,
<session-config> <session-timeout>0</session-timeout> </session-config>
另外一个选项可以是增加数量到1000,等等,bla,bla,bla。
但是如果你真的想停下来,并且认为你的应用程序强制用户注销是不必要的,只需添加一个注销button,用户将决定何时离开。
如果您不需要强制注销,并且您正在加载可能花费时间基于服务器,计算机速度和文件大小的文件,则可以采取以下措施来解决问题。
<!-- sets the default session timeout to 60 minutes. --> <!-- <session-config> <session-timeout>60</session-timeout> </session-config> -->
只是评论或删除就是了! 谭塔拉坦,晒黑!
你可以通过两种方式为这个问题申报时间..
1)要么太长时间,你的文件阅读完成在那段时间之间。
<session-config> <session-timeout> 1000 </session-timeout> </session-config>
2)宣布永不过期你的会议的时间。
<session-config> <session-timeout>-1</session-timeout> </session-config>
我build议的另一个select是创build一个独立的应用程序,它将采取大文件无状态。 在您的主应用程序打开一个新的窗口或iframe将接受文件,并通过该窗口发送,然后隐藏窗口或iframe,一旦上载已经开始使用Javascript。
如果你不想为了某种目的而发生超时,
<session-config> <session-timeout>0</session-timeout> </session-config>
应该导致没有超时 – >无限
您应该考虑将大文件分割为块,并依靠multithreadingfunction一次处理多个文件,或者使用TimerTask将整个进程作为后台任务运行,并编写另一个查询以了解其包含的浏览器状态如果可以知道文件或logging的处理时间,则可以显示进度条。
通常会话在请求处理发生时不会过期。 我认为有一个LB或之间的读取整个文件,然后调用Web容器。
这可能会导致延迟,导致会议届满。