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