文章分享

開(kāi)放、平等、協(xié)作、快速、分享

當(dāng)前位置:首頁(yè)>文章分享

淺談Cookie與Session技術(shù)

摘錄:HCTech 無(wú)錫和控電子   時(shí)間:2020-08-07   訪問(wèn)量:4095

一、什么是狀態(tài)管理

將客戶端與服務(wù)器之間多次交互當(dāng)做一個(gè)整體來(lái)看,并且將多次交互所涉及的數(shù)據(jù)(狀態(tài))保存下來(lái)。

會(huì)話:當(dāng)用戶打開(kāi)瀏覽器,訪問(wèn)多個(gè)WEB資源,然后關(guān)閉瀏覽器的過(guò)程,稱(chēng)之為一個(gè)會(huì)話,選項(xiàng)卡,彈出頁(yè)面都屬于這個(gè)會(huì)話,且共享同一個(gè)session。

注意:具體會(huì)話和瀏覽器版本,廠商有關(guān),如IE7及以下,每開(kāi)一個(gè)瀏覽器都創(chuàng)建一個(gè)新的session,而IE8及以上,則實(shí)現(xiàn)多個(gè)瀏覽器共享同一個(gè)session。因?yàn)镮E8及以上,都共享同一個(gè)進(jìn)程,只開(kāi)辟一個(gè)內(nèi)存空間。目前較多主流的瀏覽器都實(shí)現(xiàn)同一臺(tái)主機(jī)上的多個(gè)瀏覽器,共享同一個(gè)進(jìn)程。

二、如何進(jìn)行狀態(tài)管理

方式一:將狀態(tài)保存在客戶端。方式二:將狀態(tài)保存在服務(wù)器端。

三、cookie技術(shù)(客戶端技術(shù))

(1)什么是cookie

a、cookie是一種客戶端的狀態(tài)管理技術(shù)b、當(dāng)瀏覽器向服務(wù)器發(fā)送請(qǐng)求的時(shí)候,服務(wù)器會(huì)將少量的數(shù)據(jù)以set-cookie消息頭的方式發(fā)送給瀏覽器,當(dāng)瀏覽器再次訪問(wèn)服務(wù)器時(shí),會(huì)將這些數(shù)據(jù)以cookie消息頭的方式發(fā)送給服務(wù)器。

(2)如何創(chuàng)建一個(gè)cookie

Cookie c = new Cookie(String name,String value);response.addCookie(c);默認(rèn)情況下,cookie保存在瀏覽器內(nèi)存中

(3)cookie的查詢(xún)

Cookie[] cookie = request.getCookies();

注意:該方法有可能返回nullString cookie.getName():查找cookie的名字String cookie.getValue():查找cookie的值

(4)cookie的生存時(shí)間

cookie.setMaxAge(int seconds):cookie的保存時(shí)間seconds>0:瀏覽器會(huì)將cookie保存在硬盤(pán)上,超過(guò)指定時(shí)間會(huì)刪除該cookieseconds<0:缺省值,只將cookie保存在內(nèi)存中,只要瀏覽器不關(guān)閉,cookie就一致保存,瀏覽器一旦關(guān)閉,cookie就會(huì)被清空。seconds=0:立即刪除cookie,如要?jiǎng)h除一個(gè)叫userID的cookie,那么可以這么做:Cookiec = new Cookie("userID","");c.setMaxAge(0);response.addCookie(c);

(5)cookie的編碼問(wèn)題

cookie只能保存ascii字符,對(duì)于不合法的字符(如中文)需要轉(zhuǎn)換成ascii碼

例:Cookie cookie3 = new Cookie("realname",URLEncoder.encode("姓名","utf-8"));

(6)cookie的路徑問(wèn)題

a、什么是cookie的路徑問(wèn)題?瀏覽器在向服務(wù)器發(fā)送請(qǐng)求時(shí),會(huì)比較cookie的路徑要與訪問(wèn)的服務(wù)器的路徑是否匹配,只有匹配的cookie才會(huì)發(fā)送給服務(wù)器。b、cookie的默認(rèn)路徑默認(rèn)路徑等于創(chuàng)建該cookie的組件路徑c、匹配規(guī)則瀏覽器要訪問(wèn)的路徑必須是cookie的路徑或者其子路徑時(shí),才會(huì)發(fā)送對(duì)應(yīng)的cookied、設(shè)置cookie的路徑cookie.setPath(String path)如:cookie.setPath("/appname");這樣保證這個(gè)cookie可以被整個(gè)web應(yīng)用訪問(wèn)。

(7)cookie域

