久久综合九色综合97婷婷-美女视频黄频a免费-精品日本一区二区三区在线观看-日韩中文无码有码免费视频-亚洲中文字幕无码专区-扒开双腿疯狂进出爽爽爽动态照片-国产乱理伦片在线观看夜-高清极品美女毛茸茸-欧美寡妇性猛交XXX-国产亚洲精品99在线播放-日韩美女毛片又爽又大毛片,99久久久无码国产精品9,国产成a人片在线观看视频下载,欧美疯狂xxxx吞精视频

有趣生活

當(dāng)前位置:首頁>職場(chǎng)>cookie和session實(shí)現(xiàn)原理(作用及如何設(shè)置和相關(guān)面試)

cookie和session實(shí)現(xiàn)原理(作用及如何設(shè)置和相關(guān)面試)

發(fā)布時(shí)間:2024-01-24閱讀(12)

導(dǎo)讀一、誕生背景HTTP是無狀態(tài)的,即服務(wù)器無法知道兩個(gè)請(qǐng)求是否來自同一個(gè)瀏覽器,也就是服務(wù)器不知道用戶上一次做了什么,每次請(qǐng)求都是完全獨(dú)立的。早期互聯(lián)網(wǎng)只是用....

一、誕生背景

HTTP是無狀態(tài)的,即服務(wù)器無法知道兩個(gè)請(qǐng)求是否來自同一個(gè)瀏覽器,也就是服務(wù)器不知道用戶上一次做了什么,每次請(qǐng)求都是完全獨(dú)立的。

早期互聯(lián)網(wǎng)只是用于簡(jiǎn)單的瀏覽文檔信息、查看黃頁和門戶網(wǎng)站等,并沒有交互這個(gè)概念。但是隨著互聯(lián)網(wǎng)慢慢發(fā)展,寬帶、服務(wù)器等硬件設(shè)施得到了很多的提升,互聯(lián)網(wǎng)允許人們做更多的事情,所以交互式Web(交互式Web即客戶端與服務(wù)器可以互動(dòng),如用戶登錄、商品購(gòu)買和論壇等)慢慢就興起了,而HTTP無狀態(tài)的特點(diǎn)對(duì)此造成了嚴(yán)重阻礙。

由于不能記錄用戶上次的操作,偉大的程序員發(fā)明了隱藏域用于記錄用戶上一次的操作信息;通過隱藏域把用戶上次操作記錄放在form表單的input中,這樣請(qǐng)求時(shí)將表單提交就可以知道上一次用戶的操作了,但是這樣每次都得創(chuàng)建隱藏域而且需要賦值,既麻煩又容易出錯(cuò);但是隱藏域作用強(qiáng)大,時(shí)至今日都有很多人在用它解決各種問題。隱藏域的寫法如下:

<input type="hidden" name="field_name" value="value">

網(wǎng)景公司的盧-蒙特利Lou Montulli,在1994年將Cookies的概念應(yīng)用于網(wǎng)絡(luò)通信,用于解決用戶網(wǎng)上購(gòu)物的購(gòu)物車歷史記錄,而當(dāng)時(shí)最強(qiáng)大的瀏覽器也是網(wǎng)景瀏覽器;之后在網(wǎng)景瀏覽器的支持下其他瀏覽器也逐漸開始支持Cookie,到如今所有瀏覽器都支持Cookie了。

二、什么是Cookie

Cookie的誕生是為了解決HTTP無狀態(tài)的特性,用于滿足交互式Web。

圖1. Chrome瀏覽器百度首頁Cookies

cookie和session實(shí)現(xiàn)原理(作用及如何設(shè)置和相關(guān)面試)(1)

圖2. Firefox瀏覽器百度首頁Cookie

cookie和session實(shí)現(xiàn)原理(作用及如何設(shè)置和相關(guān)面試)(2)

圖3. Safari瀏覽器百度首頁Cookie

cookie和session實(shí)現(xiàn)原理(作用及如何設(shè)置和相關(guān)面試)(3)

