Primefaces fileUpload和session timout

opf*_*fau 7 jsf servlets file-upload session-timeout primefaces

如果上传了几个非常大的文件,会发生会话超时吗?想象一下,我上传了一个5 GByte的大文件,并设置了短会话超时.流式传输文件时会发生会话超时吗?

Bal*_*usC 9

是的,它可以.该servlet规范并禁止无处一个会话可以主动请求过程中被破坏.因此,ViewExpiredException当这样的上传到达bean时,您将面临风险.

如果这是您关注的问题,您有以下几种选择:

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

    <p:fileUpload ... />
    <p:poll interval="#{session.maxInactiveInterval - 10}" async="true" />
    
    Run Code Online (Sandbox Code Playgroud)

    10秒的差异只是为了防止它太迟到达几秒钟,因为页面本身也可能需要一些时间来加载所有HTML并初始化轮询.如有必要,您可以在开始上传时有条件地启动/呈现轮询.


  2. 让上传的"onstart"事件将会话超时增加到某个限制(小时?),并让上传的"oncomplete"事件将其恢复.

    <p:fileUpload ... onstart="increaseTimeout()" oncomplete="resetTimeout()" />
    <p:remoteCommand name="increaseTimeout" listener="#{bean.increaseTimeout}" />
    <p:remoteCommand name="resetTimeout" listener="#{bean.resetTimeout}" />
    
    Run Code Online (Sandbox Code Playgroud)

    您可以在bean中使用ExternalContext#setSessionMaxInactiveInterval()以秒为单位设置所需的会话超时.


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

    <f:view transient="true">
        ...
    </f:view>
    
    Run Code Online (Sandbox Code Playgroud)

    注意:绑定到此类视图的任何视图范围bean都将表现为请求范围的bean.为避免混淆,请在必要时替换注释.