文章分享

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

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

淺談Cookie與Session技術(shù)

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

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

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

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

注意:具體會(huì)話和瀏覽器版本,廠商有關(guān),如IE7及以下,每開一個(gè)瀏覽器都創(chuàng)建一個(gè)新的session,而IE8及以上,則實(shí)現(xiàn)多個(gè)瀏覽器共享同一個(gè)session。因?yàn)镮E8及以上,都共享同一個(gè)進(jìn)程,只開辟一個(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ù)器時(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的查詢

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保存在硬盤上,超過指定時(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的編碼問題

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

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

(6)cookie的路徑問題

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

(7)cookie域

setDomain:設(shè)置cookie域,指的是訪問某個(gè)域的時(shí)候,才會(huì)帶入cookie,訪問其他域,不會(huì)帶入cookie。默認(rèn)會(huì)禁止該設(shè)置,因?yàn)榘踩暂^差,如,訪問baidu.com,baidu.com寫一個(gè)域是google.com的cookie,那么訪問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ù)器時(shí),服務(wù)器會(huì)創(chuàng)建一個(gè)session對(duì)象(該對(duì)象有一個(gè)唯一的id號(hào),稱之為sessionId)服務(wù)器在默認(rèn)的情況下,會(huì)將sessionId以cookie的方式,發(fā)送給瀏覽器,瀏覽器會(huì)將sessionId保存到內(nèi)存中。當(dāng)瀏覽器再次訪問服務(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)中有沒有sessionId,如果沒有,則創(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)中有沒有sessionId,如果沒有則返回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í)間過長(zhǎng)的session對(duì)象從內(nèi)存空間刪除掉,原因是過多的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í)間。另外,還可以通過session.setMaxInactiveInterval(int seconds);設(shè)置session的超時(shí)時(shí)間。

(5)session的生命周期

session的創(chuàng)建:當(dāng)用戶訪問某個(gè)可以創(chuàng)建session的servlet的時(shí)候,該servlet才會(huì)創(chuàng)建session。當(dāng)session超過默認(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也是通過cookie來實(shí)現(xiàn)發(fā)送到瀏覽器內(nèi)存中的。所以可以考慮用cookie來替換該session。如果用戶在中途關(guān)閉瀏覽器的話,那么session就隨著瀏覽器內(nèi)存的釋放而釋放,那么如果想持久化session的話,可以考慮使用cookie技術(shù)。

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

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

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

response. encodeURL(url);

什么是URL重寫?

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

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

response.encodeURL(String url);

如果是重定向。

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

這樣編譯過的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è)置了寫出cookie,那么第一次訪問的時(shí)候服務(wù)器會(huì)即帶入cookie同時(shí)也進(jìn)行URL地址編碼,當(dāng)再次訪問服務(wù)器時(shí),服務(wù)器已經(jīng)判斷出了瀏覽器是否禁用了cookie,如果沒有禁用,則使用cookie寫入的方式,如果禁用了則使用URL地址編碼的方式

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

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

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

(11)session案例

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

step1、在登錄成功以后,在session對(duì)象上綁定數(shù)據(jù),比如:session.setAttribute(“user”,user);step2、對(duì)需要保護(hù)的資源(只有登錄成功以后才能訪問的資源,比如主頁(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連接建立過程【總結(jié)】

在線咨詢

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

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

在線咨詢

免費(fèi)通話

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

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

免費(fèi)通話

微信掃一掃

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