上圖中可以看到在Chrome、Firefox和Safari瀏覽器中百度首頁的Cookie,在表格中,每一行都代表著一個(gè)Cookie。Cookie是由服務(wù)器發(fā)給客戶端的特殊信息,而這些信息以文本文件的形式存儲(chǔ)在客戶端,然后客戶端每次向服務(wù)器發(fā)送請(qǐng)求的時(shí)候都會(huì)帶上這些特殊的信息,用于服務(wù)器記錄客戶端的狀態(tài)。

Cookie主要運(yùn)用于以下三個(gè)方面:

1、會(huì)話狀態(tài)管理,如用戶登錄狀態(tài)、購(gòu)物車、游戲分?jǐn)?shù)或其他需要記錄的信息;

2、個(gè)性化設(shè)置,如用戶自定義設(shè)置、主題等;

3、瀏覽器行為跟蹤。

三、Cookie原理

Cookie是由服務(wù)器發(fā)出存儲(chǔ)在瀏覽器的特殊信息,其具體的過程可以通過一個(gè)用戶登錄的例子來了解。

圖4. Cookie工作原理

cookie和session實(shí)現(xiàn)原理(作用及如何設(shè)置和相關(guān)面試)(4)

如上圖所示,用戶在輸入用戶名和密碼之后,瀏覽器將用戶名和密碼發(fā)送給服務(wù)器,服務(wù)器進(jìn)行驗(yàn)證,驗(yàn)證通過后將用戶信息加密后封裝成Cookie放在請(qǐng)求頭中返回給瀏覽器。

HTTP/1.1 200 OKContent-type: text/htmlSet-Cookie: user_cookie=Rg3vHJZnehYLjVg7qi3bZjzg; Expires=Tue, 15 Aug 2019 21:47:38 GMT; Path=/; Domain=.169it.com; HttpOnly[響應(yīng)體]

瀏覽器收到服務(wù)器返回的數(shù)據(jù),發(fā)現(xiàn)請(qǐng)求頭中有一個(gè):Set-Cookie,然后它就把這個(gè)Cookie保存起來,下次瀏覽器再請(qǐng)求服務(wù)器的時(shí)候,會(huì)把Cookie也一起放在請(qǐng)求頭中傳給服務(wù)器。

GET /sample_page.html HTTP/1.1Host: www.example.orgCookie: user_cookie=Rg3vHJZnehYLjVg7qi3bZjzg

服務(wù)器收到請(qǐng)求后從請(qǐng)求頭中拿到Cookie,然后解析并得到用戶信息,說明此用戶已登錄,因此Cookie是將數(shù)據(jù)保存在客戶端的。

從上述用戶登錄的例子可以看出,用戶信息是保存在Cookie中,也就相當(dāng)于是保存在瀏覽器中的,那么用戶就可以隨意更改用戶信息,這是一種不安全的策略。另外,Cookie無論是服務(wù)器發(fā)送給瀏覽器,還是瀏覽器發(fā)送給服務(wù)器,都是放在請(qǐng)求頭中的。

四、Cookie屬性

從上圖的Chorme、Firefox和Safari瀏覽器可以看到一個(gè)Cookie有:Name、Value、Domian、Path、Expires/Max-Age、Size、Http(Httponly)和Secure這些屬性。

1、Name & Value

Name表示Cookie的名稱,服務(wù)器就是通過name屬性來獲取某個(gè)Cookie的值。

Value表示Cookie的值,多數(shù)情況下服務(wù)器會(huì)把這個(gè)value當(dāng)做一個(gè)Key去緩存中查詢保存的數(shù)據(jù)。

2、Domain & Path

Domian表示可以訪問此Cookie的域名,下圖我們以百度貼吧首頁的Cookie來了解下Domain的屬性。

圖5. Chrome瀏覽器貼吧首頁Cookies Domain

cookie和session實(shí)現(xiàn)原理(作用及如何設(shè)置和相關(guān)面試)(5)

