2012-09-01 25 views
4

刪除數據庫中的數據:當我的web應用程序在用戶登錄,創建一個會話如何在關閉瀏覽器

session.setAttribute("SessionNumber","100"); 

而且他的用戶名添加到指定的表ONLINE_USERS. 其他在線用戶能看到他,他們看到所有在線用戶

當在註銷用戶點擊按鈕,我從表中刪除該行,然後我用刪除會話:

session.invalidate(); 

但假設用戶存在瀏覽器,他的會話將會消失,但該行將作爲在線用戶保留在數據庫中,如何避免這種情況?

我在Netbeans上使用JSP-Servlets。

回答

6

您可以啓用自定義HttpSessionListener刪除會話失效時的表格行。

public class YourHttpSessionListener implements HttpSessionListener {  
    public void sessionCreated(HttpSessionEvent event) { 
    //put row in the database 
    } 

    public void sessionDestroyed(HttpSessionEvent event) { 
    //delete the row from database  
    } 
} 

聲明在你的web.xml聽衆:

<listener> 
    <listener-class>YourHttpSessionListener</listener-class> 
</listener> 

注意,會有用戶退出瀏覽器,他會在服務器上過期的時刻之間的延遲。但會話過期時間是可配置的。您應該找到合適的到期超時時間:不要太長,以免在線用戶顯示過多的離線用戶,但不能太短以允許連接用戶空閒。

我認爲這是一個很好的折衷與基本servletjsp技術開發的聊天應用程序。

+1

沒關係,如果它不是即時的,但延遲可能超過5分鐘?我應該在哪裏編寫這些代碼?我有index.jsp,chat.jsp,這是用戶花時間聊天的地方。 –

+1

延遲可能會與您在web.xml中配置的會話過期超時一樣長(默認30分鐘)。 'HttpSessionListener'是獨立於任何jsp文件的獨立java類。 – dcernahoschi

1

據我所知你希望看到用戶在網站上運行的時刻,HttpSessionListener的問題是該會話可以在其銷燬之前生存很長時間,所以可能會發生用戶長時間未使用該網站當它被摧毀。 (見http://www.smartsoftwarebits.com/qaa/46-misc/82-how-to-set-session-timeout-for-tomcat

解決方案:您可以將列添加到將其保存用戶所做的最後一個請求 的時間戳數據庫。爲了使這個列保持最新狀態,請使用servlet過濾器。 (http://docs.oracle.com/javaee/6/api/javax/servlet/Filter.html

要清除在線用戶,請添加一個計時器作業(例如使用石英),您將刪除比(例如)5分鐘更早的行(在線用戶)(因此,當上次交互超過5分鐘)(http://quartz-scheduler.org/

使用這個,你現在可以相當精確地說,如果有用戶是「仍然存在」或沒有。

此外,您可以添加一個計時器到客戶端JavaScript定期做出ajax呼叫。當用戶沒有關閉瀏覽器時,您可以以這種方式處理這種情況。

+0

通過這種方式,您可以清除有效會話:未關閉瀏覽器但超過5分鐘未激活的用戶。 – dcernahoschi

+0

是的,用ajax調用更新了答案:) 但是也有問題,並且取決於實際的網站,如果我們想要將非活動用戶作爲「在線」來處理 – csviri

1

的第一件事是,當瀏覽器關閉

你可以試試下面的代碼片段在JSP打一個js函數,它會調用一個Ajax功能,達到服務器端組件趕上事件。然後只需使用會話API來使會話無效並添加代碼以從表中刪除記錄。

window.onbeforeunload = WindowClose; 

function WindowClose() { 

    //Write a AJAx request here to hit the server side servlet to invalidate the session 

} 

或者使用

<body onunload="WindowClose(); > 

在服務器端代碼,使用

HttpSession的會議= request.getsession(); session.setMaxInactiveInterval(0); //或session.invalidate();

在web.xml中定義默認會話超時值是一種很好的方法,這樣在瀏覽器崩潰時,會話將在規定的時間量過去後失效。

<session-config> 
<session-timeout>30</session-timeout> 
</session-config> 
相關問題