Primefaces 文件上传和会话超时
Primefaces fileUpload and session timout
如果上传了几个非常大的文件,会不会出现会话超时?假设我上传了一个 5 GByte 的大文件并设置了一个短会话超时。流式传输文件期间是否会发生会话超时?
是的,可以。这样一个上传到bean时servlet specification does nowhere forbid that a session could be destroyed during an active request. You'll thus risk a ViewExpiredException
。
如果这是您的顾虑,您有多种选择:
让上传表单每隔一段时间异步轮询服务器以保持会话存活。您可以在 EL 中使用 #{session.maxInactiveInterval}
以秒为单位获取当前超时。
<p:fileUpload ... />
<p:poll interval="#{session.maxInactiveInterval - 10}" async="true" />
10 秒的差异只是为了防止它到达太晚几秒,因为页面本身也可能需要一些时间来加载所有 HTML 并初始化轮询。如有必要,您可以有条件地 start/render 在开始上传时进行投票。
让上传的"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 的行为都与请求范围的 bean 相同。为避免混淆,请在必要时替换注释。
如果上传了几个非常大的文件,会不会出现会话超时?假设我上传了一个 5 GByte 的大文件并设置了一个短会话超时。流式传输文件期间是否会发生会话超时?
是的,可以。这样一个上传到bean时servlet specification does nowhere forbid that a session could be destroyed during an active request. You'll thus risk a ViewExpiredException
。
如果这是您的顾虑,您有多种选择:
让上传表单每隔一段时间异步轮询服务器以保持会话存活。您可以在 EL 中使用
#{session.maxInactiveInterval}
以秒为单位获取当前超时。<p:fileUpload ... /> <p:poll interval="#{session.maxInactiveInterval - 10}" async="true" />
10 秒的差异只是为了防止它到达太晚几秒,因为页面本身也可能需要一些时间来加载所有 HTML 并初始化轮询。如有必要,您可以有条件地 start/render 在开始上传时进行投票。
让上传的"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 的行为都与请求范围的 bean 相同。为避免混淆,请在必要时替换注释。