圖中可以看出,第三列的Domian有:.baidu.com頂級(jí)域名和.teiba.baidu.com二級(jí)域名;所以這里就有一個(gè)訪問規(guī)則:頂級(jí)域名只能設(shè)置或訪問頂級(jí)域名的Cookie,二級(jí)以下的域名只能訪問或設(shè)置自身或者頂級(jí)域名的Cookie,所以如果要在多個(gè)二級(jí)域名中共享Cookie的話,只能將Domain的屬性設(shè)置為頂級(jí)域名。

Path表示可以訪問此Cookie的頁面路徑;如path=/test,那么只有/test路徑下的頁面可以讀取此Cookie。

3、Expire/Max-Age

Expire/Max-Age表示此cookie的超時(shí)時(shí)間;若設(shè)置其值為一個(gè)時(shí)間,那么當(dāng)?shù)竭_(dá)此時(shí)間后,此cookie則會(huì)失效;不設(shè)置的話默認(rèn)值是Session,意思是cookie會(huì)和session一起失效;當(dāng)瀏覽器關(guān)閉(關(guān)閉整個(gè)瀏覽器,而不是瀏覽器的標(biāo)簽頁)后,此cookie失效。另外,當(dāng)Cookie的過期時(shí)間被設(shè)定時(shí),設(shè)定的日期和時(shí)間只與客戶端相關(guān),與服務(wù)端無關(guān)。

4、Size

Size表示Cookie的name value的字符數(shù),比如有一個(gè)Cookie:id=666,那么Size=2 3=5。2即是name,3即為value,各個(gè)瀏覽器對(duì)Cookie的支持都有所不同,如下圖:

圖6. 各瀏覽器Cookie支持的個(gè)數(shù)

cookie和session實(shí)現(xiàn)原理(作用及如何設(shè)置和相關(guān)面試)(6)

5、HTTP

HTTP表示cookie的httponly屬性;若此屬性為true,則只有在http請(qǐng)求頭中會(huì)帶有此cookie的信息,而不能通過document.cookie來訪問此cookie。這么設(shè)計(jì)是為了提供一個(gè)安全措施來幫助阻止通過JavaScript發(fā)起的跨站腳本攻擊(XXS)竊取cookie的惡劣行為。

圖7. document.cookie

cookie和session實(shí)現(xiàn)原理(作用及如何設(shè)置和相關(guān)面試)(7)

6、Secure

Secure表示是否只能通過https來傳遞此條cookie;不像其他選項(xiàng),該選項(xiàng)只是一個(gè)標(biāo)記并且沒有其他的值。

五、Java操作Cookie

1、生成Cookie

cookie和session實(shí)現(xiàn)原理(作用及如何設(shè)置和相關(guān)面試)(8)

