如果上传了几个非常大的文件,会话超时会发生吗?想象一下,我上传了一个5 GB的大文件,并且设置了较短的会话超时。流传输文件期间是否可能发生会话超时?
最佳答案
是的,它可以。 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的行为都将类似于请求范围的bean。为避免混淆,如有必要,请替换注释。