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

如果这是您的顾虑,您有多种选择:

  1. 让上传表单每隔一段时间异步轮询服务器以保持会话存活。您可以在 EL 中使用 #{session.maxInactiveInterval} 以秒为单位获取当前超时。

    <p:fileUpload ... />
    <p:poll interval="#{session.maxInactiveInterval - 10}" async="true" />
    

    10 秒的差异只是为了防止它到达太晚几秒,因为页面本身也可能需要一些时间来加载所有 HTML 并初始化轮询。如有必要,您可以有条件地 start/render 在开始上传时进行投票。


  2. 让上传的"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() 以秒为单位设置所需的会话超时。


  3. 使用 stateless JSF 表单。无论 HTTP 会话的行为如何,视图都不会过期。

    <f:view transient="true">
        ...
    </f:view>
    

    注意:任何绑定到此类视图的视图范围 bean 的行为都与请求范围的 bean 相同。为避免混淆,请在必要时替换注释。