1 package com.ausclouds.bdbsec.auth.cmb; 2 3 import javax.servlet.http.Cookie; 4 import javax.servlet.http.HttpServlet; 5 import javax.servlet.http.HttpServletRequest; 6 import javax.servlet.http.HttpServletResponse; 7 8 public class CookieServlet extends HttpServlet { 9 10 @Override11 protected void service(HttpServletRequest req, HttpServletResponse resp){12 //創(chuàng)建Cookie對(duì)象13 Cookie comCookie = new Cookie("computer", "HP");14 //服務(wù)器把cookie響應(yīng)給客戶端,所有的cookie對(duì)象,都會(huì)在服務(wù)器端創(chuàng)建,通過http響應(yīng)給客戶端(瀏覽器)15 16 //如果不設(shè)置使用時(shí)間,則取不到Cookie的值17 comCookie.setMaxAge(60*60*24*30);18 19 //一旦設(shè)置了cookie的路徑,就只能通過這一個(gè)路徑才能獲取到cookie的信息20 comCookie.setPath(req.getContextPath() "/getCookie.sxt");21 22 //添加cookie23 resp.addCookie(comCookie);24 25 }26 }

cookie和session實(shí)現(xiàn)原理(作用及如何設(shè)置和相關(guān)面試)(9)

2、獲取Cookie

cookie和session實(shí)現(xiàn)原理(作用及如何設(shè)置和相關(guān)面試)(10)

1 package com.ausclouds.bdbsec.auth.cmb; 2 3 import javax.servlet.http.Cookie; 4 import javax.servlet.http.HttpServlet; 5 import javax.servlet.http.HttpServletRequest; 6 import javax.servlet.http.HttpServletResponse; 7 8 public class GetCookieServlet extends HttpServlet { 9 10 @Override11 protected void service(HttpServletRequest req, HttpServletResponse resp){12 //獲取cookie信息13 Cookie[] cookies = req.getCookies();14 for (int i = 0; i<cookies.length; i ){15 System.out.println(cookies[i].getName() ":" cookies[i].getValue());16 }17 }18 19 }

cookie和session實(shí)現(xiàn)原理(作用及如何設(shè)置和相關(guān)面試)(11)

3、刪除Cookie

//刪除Cookie的思路就是替換原來的cookie,并設(shè)置它的生存時(shí)間為0Cookie cookie = new Cookie("Cookie",null);//cookie名字要相同    cookie.setMaxAge(0); // cookie.setPath(request.getContextPath()); // 相同路徑 response.addCookie(cookie);

六、Session

1、誕生背景

其實(shí)設(shè)計(jì)Cookie之初,它并不是僅僅保存了一個(gè)key值,而是直接保存用戶的信息,但是由于cookie是存在客戶端的,而且本身存儲(chǔ)的尺寸大小也是有限的,最關(guān)鍵的是用戶是可見的,并且可以隨意地修改,這相當(dāng)?shù)夭话踩榱思劝踩址奖愕淖x取全局信息,于是誕生了Session這種新的存儲(chǔ)會(huì)話機(jī)制。

2、什么是Session

Session翻譯為會(huì)話,服務(wù)器為每個(gè)瀏覽器創(chuàng)建一個(gè)會(huì)話對(duì)象,瀏覽器在第一次請(qǐng)求服務(wù)器時(shí),服務(wù)器便會(huì)為該瀏覽器生成一個(gè)Seesion對(duì)象,保存在服務(wù)端,并且把Session的Id以cookie的形式發(fā)送給客戶端瀏覽器,最終以用戶顯示結(jié)束或session超時(shí)為結(jié)束。

Session工作原理:

1.當(dāng)某個(gè)用戶向服務(wù)器發(fā)送第一個(gè)請(qǐng)求時(shí),服務(wù)器為其建立一個(gè)sesion,并為此session創(chuàng)建一個(gè)標(biāo)識(shí)號(hào)(sessionID);

2.這個(gè)用戶隨后的所有請(qǐng)求都應(yīng)包括這個(gè)標(biāo)識(shí)號(hào)(sessionID),服務(wù)器會(huì)校對(duì)這個(gè)標(biāo)識(shí)號(hào)以判斷請(qǐng)求是屬于哪個(gè)session的;

3.sessionID標(biāo)識(shí)號(hào)有兩種實(shí)現(xiàn)方式:Cookie和URL重寫;

4.Cookie是將數(shù)據(jù)直接保存在客戶端,而Session是將數(shù)據(jù)保存在服務(wù)端,所以Session的安全性更佳。

圖8. Session工作原理(基于Cookie實(shí)現(xiàn))

cookie和session實(shí)現(xiàn)原理(作用及如何設(shè)置和相關(guān)面試)(12)

3、Java操作Session

1.創(chuàng)建Session

ActionContext actionContext = ActionContext.getContext();Map<String, Object> mapSession = actionContext.getSession();mapSession.put("branch", branch);mapSession.put("permission", per);

2.JSP獲取Session

cookie和session實(shí)現(xiàn)原理(作用及如何設(shè)置和相關(guān)面試)(13)

1 if(session.getAttribute("branch") == null||session.getAttribute("permission") == null)2 {3 response.setCharacterEncoding("utf-8");4 out.print("<script>alert(您還沒有登錄,請(qǐng)登錄) </script>");5 out.flush();6 out.close();7 }

cookie和session實(shí)現(xiàn)原理(作用及如何設(shè)置和相關(guān)面試)(14)

3.Java后臺(tái)獲取Session

1 ActionContext actionContext = ActionContext.getContext();2 Map session = actionContext.getSession();3 String inputUserid =(String)session.get("username");4 String proving =(String)session.get("proving");

七、面試相關(guān)

1、Cookie和Session的關(guān)系?

1. 二者都是為實(shí)現(xiàn)客戶端與服務(wù)端交互而服務(wù)的;

2. Cookie是保存在客戶端,缺點(diǎn)易偽造、不安全;

3. Session是保存在服務(wù)端,會(huì)消耗服務(wù)器資源;

4. Session實(shí)現(xiàn)有兩種方式:Cookie和URL重寫。

2、Cookie帶來的安全性問題?

1. 會(huì)話劫持和XSS:在Web應(yīng)用中,Cookie常用來標(biāo)記用戶或授權(quán)會(huì)話。因此,如果Web應(yīng)用的Cookie被竊取,可能導(dǎo)致授權(quán)用戶的會(huì)話受到攻擊;常用的竊取Cookie的方式有社會(huì)工程學(xué)攻擊和應(yīng)用程序漏洞進(jìn)行XSS攻擊;

2. 跨站請(qǐng)求偽造(CSRF):維基百科已經(jīng)給出了一個(gè)較好的CSRF例子。如在不安全的聊天室或論壇上的一張圖片,它實(shí)際上是一個(gè)給你銀行服務(wù)器發(fā)送提現(xiàn)的請(qǐng)求:

<img src="http://bank.example.com/withdraw?account=bob&amount=1000000&for=mallory">

當(dāng)你點(diǎn)擊打開該圖片時(shí),如果之前已經(jīng)登錄過你的銀行賬號(hào)并且Cookie仍未失效,那么你銀行里的錢很可能會(huì)被自動(dòng)轉(zhuǎn)走;解決CSRF的辦法有:隱藏域驗(yàn)證碼、確認(rèn)機(jī)制和設(shè)置較短的Cookie生命周期等。

3、Session應(yīng)用場(chǎng)景?

Session主要是服務(wù)器端存儲(chǔ),用來描述一些用戶信息或者相關(guān)的其他數(shù)據(jù),還可以是其他類型的數(shù)據(jù),只要是你的業(yè)務(wù)覺得可以綁定到用戶或客戶端的相關(guān)數(shù)據(jù)都可以放到session中;最基本的場(chǎng)景就是存儲(chǔ)登錄用戶信息。

4、Session生命周期?

1、創(chuàng)建:若訪問的第一個(gè)資源是JSP頁面,則創(chuàng)建session對(duì)象;若訪問的第一個(gè)資源是Servlet,則需要手動(dòng)調(diào)用request.getSession()方法來創(chuàng)建session對(duì)象;

2、銷毀:調(diào)用session.invalidate()方法來銷毀session()對(duì)象,session會(huì)話超時(shí)默認(rèn)30分鐘。


最后我自己是一名從事了多年開發(fā)的JAVA老程序員,今年年初我花了一個(gè)月整理了一份最適合2019年學(xué)習(xí)的java學(xué)習(xí)干貨,我想分享給每一位喜歡java的小伙伴,想要獲取的可以關(guān)注我并在后臺(tái)私信我:01,即可免費(fèi)獲取。

TAGS標(biāo)簽:  cookie  session  實(shí)現(xiàn)  原理  作用  cookie和ses

歡迎分享轉(zhuǎn)載→http://www.avcorse.com/read-233326.html

Copyright ? 2024 有趣生活 All Rights Reserve吉ICP備19000289號(hào)-5 TXT地圖HTML地圖XML地圖