【问题标题】:Primefaces fileUpload and session timoutPrimefaces 文件上传和会话超时
【发布时间】:2015-12-23 04:11:12
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    是的,可以。 servlet specification 没有任何地方禁止在活动请求期间销毁会话。因此,当此类上传到达 bean 时,您将面临ViewExpiredException 的风险。

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

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

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

      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}" />
      

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


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

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

      注意:任何绑定到此类视图的视图范围 bean 的行为都类似于请求范围的。为避免混淆,如有必要,请替换注释。

    【讨论】:

    • 非常感谢。我将使用选项 2,因为上传完成后,p:fileUpload 在我的情况下不再可见。它位于一个对话框中,该对话框将被关闭并通过 javascript 调用启动上传。
    • +1 用于提及无状态 JSF 表单! :D 直到现在才知道。将在哪个 jsf 版本中可用?
    • @Fritz:它从 JSF 2.2 开始正式可用,但在 Mojarra 中它已被向后移植到 2.1.19。另见 a.o. stackoverflow.com/q/3642919
    • 使用multiple="true"时,文件是同时发送的,所以onstart被调用一次。这些文件是单独处理的,因此每个文件都会调用oncomplete。这将使选项 2 成为糟糕的选择,而选项 1 成为更好的选择。尽管如此,选项 1 在任何情况下都是最可靠的,因为您事先不知道上传需要多长时间。在这个问题的上下文中,不确定您所说的“文件上传 servlet”是什么意思。
    • 使用选项 2 时,是的。
    猜你喜欢
    • 1970-01-01
    • 2012-06-27
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    • 2012-05-29
    相关资源
    最近更新 更多