1. 程式人生 > >Java Web入門之監聽session的銷燬

Java Web入門之監聽session的銷燬

統計線上使用者數等功能需要監聽session的銷燬,有兩種方式:
1. 使用HttpSessionListener監聽session的銷燬。
2. 使用HttpSessionBindingListener監聽session的銷燬。

使用HttpSessionListener

編寫一個OnlineUserListener:

package advance;

import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionListener;
import
javax.servlet.http.HttpSessionEvent; public class OnlineUserListener implements HttpSessionListener { public void sessionCreated(HttpSessionEvent event) {} public void sessionDestroyed(HttpSessionEvent event) { HttpSession session = event.getSession(); ServletContext application = session.getServletContext(); // 取得登入的使用者名稱
String username = (String)session.getAttribute("username"); // 從線上列表中刪除使用者名稱 List onlineUserList = (List)application.getAttribute("onlineUserList"); onlineUserList.remove(username); System.out.println(username + "超時退出"); } }

為了讓監聽器發揮作用,將它新增到web.xml中:

    <listener
>
<listener-class>advance.OnlineUserListener</listener-class> </listener>

以下兩種情況下就會發生sessionDestoryed(會話銷燬)事件:
1.執行session.invalidate()方法時。
2.如果使用者長時間沒有訪問伺服器,超過了會話最大超時時間,伺服器就會自動銷燬超時的session。

JSP中設定Session有效時間的三種方式

(1)在主頁面或者公共頁面中加入:

HttpSession session = request.getSession(true);  
session.setMaxInactiveInterval(900);

單位是秒,即在沒有活動15分鐘後,session將失效。這裡要注意這個session設定的時間是根據伺服器來計算的,而不是客戶端。
(2)在專案的web.xml中設定

<session-config>
    <session-timeout>15</session-timeout>
</session-config>

單位是分鐘。
(3)直接在應用伺服器中設定,如果是tomcat,可以在tomcat目錄下conf/web.xml中找到<session-config>元素,tomcat預設設定是30分鐘,只要修改這個值就可以了。

優先順序:(1)>(2)>(3)

使用HttpSessionBindingListener

HttpSessionBindingListener雖然叫做監聽器,但使用方法與HttpSessionListener完全不同。
HttpSessionListener只需要設定到web.xml中就可以監聽整個應用中的所有session;HttpSessionBindingListener必須例項化後放入某一個session中,才可以進行監聽。
從監聽範圍上比較,HttpSessionListener設定一次就可以監聽所有session,HttpSessionBindingListener通常都是一對一的。

javax.servlet.http.HttpSessionBindingListener介面提供了下面的方法:
public void valueBound(HttpSessionBindingEvent event),當物件正在被繫結到Session中時,Servlet容器會呼叫這個方法來通知該物件
public void valueUnbound(HttpSessionBindingEvent event),當從Session中刪除物件時,Servlet容器呼叫這個方法來通知該物件
Servlet容器通過HttpSessionBindingEvent物件來通知實現了HttpSessionBindingListener介面的物件,而該物件可以利用HttpSessionBindingEvent物件來訪問與它相聯絡的HttpSession物件,javax.servlet.http.HttpSessionBindingEvent類提供了以下方法:
public HttpSessionBingdingEvent(HttpSession session,java.lang.String name)
public HttpSessionBingdingEvent(HttpSession session,java.lang.String name,java.lang.Object value)
public javax.lang.String getName(),返回繫結到Session中或者從Session中刪除的屬性的名字
public java.lang.Object getValue(),返回被新增/刪除/替換的屬性的值,如果屬性被新增或者被刪除,這個方法返回屬性的值,如果這個屬性被替換,這個方法返回屬性先前的值
public HttpSession getSession(),返回HttpSession物件

看一個簡單的例子

package advance;

import javax.servlet.http.HttpSessionBindingListener;
import javax.servlet.http.HttpSessionBindingEvent;

public class BindingListener implements HttpSessionBindingListener
{
    public void valueBound(HttpSessionBindingEvent arg0) {
        System.out.println("valueBound");
    }
    public void valueUnbound(HttpSessionBindingEvent arg0) {
        System.out.println("valueUnbound");
    }
}

不需要配置web.xml,但要將listener加入session的屬性中:

BindingListener  binding = new BindingListener();  
session.setAttribute("anyname", binding );//這個時候要觸發valueBound方法了 

valueUnbound()的觸發條件是以下三種情況:
1. 執行session.invalidate()時。
2. session超時自動銷燬時。
3. 執行session.setAttribute(“anyname”, “其他物件”)或session.removeAttribute(“anyname”)將listener從session中刪除時。只要不將listener從session中刪除,就可以監聽到session的銷燬。

參考