Java中的Cookie和Session詳細解析
http協(xié)議無狀態(tài)
無狀態(tài)的官方解釋:
- 協(xié)議對于事務(wù)處理沒有記憶能力
- 對同一個url請求沒有上下文關(guān)系
- 每次的請求都是獨立的,它的執(zhí)行情況和結(jié)果與之前的請求和之后的請求是無直接關(guān)系的,它不會受前面的請求應(yīng)答情況直接影響,也不會直接影響后面的請求應(yīng)答情況
- 服務(wù)器中沒有保存客戶端的狀態(tài),客戶端必須每次帶上自己的狀態(tài)去請求服務(wù)器。
簡單理解就是客戶端是第二次訪問服務(wù)器,服務(wù)器還是把此次訪當(dāng)做一個新的訪問進行處理,因為服務(wù)端并不知道客戶端之前是否訪問過。
為了解決這一問題,Web程序中采用會話跟蹤技術(shù),會話跟蹤技術(shù)就是依靠Cookie和Session實現(xiàn)。Cookie通過在客戶端記錄信息確定用戶身份,Session通過在服務(wù)器端記錄信息確定用戶身份。
會話
一次會話:瀏覽器第一次給服務(wù)器資源發(fā)送請求,會話建立,直到有一方斷開為止。一次會話中包含多次請求和響應(yīng)。有了會話跟蹤可以在一次會話的范圍內(nèi)的多次請求間,共享數(shù)據(jù)。
Cookie是什么?
客戶端會話技術(shù),服務(wù)端給客戶端的數(shù)據(jù),存儲于客戶端(瀏覽器)。由于是保存在客戶端上的,所以存在安全問題,并且cookie是由個數(shù)和大小限制的(4KB),所以一般cookie用來存儲一些比較小且安全性要求不高的數(shù)據(jù),而且一般數(shù)據(jù)都會進行加密。
Cookie的使用案例
記住用戶名
登錄時,在服務(wù)器端獲取到用戶名,然后創(chuàng)建一個cookie,將用戶名存入cookie中,發(fā)送回瀏覽器端,然后瀏覽器下次在訪問登錄頁面時,先拿到cookie,將cookie中的信息拿出來,看是否保存了該用戶名,如果保存了,那么直接用他,如果沒有,則自己手寫用戶名。
歷史記錄
比如購物網(wǎng)站,都會有我們的瀏覽記錄的,實現(xiàn)原理其實也是用cookie技術(shù),每瀏覽一個商品,就將其存入cookie中,到需要顯示瀏覽記錄時,只需要將cookie拿出來遍歷即可?!?/p>
Cookie的使用流程
創(chuàng)建cookie
servlet創(chuàng)建cookie,保存少量數(shù)據(jù),發(fā)送瀏覽器。
public void login(HttpServletRequest request, HttpServletResponse response) { String account = request.getParameter("account"); String pwd = request.getParameter("pwd"); String isRemember = request.getParameter("remember"); if (isRemember != null) { Cookie cookie = new Cookie("account", account); // 保存賬號數(shù)據(jù) cookie.setMaxAge(1*60*60*24); // cookie存在在本地的有效時長(單位為秒) 默認(rèn)為-1 表示頁面關(guān)閉cookie就失效 response.addCookie(cookie);//添加到response } // ...省略登錄邏輯 }
獲得cookie數(shù)據(jù)
瀏覽器獲得服務(wù)器發(fā)送的cookie數(shù)據(jù),將自動的保存到瀏覽器端。
<form action="<%=application.getContextPath()%>/login"> <%--將cookie中攜帶的account值賦值給value--%> <input name="account" value="<%=cookieAccount%>"><br> <input name="pwd"><br> 記住密碼:<input type="checkbox" name="remember"> <br> <input type="submit" value="登錄"> </form>
發(fā)送給服務(wù)器
下次訪問時,瀏覽器將自動攜帶cookie數(shù)據(jù)發(fā)送給服務(wù)器。
Session是什么?
服務(wù)器端會話技術(shù),在一次會話的多次請求間共享數(shù)據(jù),將數(shù)據(jù)保存在服務(wù)器端的對象中。HttpSession。
Session的使用案例
登陸驗證信息
用戶的各種私人信息,比如姓名等,某種情況下,需要保存在Session里 需要在頁面間傳遞 的內(nèi)容信息,比如調(diào)查工作需要分好幾步。每一步的信息都保存在Session里,最后在統(tǒng)一更 新到數(shù)據(jù)庫。
Session共享
對于多網(wǎng)站(同一父域不同子域)單服務(wù)器,我們需要解決的就是來自不同網(wǎng)站之間SessionId的共享。由于域名不同(blog.yoodb.com 和daohang.yoodb.com),而SessionId又分別儲存在各自的Cookie中,因此服務(wù)器會認(rèn)為對于兩個子站的訪問,是來自不同的會話。解決的方法是通過修改Cookies的域名為父域名達到cookie共享的目的,從而實現(xiàn)SessionId的共享。帶來的弊端就是子站間的Cookie信息也同時被共享了。
Session的使用
Session的實現(xiàn)是依賴于Cookie的。
Cookie中有JSESSIONID這個字段,實際上首次請求網(wǎng)頁時在請求頭里是沒有這個字段的,因為我們并沒有創(chuàng)建session,當(dāng)我們調(diào)用request.getSession()時,此時會創(chuàng)建一個session,并且將sessionId保存到cookie中,然后回寫給response,所以我們發(fā)現(xiàn)首次創(chuàng)建session時的響應(yīng)頭中有JSESSIONID這個字段,后面的request默認(rèn)都會帶上JSESSIONID這個字段,而response中則不會再有該字段了。而服務(wù)器就能夠根據(jù)JSESSIONID這個字段值查找對應(yīng)的session。
如果瀏覽器禁用了cookie,那么,每次請求都會重新創(chuàng)建session,因為服務(wù)器沒有獲取到JSESSIONID這個值,也無法根據(jù)JSESSIONID的值查找相應(yīng)的session,也就是說,如果客戶端禁用了cookie,那么session也將失效。如圖:
第一次請求:
后續(xù)請求:
總結(jié)
Cookie
1. cookie在瀏覽器中保存多長時間?
默認(rèn)情況下在瀏覽器關(guān)閉后就會失效。即一次會話后就失效。因為cookie是放在瀏覽器緩存的,瀏覽器關(guān)閉會清除緩存所以cookie會失效。
要想使這個cookie在瀏覽器關(guān)閉后仍然有效就需要設(shè)置有效時間將其寫到磁盤下。
持久化存儲:
setMaxAge(int seconds)
正數(shù):將Cookie數(shù)據(jù)寫到硬盤的文件中。持久化存儲。并指定cookie存活時間,時間到后,cookie文件自動失效
負數(shù):默認(rèn)值
零:刪除cookie信息
2. cookie共享問題?
假設(shè)在一個tomcat服務(wù)器中,部署了多個web項目,那么在這些web項目中cookie能不能共享?
默認(rèn)情況下cookie不能共享setPath(String path):設(shè)置cookie的獲取范圍。默認(rèn)情況下,設(shè)置當(dāng)前的虛擬目錄
如果要共享,則可以將path設(shè)置為"/"
不同的tomcat服務(wù)器間cookie共享問題?
setDomain(String path):如果設(shè)置一級域名相同,那么多個服務(wù)器之間cookie可以共享
setDomain(".baidu.com"),那么tieba.baidu.com和news.baidu.com中cookie可以共享
3. Cookie的特點和作用
- cookie存儲數(shù)據(jù)在客戶端瀏覽器 3.2 瀏覽器對于單個cookie 的大小有限制(4kb) 以及 對同一個域名下的總cookie數(shù)量也有限制(20個)
- cookie一般用于存出少量的不太敏感的數(shù)據(jù),在不登錄的情況下,完成服務(wù)器對客戶端的身份識別
Session
1. session什么時候被銷毀?
- 服務(wù)器關(guān)閉.
- session對象調(diào)用invalidate() 。
- session默認(rèn)失效時間 30分鐘。
選擇性配置修改
<session-config>
<session-timeout>30</session-timeout>
</session-config>
2. session的特點
- session用于存儲一次會話的多次請求的數(shù)據(jù),存在服務(wù)器端。
- session可以存儲任意類型,任意大小的數(shù)據(jù)。
3. session與Cookie的區(qū)別
- session存儲數(shù)據(jù)在服務(wù)器端,Cookie在客戶端。
- session沒有數(shù)據(jù)大小限制,Cookie有。
- session數(shù)據(jù)安全,Cookie相對于不安全。
到此這篇關(guān)于Java中的Cookie和Session詳細解析的文章就介紹到這了,更多相關(guān)Cookie和Session內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于SpringBoot中controller參數(shù)校驗的使用
本文主要介紹了關(guān)于SpringBoot中controller參數(shù)校驗的使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01Mybatis Plus整合PageHelper分頁的實現(xiàn)示例
這篇文章主要介紹了Mybatis Plus整合PageHelper分頁的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09Java集合ArrayList、LinkedList、HashMap、HashSet最大容量
在開發(fā)中我們使用比較多的集合就是List、Set和Map了,并且我們也知道大部分用的基本上都是ArrayList、LinkedList、HashMap、HashSet或者TreeSet這幾個集合,你知道他們的最大容量,感興趣的可以了解一下2023-12-12Java8接口中引入default關(guān)鍵字的本質(zhì)原因詳析
Default方法是在java8中引入的關(guān)鍵字,也可稱為Virtual extension methods—虛擬擴展方法,這篇文章主要給大家介紹了關(guān)于Java8接口中引入default關(guān)鍵字的本質(zhì)原因,需要的朋友可以參考下2022-01-01MybatisPlus實現(xiàn)真正批量插入的詳細步驟
在數(shù)據(jù)庫操作中,批量插入是提升效率的重要手段,MyBatis-Plus提供了多種批量插入方法,但默認(rèn)的saveBatch方法效率并不高,文章介紹了通過手動拼接SQL、使用IService接口以及自定義insertBatchSomeColumn方法進行優(yōu)化,以實現(xiàn)更高效的批量插入,并給出了性能優(yōu)化建議2024-10-10