Java Session會(huì)話追蹤原理深入分析
一、會(huì)話技術(shù)
客戶端和服務(wù)器通信的過程中,自然而然的會(huì)產(chǎn)生一些數(shù)據(jù)交互。比如,A用戶登錄了郵箱,那么web服務(wù)器該怎么知道C一段時(shí)間后的登錄狀態(tài)呢?雖然HttpServletRequest對(duì)象和ServletContext對(duì)象都可以保存數(shù)據(jù),但是不適用于這種情況。
- 客戶端的每次請(qǐng)求,服務(wù)器都會(huì)產(chǎn)生一個(gè)HttpServletRequest對(duì)象,該對(duì)象只保存請(qǐng)求所傳遞的數(shù)據(jù)。
- 用一個(gè)WEB應(yīng)用共享一個(gè)ServletContext對(duì)象,所以當(dāng)多個(gè)用戶登錄時(shí)就有可能會(huì)造成數(shù)據(jù)混淆。
當(dāng)瀏覽器向ServletB發(fā)出請(qǐng)求時(shí),它的登陸操作已經(jīng)完成了,但是卻沒有留下任何依據(jù)能夠證明它已經(jīng)成功登陸。以至于ServletB對(duì)他的登陸狀態(tài)無法判別,這種情況叫用戶狀態(tài)的丟失。造成這種結(jié)果的原因是http協(xié)議的無狀態(tài);
為了解決這個(gè)問題,Servlet提供了會(huì)話跟蹤技術(shù)來追蹤用戶狀態(tài),簡(jiǎn)單的說就是指將用戶操作過的重要業(yè)務(wù)步驟記錄下來,以便在后續(xù)的處理中使用。
二、Session
1.原理
客戶端瀏覽器第一次訪問,服務(wù)器端創(chuàng)建一個(gè)會(huì)話對(duì)象。并且具有id的唯一值。依賴cookie將sessionId的值發(fā)送給客戶端。第二次請(qǐng)求的時(shí)候,客戶端瀏覽器攜帶sessionId到服務(wù)器。服務(wù)器端獲得sessionId,從而實(shí)現(xiàn)了會(huì)話跟蹤。
2.特點(diǎn)
創(chuàng)建在服務(wù)器端,并且保存在服務(wù)器端 。
3.獲得一個(gè)會(huì)話對(duì)象
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被請(qǐng)求到了"); HttpSession session = req.getSession(); //當(dāng)調(diào)用getSession(true)時(shí),他首先檢查用戶的會(huì)話Cookie是否存在 //如果不存在:為其創(chuàng)建新的session對(duì)象,將session對(duì)象的ID保存到新建的會(huì)話Cookie中,并 將會(huì)話cookie送回瀏覽器 。 //如果存在:則按照會(huì)話Cookie 的值找到對(duì)應(yīng)的session對(duì)象返回。 System.out.println(session.getId()); } }
4.Session常見方法
// 獲取Session HttpSession session = request.getSession(); // 將指定Key-Value鍵值對(duì),存入當(dāng)前Session會(huì)話中。 void setAttribute(String name, Object value); // 按照指定的Key從當(dāng)前Session會(huì)話中獲取Value,返回值為Object類型的對(duì)象,如果不存在,則返回null。 Object getAttribute(String name); // 按照指定的Key從當(dāng)前Session會(huì)話中刪除Key-Value鍵值對(duì)。 void removeAttribute(String name); // 獲取當(dāng)前Session會(huì)話的創(chuàng)建時(shí)間。 long time = session.getCreationTime(); // 獲取當(dāng)前Session會(huì)話最后一次請(qǐng)求的訪問時(shí)間。 long lastAccessedTime = session.getLastAccessedTime(); // 獲取當(dāng)前Session會(huì)話的SESSION ID String id = session.getId(); //設(shè)置最大有效時(shí)間,以秒為單位 session.setMaxInactiveInterval(100); // session失效 session.invalidate();
三、Cookie和Session的區(qū)別
- 保存的位置不同:cookie保存在瀏覽器端,session保存在服務(wù)端。
- 使用方式不同:cookie如果在瀏覽器端對(duì)cookie進(jìn)行設(shè)置對(duì)應(yīng)的時(shí)間,則cookie保存在本地硬盤中,此時(shí)如果沒有過期,則就可以使用,如果過期則就刪除。如果沒有對(duì)cookie設(shè)置時(shí)間,則默認(rèn)關(guān)閉瀏覽器,則cookie就會(huì)刪除。session:我們?cè)谡?qǐng)求中,如果發(fā)送的請(qǐng)求中存在sessionId,則就會(huì)找到對(duì)應(yīng)的session對(duì)象,如果不存在sessionId,則在服務(wù)器端就會(huì)創(chuàng)建一個(gè)session對(duì)象,并且將sessionId返回給瀏覽器,可以將其放到cookie中,進(jìn)行傳輸,如果瀏覽器不支持cookie,則應(yīng)該將其通過encodeURL(sessionID)進(jìn)行調(diào)用,然后放到url中。
- 存儲(chǔ)內(nèi)容不同:cookie只能存儲(chǔ)字符串,而session存儲(chǔ)結(jié)構(gòu)類似于hashtable的結(jié)構(gòu),可以存放任何類型。
- 存儲(chǔ)大?。篶ookie最多可以存放4k大小的內(nèi)容,session則沒有限制。
- session的安全性要高于cooKie
- cookie的session的應(yīng)用場(chǎng)景:cookie可以用來保存用戶的登陸信息,如果刪除cookie則下一次用戶仍需要重新登錄;session就類似于我們拿到鑰匙去開鎖,拿到的就是我們個(gè)人的信息,一般我們可以在session中存放個(gè)人的信息或者購物車的信息。
- session和cookie的弊端:cookie的大小受限制,cookie不安全,如果用戶禁用cookie則無法使用cookie。如果過多的依賴session,當(dāng)很多用戶同時(shí)登陸的時(shí)候,此時(shí)服務(wù)器壓力過大。sessionId存放在cookie中,此時(shí)如果對(duì)于一些瀏覽器不支持cookie,此時(shí)還需要改寫代碼,將sessionID放到url中,也是不安全。
到此這篇關(guān)于Java Session會(huì)話追蹤原理深入分析的文章就介紹到這了,更多相關(guān)Java Session會(huì)話追蹤內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
nacos中的配置使用@Value注解獲取不到值的原因及解決方案
這篇文章主要介紹了nacos中的配置使用@Value注解獲取不到值的原因分析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03SpringBoot自定義MessageConvert詳細(xì)講解
正在學(xué)習(xí)SpringBoot,在自定義MessageConverter時(shí)發(fā)現(xiàn):為同一個(gè)返回值類型配置多個(gè)MessageConverter時(shí),可能會(huì)發(fā)生響應(yīng)數(shù)據(jù)格式錯(cuò)誤,或406異常(客戶端無法接收相應(yīng)數(shù)據(jù))。在此記錄一下解決問題以及追蹤源碼的過程2023-01-01Spring Cloud構(gòu)建Eureka應(yīng)用的方法
這篇文章主要介紹了Spring Cloud構(gòu)建Eureka應(yīng)用的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03在Spring Boot中集成RabbitMQ詳細(xì)步驟(最新推薦)
本文將介紹如何在Spring Boot項(xiàng)目中集成RabbitMQ,實(shí)現(xiàn)生產(chǎn)者和消費(fèi)者的基本配置,本文分步驟給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-12-12