JavaWeb中的Session、SessionListener、線上人數統計

來源:互聯網
上載者:User

測試環境:Tomcat 5.0.28

需要用5.5以上的tomcat,5.5一下會產生一個BUG,sessionDestroyed會執行兩次

JavaWeb中的Session

  • 在JavaWeb中使用HttpSession(以下簡稱session)對象來表示一個會話。
  • Session的建立(代表會話周期的開始):第一次調用request.getSession()方法時,會建立一個session對象。
  • Session的銷毀(代表會話周期的結束):在某個請求周期內調用了Session.invalidate()方法,此請求周期結束後,session被銷毀;或者是session逾時後自動銷毀。
  • 對於JSP,如果指定了<%@ page session="false"%>,則在JSP中無法直接存取內建的session變數,同時也不會主動建立session,因為此時JSP未自動執行request.getSession()操作擷取session。
  • 在session對象剛建立的第一個請求周期內,調用session.isNew()方法將得到true。
  • 可以在web.xml檔案中配置session預設的逾時時間(分鐘):<session-config>
        <session-timeout>10</session-timeout>
    </session-config>

    也可以調用session. setMaxInactiveInterval()方法設定session逾時時間(分鐘)

SessionListener

  • 通過SessionListenr可以監聽session的建立和銷毀,步驟:
    1.寫一個類MySessionListener,實現javax.servlet.http.HttpSessionListener介面及其sessionCreated()、sessionDestroyed()方法
    2.在web.xml中配置SessionListener:<listener>
        <listener-class>MySessionListener類全名</listener-class>
    </listener>
  • 當session被建立和銷毀時,容器會分別調用SessionListener的sessionCreated()方法和sessionDestroyed()方法,這兩個方法中傳入了一個參數對象HttpSessionEvent,可以通過此對象的getSession()方法擷取session對象。

應用:線上人數統計

import java.util.HashSet;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
 
public class MySessionListener implements HttpSessionListener {
 
       public void sessionCreated(HttpSessionEvent event) {
              HttpSession session = event.getSession();
              ServletContext application = session.getServletContext();
              
              // 在application範圍由一個HashSet集儲存所有的session
              HashSet sessions = (HashSet) application.getAttribute("sessions");
              if (sessions == null) {
                     sessions = new HashSet();
                     application.setAttribute("sessions", sessions);
              }
              
              // 新建立的session均添加到HashSet集中
              sessions.add(session);
              // 可以在別處從application範圍中取出sessions集合              // 然後使用sessions.size()擷取當前活動的session數,即為“線上人數”
       }
 
       public void sessionDestroyed(HttpSessionEvent event) {
              HttpSession session = event.getSession();
              ServletContext application = session.getServletContext();
              HashSet sessions = (HashSet) application.getAttribute("sessions");
              
              // 銷毀的session均從HashSet集中移除
              sessions.remove(session);
       }
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.