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會被清空。因此會話默認(rèn)的有效時間就是瀏覽器開啟到瀏覽器關(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會被清空。因此會話默認(rèn)的有效時間就是瀏覽器開啟到瀏覽器關(guān)閉
但是可以通過cookie.setMaxAge()設(shè)置cookie的有效時間
a>當(dāng)設(shè)置的有效時間為負(fù)整數(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ò)負(fù)擔(dān)
到此這篇關(guān)于Java cookie和session會話技術(shù)介紹的文章就介紹到這了,更多相關(guān)Java cookie和session內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Hibernate中使用HQLQuery查詢?nèi)繑?shù)據(jù)和部分?jǐn)?shù)據(jù)的方法實例
今天小編就為大家分享一篇關(guān)于Hibernate中使用HQLQuery查詢?nèi)繑?shù)據(jù)和部分?jǐn)?shù)據(jù)的方法實例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03SpringBoot整合SpringSecurity實現(xiàn)認(rèn)證攔截的教程
我們寫的任何一個項目,都應(yīng)該有安全防護,不應(yīng)該讓這個項目進行“裸奔”,否則很容易被別人進行攻擊。而在SpringBoot環(huán)境中,其實可以很容易實現(xiàn)安全保護,本文給大家介紹SpringBoot如何整合SpringSecurity實現(xiàn)認(rèn)證攔截,需要的朋友可以參考下2023-05-05Java StringBuilder和StringBuffer源碼分析
這篇文章主要針對Java中兩個常用的操作字符串的類 StringBuilder和StringBuffer進行源碼分析,感興趣的小伙伴們可以參考一下2016-01-01Java中l(wèi)ist.contains()的用法及拓展
List集合相信大家在開發(fā)過程中幾乎都會用到,有時候難免會遇到集合里的數(shù)據(jù)是重復(fù)的,需要進行去除,下面這篇文章主要給大家介紹了關(guān)于Java中l(wèi)ist.contains()的用法及拓展的相關(guān)資料,需要的朋友可以參考下2023-03-03SpringCloud的JPA連接PostgreSql的教程
這篇文章主要介紹了SpringCloud的JPA接入PostgreSql 教程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-06-06