2015-09-25 70 views
6

如果上傳了幾個非常大的文件,是否會發生會話超時?想象一下,我上傳了一個5 GB的大文件,並設置了一個短會話超時。在傳輸文件的過程中,會話超時是否會發生?Primefaces fileUpload和會話timout

回答

8

是的,它可以。 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的行爲將與請求作用域類似。爲避免混淆,請根據需要替換註釋。

+0

非常感謝。我將使用選項2,因爲在我的情況下,上傳完成時'p:fileUpload'不再可見。它位於一個對話框中,該對話框將被關閉,並通過javascript調用啓動上傳。 – opfau

+0

不客氣。 – BalusC

+1

提及無狀態的JSF表單! :D直到現在才知道。在什麼版本的jsf中可用? – Fritz

相關問題