Java cookie和session會(huì)話技術(shù)介紹
http無狀態(tài)協(xié)議的解決:
HTTP 是一種無狀態(tài)協(xié)議。 無狀態(tài)協(xié)議不要求服務(wù)器在多次請(qǐng)求期間保留有關(guān)每個(gè)用戶的信息或狀態(tài)。
但是某些 Web 應(yīng)用程序可能必須跟蹤用戶從一個(gè)頁面到另一個(gè)頁面的進(jìn)度,例如,當(dāng)需要 Web 服務(wù)器為用戶自定義網(wǎng)頁內(nèi)容時(shí)。 這些情況的解決方案包括:
- HTTP cookie 的使用。
- 服務(wù)器端會(huì)話。
- 隱藏變量(當(dāng)當(dāng)前頁面包含表單時(shí))
- 使用 URI 編碼參數(shù)的 URL 重寫,例如,/index.php?session_id=some_unique_session_code。
使協(xié)議無狀態(tài)的原因是服務(wù)器不需要跟蹤多個(gè)請(qǐng)求的狀態(tài),而不是它如果愿意就不能這樣做。 這簡化了客戶端和服務(wù)器之間的合同,并且在許多情況下(例如通過 CDN 提供靜態(tài)數(shù)據(jù))最大限度地減少了需要傳輸?shù)臄?shù)據(jù)量。 如果要求服務(wù)器維護(hù)客戶端訪問的狀態(tài),則發(fā)出和響應(yīng)請(qǐng)求的結(jié)構(gòu)將更加復(fù)雜。 事實(shí)上,模型的簡單性是其最大的特點(diǎn)之一。
一、cookie
1、cookie的概念
cookie是一種在服務(wù)器中創(chuàng)建并維護(hù),但是保存在瀏覽器端的會(huì)話技術(shù)
cookie的應(yīng)用場(chǎng)景:記住用戶名和密碼、七天免登陸
2、cookie的創(chuàng)建
//創(chuàng)建cookie Cookie cookie = new Cookie("username", "admin"); //將cookie響應(yīng)到瀏覽器 response.addCookie(cookie);
cookie在報(bào)文中的表示方式:
若在服務(wù)器中創(chuàng)建cookie,并響應(yīng)到瀏覽器,此時(shí)在響應(yīng)報(bào)文中會(huì)出現(xiàn):Set-Cookie: username=admin
此后,每次瀏覽器向服務(wù)器發(fā)送請(qǐng)求,都會(huì)攜帶此cookie,在請(qǐng)求報(bào)文中會(huì)出現(xiàn):Cookie: username=admin
把cookie響應(yīng)到瀏覽器之后,會(huì)保存在瀏覽器的運(yùn)行內(nèi)存中,當(dāng)瀏覽器關(guān)閉時(shí),瀏覽器的運(yùn)行內(nèi)存會(huì)被釋放,因此cookie會(huì)被清空。因此會(huì)話默認(rèn)的有效時(shí)間就是瀏覽器開啟到瀏覽器關(guān)閉
3、獲取cookie
//獲取瀏覽器發(fā)送請(qǐng)求所攜帶的所有cookie Cookie[] cookies = request.getCookies(); if(cookies != null){ for (Cookie cookie : cookies) { System.out.println(cookie.getName() + "," + cookie.getValue()); } }
4、修改cookie
a>因?yàn)閏ookie是鍵值對(duì)格式的數(shù)據(jù),因此只需要?jiǎng)?chuàng)建相同的鍵不同的值的cookie,響應(yīng)瀏覽器,就會(huì)將相對(duì)應(yīng)的cookie的值進(jìn)行覆蓋
b>使用cookie.setValue()
/*Cookie cookie = new Cookie("username", "root"); response.addCookie(cookie);*/ Cookie[] cookies = request.getCookies(); if(cookies != null){ for (Cookie cookie : cookies) { if(cookie.getName().equals("username")){ cookie.setValue("zhangsan"); response.addCookie(cookie); } } }
5、設(shè)置cookie的有效時(shí)間
把cookie響應(yīng)到瀏覽器之后,會(huì)保存在瀏覽器的運(yùn)行內(nèi)存中,當(dāng)瀏覽器關(guān)閉時(shí),瀏覽器的運(yùn)行內(nèi)存會(huì)被釋放,因此cookie會(huì)被清空。因此會(huì)話默認(rèn)的有效時(shí)間就是瀏覽器開啟到瀏覽器關(guān)閉
但是可以通過cookie.setMaxAge()設(shè)置cookie的有效時(shí)間
a>當(dāng)設(shè)置的有效時(shí)間為負(fù)整數(shù)時(shí),沒有任何效果,即有效時(shí)間為瀏覽器開啟到瀏覽器關(guān)閉
b>當(dāng)設(shè)置的有效時(shí)間為0時(shí),表示立即刪除該cookie
c>當(dāng)設(shè)置的有效時(shí)間為正整數(shù)時(shí)
? 若有效時(shí)間小于一次會(huì)話,cookie到了指定時(shí)間,就會(huì)自動(dòng)從運(yùn)行內(nèi)存中刪除
? 若有效時(shí)間大于一次會(huì)話,當(dāng)瀏覽器關(guān)閉,會(huì)將cookie中的數(shù)據(jù)保存到磁盤中,當(dāng)瀏覽器再次開啟時(shí),會(huì)將磁盤中的數(shù)據(jù)重新加載到運(yùn)行內(nèi)存中
6、設(shè)置cookie的有效路徑
cookie.setPath();
當(dāng)創(chuàng)建了cookie,并響應(yīng)到瀏覽器之后,設(shè)置了有效路徑的cookie,只有在訪問指定路徑時(shí)才會(huì)攜帶該cookie
二、session
1、session的概念
session是一種在服務(wù)器中創(chuàng)建并維護(hù)并保存在服務(wù)器端的會(huì)話技術(shù)
session的應(yīng)用場(chǎng)景:記錄用戶的登錄狀態(tài)
2、觀察獲取session時(shí)的報(bào)文變化情況
通過request.getSession()獲取session對(duì)象
當(dāng)此次會(huì)話中第一次訪問request.getSession()獲取session對(duì)象時(shí),響應(yīng)報(bào)文中會(huì)出一個(gè)鍵為JSESSIONID的cookie
之后每次通過瀏覽器發(fā)送請(qǐng)求到服務(wù)器,都會(huì)攜帶此JSESSIONID的cookie
哪怕訪問服務(wù)器時(shí),使用的request.getSession()再次獲取session對(duì)象,只要請(qǐng)求報(bào)文中有JSESSIONID的cookie,響應(yīng)報(bào)文中就不會(huì)再出現(xiàn)此cookie
3、session的原理
問:
session的原理?
session和cookie的關(guān)系?
為什么在一次會(huì)話中,獲取的session都是同一個(gè)?
答:
當(dāng)通過request.getSession()獲取session時(shí),會(huì)獲取請(qǐng)求報(bào)文中鍵為JSESSIONID的cookie
若請(qǐng)求報(bào)文中沒有鍵為JSESSIONID的cookie,此時(shí)表示當(dāng)前的會(huì)話剛剛開始,是當(dāng)前會(huì)話中第一次獲取session對(duì)象。此時(shí)在服務(wù)器內(nèi)部會(huì)創(chuàng)建session對(duì)象,并且會(huì)創(chuàng)建一個(gè)cookie,鍵為JSESSIONID,值為UUID隨機(jī)序列;然后會(huì)將創(chuàng)建session對(duì)象存儲(chǔ)到一個(gè)由服務(wù)器所維護(hù)的map集合中,以UUID隨機(jī)序列為鍵,以session對(duì)象為值,最終將JSESSIONID的cookie響應(yīng)到瀏覽器
若請(qǐng)求報(bào)文中存在鍵為JSESSIONID的cookie,此時(shí)獲取該cookie的值,即UUID隨機(jī)序列,以UUID隨機(jī)序列為鍵,從服務(wù)器所維護(hù)的map集合中就可以獲取唯一的session對(duì)象
4、session的常用方法
4.1、session存在域?qū)ο蟮臄?shù)據(jù)
void setAttribute(String name, Object value);
Object getAttribute(String name);
void removeAttribute(String name);
4.2、設(shè)置session的時(shí)效
session的時(shí)效指在指定時(shí)間內(nèi),若沒有對(duì)session進(jìn)行任何的操作,此時(shí)session會(huì)自動(dòng)失效
a>通過web.xml設(shè)置,單位是分鐘
<session-config> <session-timeout>30</session-timeout> </session-config>
b>通過session.setMaxInactiveInterval()設(shè)置,單位是秒
session.setMaxInactiveInterval(1800);
4.3、強(qiáng)制使session失效
session.invalidate()
5、session的鈍化和活化
session的鈍化指服務(wù)器關(guān)閉,但是瀏覽器沒有關(guān)閉,此時(shí)session中的數(shù)據(jù)會(huì)被序列化到磁盤上
session的活化指服務(wù)器啟動(dòng),并且瀏覽器仍然沒有關(guān)閉,此時(shí)會(huì)將序列化到磁盤上的數(shù)據(jù)重新加載到內(nèi)存中
注意:若session中存儲(chǔ)的是實(shí)體類對(duì)象,此時(shí)若要鈍化,則該實(shí)體類和該實(shí)體類的成員變量也都要實(shí)現(xiàn)序列化的接口
三、cookie和session的區(qū)別
1、cookie存儲(chǔ)在瀏覽器端,session存儲(chǔ)在服務(wù)器端,因此cookie相對(duì)而言不安全
2、cookie只能存儲(chǔ)字符串類型的鍵值對(duì),session可以存儲(chǔ)任意類型的數(shù)據(jù),因此若存儲(chǔ)相同的數(shù)據(jù),cookie可能會(huì)產(chǎn)生大量的cookie
3、由于每次瀏覽器發(fā)送請(qǐng)求都會(huì)攜帶cookie,若有大量的cookie,就會(huì)造成網(wǎng)絡(luò)負(fù)擔(dān)
到此這篇關(guān)于Java cookie和session會(huì)話技術(shù)介紹的文章就介紹到這了,更多相關(guān)Java cookie和session內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Hibernate中使用HQLQuery查詢?nèi)繑?shù)據(jù)和部分?jǐn)?shù)據(jù)的方法實(shí)例
今天小編就為大家分享一篇關(guān)于Hibernate中使用HQLQuery查詢?nèi)繑?shù)據(jù)和部分?jǐn)?shù)據(jù)的方法實(shí)例,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03SpringBoot整合SpringSecurity實(shí)現(xiàn)認(rèn)證攔截的教程
我們寫的任何一個(gè)項(xiàng)目,都應(yīng)該有安全防護(hù),不應(yīng)該讓這個(gè)項(xiàng)目進(jìn)行“裸奔”,否則很容易被別人進(jìn)行攻擊。而在SpringBoot環(huán)境中,其實(shí)可以很容易實(shí)現(xiàn)安全保護(hù),本文給大家介紹SpringBoot如何整合SpringSecurity實(shí)現(xiàn)認(rèn)證攔截,需要的朋友可以參考下2023-05-05JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)劃分原理詳解
這篇文章主要介紹了JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)劃分原理詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05Java StringBuilder和StringBuffer源碼分析
這篇文章主要針對(duì)Java中兩個(gè)常用的操作字符串的類 StringBuilder和StringBuffer進(jìn)行源碼分析,感興趣的小伙伴們可以參考一下2016-01-01Java中l(wèi)ist.contains()的用法及拓展
List集合相信大家在開發(fā)過程中幾乎都會(huì)用到,有時(shí)候難免會(huì)遇到集合里的數(shù)據(jù)是重復(fù)的,需要進(jìn)行去除,下面這篇文章主要給大家介紹了關(guān)于Java中l(wèi)ist.contains()的用法及拓展的相關(guān)資料,需要的朋友可以參考下2023-03-03SpringCloud的JPA連接PostgreSql的教程
這篇文章主要介紹了SpringCloud的JPA接入PostgreSql 教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-06-06