【发布时间】:2015-12-23 04:11:12
【问题描述】:
如果上传了几个非常大的文件,会发生会话超时吗?想象一下,我上传了一个 5 GB 的大文件并设置了一个短会话超时。在流式传输文件期间是否会发生会话超时?
【问题讨论】:
标签: jsf servlets file-upload primefaces session-timeout
如果上传了几个非常大的文件,会发生会话超时吗?想象一下,我上传了一个 5 GB 的大文件并设置了一个短会话超时。在流式传输文件期间是否会发生会话超时?
【问题讨论】:
标签: jsf servlets file-upload primefaces session-timeout
是的,可以。 servlet specification 没有任何地方禁止在活动请求期间销毁会话。因此,当此类上传到达 bean 时,您将面临ViewExpiredException 的风险。
如果这是您的顾虑,您有多种选择:
让上传表单每隔一段时间异步轮询服务器以保持会话处于活动状态。您可以在 EL 中使用#{session.maxInactiveInterval} 获取当前超时时间(以秒为单位)。
<p:fileUpload ... />
<p:poll interval="#{session.maxInactiveInterval - 10}" async="true" />
10 秒的差异只是为了防止它来得太晚,因为页面本身也可能需要一些时间来加载所有 HTML 并初始化投票。如有必要,您可以在开始上传时有条件地启动/呈现投票。
让上传的“onstart”事件将会话超时增加到一定的限制(小时?),让上传的“oncomplete”事件放回去。
<p:fileUpload ... onstart="increaseTimeout()" oncomplete="resetTimeout()" />
<p:remoteCommand name="increaseTimeout" listener="#{bean.increaseTimeout}" />
<p:remoteCommand name="resetTimeout" listener="#{bean.resetTimeout}" />
您可以在 bean 中使用 ExternalContext#setSessionMaxInactiveInterval() 以秒为单位设置所需的会话超时。
使用stateless JSF 表单。无论 HTTP 会话的行为如何,视图都不会过期。
<f:view transient="true">
...
</f:view>
注意:任何绑定到此类视图的视图范围 bean 的行为都类似于请求范围的。为避免混淆,如有必要,请替换注释。
【讨论】:
p:fileUpload 在我的情况下不再可见。它位于一个对话框中,该对话框将被关闭并通过 javascript 调用启动上传。
multiple="true"时,文件是同时发送的,所以onstart被调用一次。这些文件是单独处理的,因此每个文件都会调用oncomplete。这将使选项 2 成为糟糕的选择,而选项 1 成为更好的选择。尽管如此,选项 1 在任何情况下都是最可靠的,因为您事先不知道上传需要多长时间。在这个问题的上下文中,不确定您所说的“文件上传 servlet”是什么意思。