# HttpSession對象 **HttpSession**對象是javax.servlet.http.HttpSession的實例,該**介面**井不像HttpServletRequest或 HttpServletResponse還存在一個父介面,該介面只是一個純粹的介面。這因為session本 ...
HttpSession對象
HttpSession對象是javax.servlet.http.HttpSession的實例,該介面井不像HttpServletRequest或
HttpServletResponse還存在一個父介面,該介面只是一個純粹的介面。這因為session本身就屬於HTTP協議的
範疇。
對於伺服器而言,每個來連接到它的客戶端都是一個Session,Servlet容器使用此介面創建HTTP客戶端和HTTP伺服器之間的會話。會話將保留指定的時間段,跨多個連接或來自用戶的頁面請求。一個會話通常對應於一個用戶,該用戶可能多次訪問一個站點。可以通過此介面查看和操作有關的某個會話的信息,比如會話標識符、創建時間和最後一次訪問時間。在整個Session中,最重要的就是屬性的操作。
Session 無論客戶端還是伺服器端都可以感知到,若重新打開一個新的瀏覽器,則無法取得之前設置的Session,因為每一個Session只保存在當前的瀏覽器中,併在相關的頁面取得。
Session 的作用就是為了標識一次會話,或者說確認一個用戶;並且在一次會話(一個用戶的多次請求)期間共用數據,我們可以通過 request.getSession()方法,來獲取當前會話的Session對象。
@WebServlet("/ser01")
public class Session01 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//獲取Session對象,獲取Session對象時,會先判斷Session對象是否存在,如果存在則獲取,不存在,則創建
HttpSession session = req.getSession();
//獲取Session對象的會話標識符
System.out.println(session.getId());
//獲取Session對象的創建時間
System.out.println(session.getCreationTime());
//獲取最後一次訪問時間
System.out.println(session.getLastAccessedTime());
//判斷是否是新的Session對象
System.out.println(session.isNew());
}
}
標識符JSESSIONID
Session既然是為了標識一次會話,那麼此次會話就應該有一個唯一的標誌,這個標誌就是sessionld。
每當一次請求到達伺服器,如果開啟了會話(訪問了session),伺服器第一步會查看是否從客戶端回傳一個
名為JSESSIONID的cookie,如果沒有則認為這是一次新的會話,會創建一個新的session對象,並用唯一的
sessionld為此次會話做一個標誌。如果有JESSIONID這個cookie回傳,伺服器則會根據JSESSIONID這個值去查
看是否含有id為SESSION值的session對象,如果沒有則認為是一個新的會話,重新創建個新的session對像,
並標誌此次會話:如果找到了相應的session對象,則認為是之前標誌過的一次會話,返回該session對像,數
據達到共用。
這裡提到一個叫做JSESSIONID的cookie,這是一個比較特殊的cookie,當用戶請求伺服器時,如果訪問了
session,則伺服器會創建一個名為JSESSIONID,值為獲取到的session(無論是獲取到的還是新創建的)的
sessionld的cookie對象,並添加到response對象中,響應給客戶端,有效時間為關閉瀏覽器。
所以Session的底層依賴Cookie來實現。
Session域對象
Session 用來表示一次會話,在一次會話中數據是可以共用的,這時 session 作為域對象存在,可以通過 setAttribute(name, value)方法向域對象中添加數據,通過 getAttribute(name)從域對象中獲取數據,可以通過 removeAtttribute(name)方法從域對象中移除數據。
//獲取Session對象
HttpSession session = req.getSession();
//設置Session域對象
session.setAttribute("uname", "admin");
//獲取指定名稱的Session域對象
String uname = (String) request.getSession().getAttribute("uname");
//移除Session域對象
session.removeAttribute("uname");
數據存儲在 Session 域對象中,當域對象不存在了,或者是兩個不一樣的 Session對象時,數據也就不能共用了。
Session對象的銷毀
預設到期時間
當客戶端第一次請求 servlet 並且操作 session 時, session 對象生成,Tomcat 中 session 預設的存活時間為 30 min,即你不操作界面的時間,一旦有操作,session就會重新計時。
那麼 session 的預設時間可以改嗎?答案是肯定的。
可以在 Tomcat 的 conf目錄下的 web.xml 文件中進行修改。
<!-- session 預設的最大不活動時間。單位:分鐘。-->
<session-config>
<session-timeout>30</session-timeout>
</session-config>
自己設定到期時間
當然除了以上的修改方式外,我們也可以在程式中自己設定 session 的生命周期,通過 session.setMaxInactiveInterval(int) 來設定 session 的最大不活動時間,單位為秒。
//獲取 session對象
HttpSession session = req.getSession();
//設置Session對象的最大不活動時間
session.setMaxInactiveInterval(15);//15秒失效
當然我們也可以通過 getMaxInactiveInterval() 方法來查看當前 Session對象 的最大不活動時間。
//獲取Session對象的最大不活動時間
System.out.println("Session對象的最大不活動時間" + session.getMaxInactiveInterval());
立刻失效
或者我們也可以通過 session.invalidate( ) 方法讓 session 立刻失效。
session.invalidate();
關閉瀏覽器
從前面的JESSION可知道,session的底層依賴cookie實現,並且該cookie的有效時間為關閉瀏覽器,從
而session在瀏覽器關閉時也相當於失效了(因為沒有JSESSION再與之對應)。
關閉伺服器
當關閉伺服器時,session銷毀。
Session失效則意味著此次會話結束,數據共用結束。