setDomain:設(shè)置cookie域,指的是訪問(wèn)某個(gè)域的時(shí)候,才會(huì)帶入cookie,訪問(wèn)其他域,不會(huì)帶入cookie。默認(rèn)會(huì)禁止該設(shè)置,因?yàn)榘踩暂^差,如,訪問(wèn)baidu.com,baidu.com寫(xiě)一個(gè)域是google.com的cookie,那么訪問(wèn)google.com的時(shí)候會(huì)帶入baidu.com的cookie,從而會(huì)實(shí)現(xiàn)攻擊的效果。

(8)cookie的限制

a、cookie可以被用戶禁止b、cookie不完全,敏感數(shù)據(jù),比如密碼、賬號(hào)等需要加密。c、cookie的大小有限制,大約為4K左右d、cookie的個(gè)數(shù)也有限制,大約是300個(gè)左右e、每個(gè)站點(diǎn)最多保存20個(gè)cookief、cookie只能夠保存字符串。

四、session技術(shù)(服務(wù)器端)

(1)什么是session?

a、session是一種服務(wù)器端的狀態(tài)管理技術(shù)。b、session是基于cookie的技術(shù)。c、當(dāng)瀏覽器訪問(wèn)服務(wù)器時(shí),服務(wù)器會(huì)創(chuàng)建一個(gè)session對(duì)象(該對(duì)象有一個(gè)唯一的id號(hào),稱(chēng)之為sessionId)服務(wù)器在默認(rèn)的情況下,會(huì)將sessionId以cookie的方式,發(fā)送給瀏覽器,瀏覽器會(huì)將sessionId保存到內(nèi)存中。當(dāng)瀏覽器再次訪問(wèn)服務(wù)器時(shí),會(huì)將sessionId發(fā)送給服務(wù)器,服務(wù)器依據(jù)sessionId就可以找到之間創(chuàng)建的session對(duì)象。

(2)如何獲取session對(duì)象?

方式一:HttpSession s = request.getSession(boolean flag);當(dāng)flag=true時(shí),服務(wù)器會(huì)先查看請(qǐng)求當(dāng)中有沒(méi)有sessionId,如果沒(méi)有,則創(chuàng)建一個(gè)session對(duì)象。如果有,會(huì)依據(jù)sessionId查找對(duì)應(yīng)的session對(duì)象。如果找到,則返回該session對(duì)象,如果找不到,則創(chuàng)建一個(gè)新的session對(duì)象。當(dāng)flag=false時(shí),服務(wù)器會(huì)先查看請(qǐng)求當(dāng)中有沒(méi)有sessionId,如果沒(méi)有則返回null,如果有,會(huì)依據(jù)sessionId查找對(duì)應(yīng)的session對(duì)象。如果找到,則返回該session對(duì)象,如果找不到,返回null。方式二:HttpSession s = request.getSession();等價(jià)于request.getSession(true);

(3)常用方法

String serssion.getId();// 得到session的ID

session.setAttribute(String name,Object obj);// obj最好實(shí)現(xiàn)序列化Serializable接口,應(yīng)為服務(wù)器在持久化session時(shí),會(huì)使用java序列化協(xié)議。

session.getAttribute(String name);// 如果name不存在則返回null

session.removeAttribute(String name);// 刪除session中的指定屬性

(4)session超時(shí)

所謂session的超時(shí),指的是服務(wù)器會(huì)將空閑時(shí)間過(guò)長(zhǎng)的session對(duì)象從內(nèi)存空間刪除掉,原因是過(guò)多的session對(duì)象會(huì)影響程序的正常運(yùn)行,會(huì)占用服務(wù)器的內(nèi)存空間。大部分服務(wù)器都會(huì)有一個(gè)缺省的超時(shí)限制,一般是30分鐘,可以修改服務(wù)器的缺省超時(shí)限制。如修改tomcat的session超時(shí)時(shí)間,可以在conf/web.xml中的

<session-config><session-timeout>30</session-timeout></session-config>

也可以將以上配置放到某個(gè)WEB應(yīng)用的web.xml中,這樣可以特定設(shè)置某個(gè)WEB應(yīng)用的session超時(shí)時(shí)間。另外,還可以通過(guò)session.setMaxInactiveInterval(int seconds);設(shè)置session的超時(shí)時(shí)間。

(5)session的生命周期

session的創(chuàng)建:當(dāng)用戶訪問(wèn)某個(gè)可以創(chuàng)建session的servlet的時(shí)候,該servlet才會(huì)創(chuàng)建session。當(dāng)session超過(guò)默認(rèn)時(shí)間或用戶指定的session時(shí)間后,session才會(huì)消亡。

(6)刪除session

session.invalidate();

(7)持久化session方案

