Java cookie和session會話技術(shù)介紹
http無狀態(tài)協(xié)議的解決:
HTTP 是一種無狀態(tài)協(xié)議。 無狀態(tài)協(xié)議不要求服務(wù)器在多次請求期間保留有關(guān)每個用戶的信息或狀態(tài)。
但是某些 Web 應(yīng)用程序可能必須跟蹤用戶從一個頁面到另一個頁面的進度,例如,當(dāng)需要 Web 服務(wù)器為用戶自定義網(wǎng)頁內(nèi)容時。 這些情況的解決方案包括:
- HTTP cookie 的使用。
- 服務(wù)器端會話。
- 隱藏變量(當(dāng)當(dāng)前頁面包含表單時)
- 使用 URI 編碼參數(shù)的 URL 重寫,例如,/index.php?session_id=some_unique_session_code。
使協(xié)議無狀態(tài)的原因是服務(wù)器不需要跟蹤多個請求的狀態(tài),而不是它如果愿意就不能這樣做。 這簡化了客戶端和服務(wù)器之間的合同,并且在許多情況下(例如通過 CDN 提供靜態(tài)數(shù)據(jù))最大限度地減少了需要傳輸?shù)臄?shù)據(jù)量。 如果要求服務(wù)器維護客戶端訪問的狀態(tài),則發(fā)出和響應(yīng)請求的結(jié)構(gòu)將更加復(fù)雜。 事實上,模型的簡單性是其最大的特點之一。
一、cookie
1、cookie的概念
cookie是一種在服務(wù)器中創(chuàng)建并維護,但是保存在瀏覽器端的會話技術(shù)
cookie的應(yīng)用場景:記住用戶名和密碼、七天免登陸
2、cookie的創(chuàng)建
//創(chuàng)建cookie
Cookie cookie = new Cookie("username", "admin");
//將cookie響應(yīng)到瀏覽器
response.addCookie(cookie);
cookie在報文中的表示方式:
若在服務(wù)器中創(chuàng)建cookie,并響應(yīng)到瀏覽器,此時在響應(yīng)報文中會出現(xiàn):Set-Cookie: username=admin
此后,每次瀏覽器向服務(wù)器發(fā)送請求,都會攜帶此cookie,在請求報文中會出現(xiàn):Cookie: username=admin
把cookie響應(yīng)到瀏覽器之后,會保存在瀏覽器的運行內(nèi)存中,當(dāng)瀏覽器關(guān)閉時,瀏覽器的運行內(nèi)存會被釋放,因此cookie會被清空。因此會話默認的有效時間就是瀏覽器開啟到瀏覽器關(guān)閉
3、獲取cookie
//獲取瀏覽器發(fā)送請求所攜帶的所有cookie
Cookie[] cookies = request.getCookies();
if(cookies != null){
for (Cookie cookie : cookies) {
System.out.println(cookie.getName() + "," + cookie.getValue());
}
}
4、修改cookie
a>因為cookie是鍵值對格式的數(shù)據(jù),因此只需要創(chuàng)建相同的鍵不同的值的cookie,響應(yīng)瀏覽器,就會將相對應(yīng)的cookie的值進行覆蓋
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的有效時間
把cookie響應(yīng)到瀏覽器之后,會保存在瀏覽器的運行內(nèi)存中,當(dāng)瀏覽器關(guān)閉時,瀏覽器的運行內(nèi)存會被釋放,因此cookie會被清空。因此會話默認的有效時間就是瀏覽器開啟到瀏覽器關(guān)閉
但是可以通過cookie.setMaxAge()設(shè)置cookie的有效時間
a>當(dāng)設(shè)置的有效時間為負整數(shù)時,沒有任何效果,即有效時間為瀏覽器開啟到瀏覽器關(guān)閉
b>當(dāng)設(shè)置的有效時間為0時,表示立即刪除該cookie
c>當(dāng)設(shè)置的有效時間為正整數(shù)時
? 若有效時間小于一次會話,cookie到了指定時間,就會自動從運行內(nèi)存中刪除
? 若有效時間大于一次會話,當(dāng)瀏覽器關(guān)閉,會將cookie中的數(shù)據(jù)保存到磁盤中,當(dāng)瀏覽器再次開啟時,會將磁盤中的數(shù)據(jù)重新加載到運行內(nèi)存中
6、設(shè)置cookie的有效路徑
cookie.setPath();
當(dāng)創(chuàng)建了cookie,并響應(yīng)到瀏覽器之后,設(shè)置了有效路徑的cookie,只有在訪問指定路徑時才會攜帶該cookie
二、session
1、session的概念
session是一種在服務(wù)器中創(chuàng)建并維護并保存在服務(wù)器端的會話技術(shù)
session的應(yīng)用場景:記錄用戶的登錄狀態(tài)
2、觀察獲取session時的報文變化情況
通過request.getSession()獲取session對象
當(dāng)此次會話中第一次訪問request.getSession()獲取session對象時,響應(yīng)報文中會出一個鍵為JSESSIONID的cookie
之后每次通過瀏覽器發(fā)送請求到服務(wù)器,都會攜帶此JSESSIONID的cookie
哪怕訪問服務(wù)器時,使用的request.getSession()再次獲取session對象,只要請求報文中有JSESSIONID的cookie,響應(yīng)報文中就不會再出現(xiàn)此cookie
3、session的原理
問:
session的原理?
session和cookie的關(guān)系?
為什么在一次會話中,獲取的session都是同一個?
答:
當(dāng)通過request.getSession()獲取session時,會獲取請求報文中鍵為JSESSIONID的cookie
若請求報文中沒有鍵為JSESSIONID的cookie,此時表示當(dāng)前的會話剛剛開始,是當(dāng)前會話中第一次獲取session對象。此時在服務(wù)器內(nèi)部會創(chuàng)建session對象,并且會創(chuàng)建一個cookie,鍵為JSESSIONID,值為UUID隨機序列;然后會將創(chuàng)建session對象存儲到一個由服務(wù)器所維護的map集合中,以UUID隨機序列為鍵,以session對象為值,最終將JSESSIONID的cookie響應(yīng)到瀏覽器
若請求報文中存在鍵為JSESSIONID的cookie,此時獲取該cookie的值,即UUID隨機序列,以UUID隨機序列為鍵,從服務(wù)器所維護的map集合中就可以獲取唯一的session對象
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的時效
session的時效指在指定時間內(nèi),若沒有對session進行任何的操作,此時session會自動失效
a>通過web.xml設(shè)置,單位是分鐘
<session-config>
<session-timeout>30</session-timeout>
</session-config>
b>通過session.setMaxInactiveInterval()設(shè)置,單位是秒
session.setMaxInactiveInterval(1800);
4.3、強制使session失效
session.invalidate()
5、session的鈍化和活化
session的鈍化指服務(wù)器關(guān)閉,但是瀏覽器沒有關(guān)閉,此時session中的數(shù)據(jù)會被序列化到磁盤上
session的活化指服務(wù)器啟動,并且瀏覽器仍然沒有關(guān)閉,此時會將序列化到磁盤上的數(shù)據(jù)重新加載到內(nèi)存中
注意:若session中存儲的是實體類對象,此時若要鈍化,則該實體類和該實體類的成員變量也都要實現(xiàn)序列化的接口
三、cookie和session的區(qū)別
1、cookie存儲在瀏覽器端,session存儲在服務(wù)器端,因此cookie相對而言不安全
2、cookie只能存儲字符串類型的鍵值對,session可以存儲任意類型的數(shù)據(jù),因此若存儲相同的數(shù)據(jù),cookie可能會產(chǎn)生大量的cookie
3、由于每次瀏覽器發(fā)送請求都會攜帶cookie,若有大量的cookie,就會造成網(wǎng)絡(luò)負擔(dān)
到此這篇關(guān)于Java cookie和session會話技術(shù)介紹的文章就介紹到這了,更多相關(guān)Java cookie和session內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java多線程編程之讀寫鎖ReadWriteLock用法實例
這篇文章主要介紹了Java多線程編程之讀寫鎖ReadWriteLock用法實例,本文直接給出編碼實例,需要的朋友可以參考下2015-05-05
Jersey Restful接口如何獲取參數(shù)的問題
這篇文章主要介紹了Jersey Restful接口如何獲取參數(shù)的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
SpringBoot下載Excel文件時,報錯文件損壞的解決方案
這篇文章主要介紹了SpringBoot下載Excel文件時,報錯文件損壞的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
Spring boot route Controller接收參數(shù)常用方法解析
這篇文章主要介紹了Spring boot route Controller接收參數(shù)常用方法解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-10-10

