2013-06-19 29 views
0

在我們的應用程序中,一旦用戶登錄,我們在JSF/PrimeFaces,Spring和Hibernate中使用 ,我們在數據庫中設置一個標誌,直到用戶從應用程序註銷或會話過期。問題是,我們需要清除DB中的這個標誌,即使他只是在沒有正確註銷的情況下關閉瀏覽器。爲了達到這個目的,我已經嘗試了jquery $window.unload$window.bind函數,它們實際調用一些與<p:remoteCommand>相關聯的JS函數,後者又調用託管bean方法來清除數據庫。不過,後來我才知道這是不可靠的,而且在測試的同時我們也看到這個事件並沒有一貫地解除。我怎樣才能實現數據庫清理?如何清除jsf中關閉瀏覽器的數據庫條目?

+0

會提示基於超時的方法 – sidgate

+0

有沒有辦法檢測瀏覽器是否關閉。這不可能。 – Makky

+0

由於問題太常見了,我不得不相信必須有一些解決辦法。儘管Iamyet嘗試這樣做,但我們可以寫一個過濾器並嘗試清除過濾器的銷燬方法中的標誌嗎?只是一個預感! ! –

回答

1

在瀏覽器上關閉關閉不可靠。您可以使用beforeunload事件,但這不是全世界都知道的每個瀏覽器都支持的,甚至終端用戶可以禁用/欺騙/破解。那麼我們在解僱ajax請求時並沒有談論競爭條件:在瀏覽器關閉之前ajax請求是否會全部到達?通常情況下,情況並非如此,瀏覽器關閉勝過ajax請求。

只是在會話過期時監聽服務器端。

@WebListener 
public class MyHttpSessionListener implements HttpSessionListener { 

    @Override 
    public void sessionCreated(HttpSessionEvent event) { 
     // NOOP. 
    } 

    @Override 
    public void sessionDestroyed(HttpSessionEvent event) { 
     HttpSession session = event.getSession(); 
     // Do your job here. 
     // ... 
    } 

} 

注意,這也激活時,你的方案註銷過程中顯式調用ExternalContext#invalidateSession()(或HttpSession#invalidate())。

+0

嗯...我也想知道這樣的事情。不管怎麼樣,你的答案都是thanx mate。試試吧,讓你知道結果。 –

+0

問題是當瀏覽器關閉時sessionDestroyed沒有被調用。您對此有何看法? –

+0

當會話被銷燬時會調用它,這是在瀏覽器關閉後X分鐘發生的。該X默認爲30分鐘,並可在web.xml中配置。 – BalusC

相關問題