servlet容器為每一個Httpsession對象分配一個唯一標志符sessionID。
會話流程:
1.一個瀏覽器第一次訪問支持session的網頁,查找有沒有sessionId的cookie。沒有就創建一個HttpSession對象,分配一個 SessionID,寫到cookie中保存在客戶端。
2.不是第一次訪問,發現有了sessionID的cookie,所以就不會創建新的HttpSession對象。然后就去查找sessionID對應的HttpSession對象。進行操作。
3.重復第2步,直到session銷毀。
jsp頁面默認情況是支持session的。也可以關閉
<%@ page session="false"%>//加上這一句就不支持session,也就不會創建Httpsession對象。HttpSession接口方法getId()//返回sessionidinvalidate()//銷毀httpsession對象setAttribute(name,value)getAttribute(name)getAttributeNames()//得到所有的屬性removeAttribute(name)isNew()//是不是新創建的setMaxInactiveInterval(int interval)//設置不活動狀態的最長時間,超過時間銷毀對象,設置負數表示永遠不過期getMaxInactiveInterval()getServletContext()以下幾種情況會話會被銷毀。1.瀏覽器進程終止。要等到會話過期才會銷毀。
2.服務器執行HttpSession對象的invalidate()方法。
3.會話過期。tomcat默認1800秒。可以設置不過期。 tomcat關閉不會銷毀會話,而是持久化到永久花的存儲設備中。重啟后重新加載會話。可以設置tomcat屬性關閉這種情況。
Jsp默認支持會話,所以有隱含對象session來直接訪問HttpSession。HttpServlet默認不支持會話。可以通過HttpServletRequest來得到HttpServlet對象。
getSession():使得當前HttpServlet支持會話。如果沒有HttpSession對象就創建一個。有就返回原來的對象。
getSession(boolean create)為true,跟getSession()一樣。false會話不存在就返回null,存在就返回原來的對象。
支持會話,瀏覽器不支持cookie時可以用HttpServletResponse.encodeURL(string url)來重寫url。就是在url后面加sessionid來判斷是不是用一用戶,其他情況直接使用url。
會話的持久化
某些情況下,httpSession對象會被持久化到永久化的存儲設備中(數據庫或硬盤)。用到的時候再加載到內存。使用的是java對象序列化技術。
持久化的兩個好處:
1.節省內存空間。把不活動的HttpServlet對象保存到存儲設備中,可以提高內存資源的利用率。
2.服務器重啟后能恢復會話。
會話的兩個狀態:
運行時狀態:對象處于內存中,分為不活動狀態和活動狀態。
持久化狀態:對象位于存儲設備中。
會話從運行時狀態改為持久化狀態叫做擱置或者持久化。一下幾種情況會被擱置。
1.服務器終止。
2.會話處于不活動狀態太久了。超過了限定值。
3.web應用處于活動狀態的會話太多超過了限定值,部分會話會被擱置
會話從持久化到運行時狀態叫做激活或者加載
1.服務器重啟。
2.一個會話的客戶端發送HTTP請求。
會話的持久化是依靠servlet容器的,tomcat的會話管理器有兩種。
1.標準會話管理器StandardManager
這是默認的標準會話管理器,實現機制為:服務器終止,被終止的應用會被持久化。重啟是會激活對象。
2.持久化會話管理器
更靈活,功能:
1.服務器關閉,持久化對象,重啟記載對象。
2.具有容錯功能:及時備份對象(持久化)。服務器意外關閉可以恢復對象。
3.可以控制內存會話數目,將部分會話持久化。
會話的監聽
在servlet api定義了4個監聽器接口
1.HttpSessionListener:監聽創建和銷毀會話的事件。
sessionCreate(HttpSessionEvent event)創建會話后,調用。sessionDestroyed(HttpSessionEvent event)銷毀會話之前,調用。2.HttpServletAttributeListener:監聽加入屬性,替換屬性,刪除屬性的事件。
attributeAdded(HttpSessionBindingEvent event):加入屬性時,調用。attributeRemoved(HttpSessionBindingEvent event):刪除屬性時,調用。attributeReplaced(HttpSessionBindingEvent event):替換屬性時,調用。3.HttpSessionBindingListener監聽會話和屬性綁定或解除綁定的事件。valueBound(HttpSessionBindingEvent event)綁定后執行valueUnbound(HttpSessionBindingEvent event)解除綁定前執行4.HttpSessionActivationListener:監聽激活或者擱置的事件。sessionDidActivate(HttpSessionEvent event)激活后 調用sessionWillPassivate(HttpSessionEvent event)擱置之前調用1和2要在web.xml中<listener>中配置,用一個類實現這兩個接口然后配置<listener><listener-class>實現類路徑</listener-class></listener>。3和4只要一個類實現接口就行了,session.setAttribute("name",實現類)就會觸發綁定事件。用HttpSessionListener統計在線人數
每創建一個session就是數量加1,銷毀就數量減一。把數量保存在servletContext中(event.getSession().getServletContext())。這個接口的兩個方法干好可以用到。不過要在web.xml里面配置監聽器。這個統計的是HttpSession對象的數量,其實不是真正的在線人數。也無法統計在線人數的具體名單。
用HttpSessionBindingListener統計在線人數
用一個類實現這個接口,然后綁定的時候把名字傳到一個公共的類中(這個類有一個static final 自己類=new 自己類這樣就可以確保這個類不會重復創建,然后用一個方法返回這個類對象),就可以從list中取到用戶的名字。統計的也是session對象數量不過可以綁定屬性。
新聞熱點
疑難解答