session默認(rèn)是存儲(chǔ)在瀏覽器內(nèi)存中,默認(rèn)時(shí)間是30分鐘(根據(jù)不同的WEB服務(wù)器設(shè)置而定)。且session也是通過(guò)cookie來(lái)實(shí)現(xiàn)發(fā)送到瀏覽器內(nèi)存中的。所以可以考慮用cookie來(lái)替換該session。如果用戶在中途關(guān)閉瀏覽器的話,那么session就隨著瀏覽器內(nèi)存的釋放而釋放,那么如果想持久化session的話,可以考慮使用cookie技術(shù)。

Step1、獲取sessionID。Step2、通過(guò)JSESSIONID,然后將sessionID的值寫(xiě)入cookie,在通過(guò)設(shè)置保存時(shí)間,路徑,來(lái)持久化該session。

(8)URL地址編碼(用戶禁用cookie的解決辦法)

如果用戶禁用了cookie,那么在編寫(xiě)超鏈接的時(shí)候,必須使用URL編碼,即:

response. encodeURL(url);

什么是URL重寫(xiě)?

簡(jiǎn)單的說(shuō),如果某個(gè)組件需要session機(jī)制的支持,且用戶禁止了cookie,則不能直接使用該組件的地址去訪問(wèn),而應(yīng)該使用服務(wù)器生成的組件的地址(會(huì)在組件的地址后面添加sessionId)去訪問(wèn)。如何重寫(xiě)?

用在連接地址,表單提交地址。

response.encodeURL(String url);

如果是重定向。

sesponse.encodeRedirectURL(“l(fā)ist.jsp”);

這樣編譯過(guò)的URL地址就會(huì)自動(dòng)在后面添加用戶session的id號(hào),那么所有的連接地址就會(huì)按如下格式進(jìn)行輸出,即每個(gè)地址都記錄了用戶的信息:

href='/JavaWeb/servlet/BuySession;jsessionid=283087307F0E79CC62208BDCF79FC52A'

這種方式不能實(shí)現(xiàn)用戶數(shù)據(jù)持久化。

(9)session的相關(guān)細(xì)節(jié)

如果即使用了URL地址編碼,也設(shè)置了寫(xiě)出cookie,那么第一次訪問(wèn)的時(shí)候服務(wù)器會(huì)即帶入cookie同時(shí)也進(jìn)行URL地址編碼,當(dāng)再次訪問(wèn)服務(wù)器時(shí),服務(wù)器已經(jīng)判斷出了瀏覽器是否禁用了cookie,如果沒(méi)有禁用,則使用cookie寫(xiě)入的方式,如果禁用了則使用URL地址編碼的方式

(10)session的優(yōu)缺點(diǎn)

優(yōu)點(diǎn):1、session相對(duì)安全。2、session能夠保存的數(shù)據(jù)類(lèi)型更豐富。3、session能夠保存的數(shù)據(jù)大小沒(méi)有限制。

缺點(diǎn):1、session需要將所有數(shù)據(jù)寫(xiě)在服務(wù)器端,所以服務(wù)器會(huì)占用過(guò)多的內(nèi)存空間,會(huì)影響服務(wù)器性能??梢钥紤]使用cookie或數(shù)據(jù)庫(kù)來(lái)保存數(shù)據(jù)。

(11)session案例

a、session登錄驗(yàn)證

step1、在登錄成功以后,在session對(duì)象上綁定數(shù)據(jù),比如:session.setAttribute(“user”,user);step2、對(duì)需要保護(hù)的資源(只有登錄成功以后才能訪問(wèn)的資源,比如主頁(yè)),添加session驗(yàn)證代碼:Object obj = session.getAttribute(“user”);If(obj==null)就跳轉(zhuǎn)到登錄界面

b、驗(yàn)證碼生成一個(gè)驗(yàn)證碼,然后將驗(yàn)證碼存儲(chǔ)到session中,然后從session中取出驗(yàn)證碼與客戶提交的驗(yàn)證碼進(jìn)行比對(duì),這是一個(gè)典型的session應(yīng)用。


上一篇:Cookie與Session有何異同?

下一篇:抓包分析SSL/TLS連接建立過(guò)程【總結(jié)】

在線咨詢(xún)

點(diǎn)擊這里給我發(fā)消息 售前咨詢(xún)專(zhuān)員

點(diǎn)擊這里給我發(fā)消息 售后服務(wù)專(zhuān)員

在線咨詢(xún)

免費(fèi)通話

24小時(shí)免費(fèi)咨詢(xún)

請(qǐng)輸入您的聯(lián)系電話,座機(jī)請(qǐng)加區(qū)號(hào)

免費(fèi)通話

微信掃一掃

微信聯(lián)系
返回頂部