Java Session會話追蹤原理深入分析
一、會話技術
客戶端和服務器通信的過程中,自然而然的會產生一些數據交互。比如,A用戶登錄瞭郵箱,那麼web服務器該怎麼知道C一段時間後的登錄狀態呢?雖然HttpServletRequest對象和ServletContext對象都可以保存數據,但是不適用於這種情況。
- 客戶端的每次請求,服務器都會產生一個HttpServletRequest對象,該對象隻保存請求所傳遞的數據。
- 用一個WEB應用共享一個ServletContext對象,所以當多個用戶登錄時就有可能會造成數據混淆。
當瀏覽器向ServletB發出請求時,它的登陸操作已經完成瞭,但是卻沒有留下任何依據能夠證明它已經成功登陸。以至於ServletB對他的登陸狀態無法判別,這種情況叫用戶狀態的丟失。造成這種結果的原因是http協議的無狀態;
為瞭解決這個問題,Servlet提供瞭會話跟蹤技術來追蹤用戶狀態,簡單的說就是指將用戶操作過的重要業務步驟記錄下來,以便在後續的處理中使用。
二、Session
1.原理
客戶端瀏覽器第一次訪問,服務器端創建一個會話對象。並且具有id的唯一值。依賴cookie將sessionId的值發送給客戶端。第二次請求的時候,客戶端瀏覽器攜帶sessionId到服務器。服務器端獲得sessionId,從而實現瞭會話跟蹤。
2.特點
創建在服務器端,並且保存在服務器端 。
3.獲得一個會話對象
import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; @WebServlet("/testsession.do") public class testSessionServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("testSessionServlet被請求到瞭"); HttpSession session = req.getSession(); //當調用getSession(true)時,他首先檢查用戶的會話Cookie是否存在 //如果不存在:為其創建新的session對象,將session對象的ID保存到新建的會話Cookie中,並 將會話cookie送回瀏覽器 。 //如果存在:則按照會話Cookie 的值找到對應的session對象返回。 System.out.println(session.getId()); } }
4.Session常見方法
// 獲取Session HttpSession session = request.getSession(); // 將指定Key-Value鍵值對,存入當前Session會話中。 void setAttribute(String name, Object value); // 按照指定的Key從當前Session會話中獲取Value,返回值為Object類型的對象,如果不存在,則返回null。 Object getAttribute(String name); // 按照指定的Key從當前Session會話中刪除Key-Value鍵值對。 void removeAttribute(String name); // 獲取當前Session會話的創建時間。 long time = session.getCreationTime(); // 獲取當前Session會話最後一次請求的訪問時間。 long lastAccessedTime = session.getLastAccessedTime(); // 獲取當前Session會話的SESSION ID String id = session.getId(); //設置最大有效時間,以秒為單位 session.setMaxInactiveInterval(100); // session失效 session.invalidate();
三、Cookie和Session的區別
- 保存的位置不同:cookie保存在瀏覽器端,session保存在服務端。
- 使用方式不同:cookie如果在瀏覽器端對cookie進行設置對應的時間,則cookie保存在本地硬盤中,此時如果沒有過期,則就可以使用,如果過期則就刪除。如果沒有對cookie設置時間,則默認關閉瀏覽器,則cookie就會刪除。session:我們在請求中,如果發送的請求中存在sessionId,則就會找到對應的session對象,如果不存在sessionId,則在服務器端就會創建一個session對象,並且將sessionId返回給瀏覽器,可以將其放到cookie中,進行傳輸,如果瀏覽器不支持cookie,則應該將其通過encodeURL(sessionID)進行調用,然後放到url中。
- 存儲內容不同:cookie隻能存儲字符串,而session存儲結構類似於hashtable的結構,可以存放任何類型。
- 存儲大小:cookie最多可以存放4k大小的內容,session則沒有限制。
- session的安全性要高於cooKie
- cookie的session的應用場景:cookie可以用來保存用戶的登陸信息,如果刪除cookie則下一次用戶仍需要重新登錄;session就類似於我們拿到鑰匙去開鎖,拿到的就是我們個人的信息,一般我們可以在session中存放個人的信息或者購物車的信息。
- session和cookie的弊端:cookie的大小受限制,cookie不安全,如果用戶禁用cookie則無法使用cookie。如果過多的依賴session,當很多用戶同時登陸的時候,此時服務器壓力過大。sessionId存放在cookie中,此時如果對於一些瀏覽器不支持cookie,此時還需要改寫代碼,將sessionID放到url中,也是不安全。
到此這篇關於Java Session會話追蹤原理深入分析的文章就介紹到這瞭,更多相關Java Session會話追蹤內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 淺談Servlet的Cookie和Session機制
- 基於Cookie與Session的Servlet API會話管理操作
- Java中Session的詳解
- java開發web前端cookie session及token會話機制詳解
- Javaweb會話跟蹤技術Cookie和Session的具體使用