如果上传了几个非常大的文件会导致会话超时吗?想象一下,我上传了一个5 GByte的大文件,并设置了短会话超时。流式传输文件时会发生会话超时吗?
答案 0 :(得分:9)
是的,它可以。 servlet specification无处可以禁止在活动请求期间销毁会话。因此,当这样的上传到达bean时,您将冒ViewExpiredException
的风险。
如果这是您关心的问题,您可以选择以下几种方法:
让上传表单间隔地异步轮询到服务器以保持会话处于活动状态。您可以在EL中使用#{session.maxInactiveInterval}
以秒为单位获取当前超时。
<p:fileUpload ... />
<p:poll interval="#{session.maxInactiveInterval - 10}" async="true" />
10秒的差异只是为了防止它太迟到达几秒钟,因为页面本身也可能需要一些时间来加载所有HTML并初始化轮询。如有必要,您可以在开始上传时有条件地启动/呈现投票。
让#34; onstart&#34;上传事件会将会话超时增加到某个限制(小时?)并让&#34; oncomplete&#34;上传事件将其归还。
<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都会像请求范围的那样行为。为避免混淆,请在必要时替换注释。