Primefaces fileUpload和session timout

时间:2015-09-25 10:34:19

标签: jsf servlets file-upload primefaces session-timeout

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

1 个答案:

答案 0 :(得分:9)

是的,它可以。 servlet specification无处可以禁止在活动请求期间销毁会话。因此,当这样的上传到达bean时,您将冒ViewExpiredException的风险。

如果这是您关心的问题,您可以选择以下几种方法:

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

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

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

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

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

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

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