精品人妻少妇一区二区老女人_欧美精品视频第一区_中文字幕一区二区无码_蘑菇精品嫩草影院88av

文章分享

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

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

Cookie與Session

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

滿多少次送1次  理發(fā)等 

 

Cookie:

 

HTTP協(xié)議本身是無(wú)狀態(tài)的,這與HTTP協(xié)議本來(lái)的目的是相符的,客戶端只需要簡(jiǎn)單的向服務(wù)器請(qǐng)求下載某些文件,無(wú)論是客戶端還是服務(wù)器都沒(méi)有必要紀(jì)錄彼此過(guò)去的行為,每一次請(qǐng)求之間都是獨(dú)立的,好比一個(gè)顧客和一個(gè)自動(dòng)售貨機(jī)或者一個(gè)普通的(非會(huì)員制)大賣場(chǎng)之間的關(guān)系一樣。 

 

然而聰明的人們很快發(fā)現(xiàn)如果能夠提供一些按需生成的動(dòng)態(tài)信息會(huì)使web變得更加有用,就像給有線電視加上點(diǎn)播功能一樣。這種需求一方面迫使HTML逐步添加了表單、腳本、DOM等客戶端行為,另一方面在服務(wù)器端則出現(xiàn)了CGI規(guī)范以響應(yīng)客戶端的動(dòng)態(tài)請(qǐng)求,作為傳輸載體的HTTP協(xié)議也添加了文件上載、cookie這些特性。其中cookie的作用就是為了解決HTTP協(xié)議無(wú)狀態(tài)的缺陷所作出的努力。至于后來(lái)出現(xiàn)的session機(jī)制則是又一種在客戶端與服務(wù)器之間保持狀態(tài)的解決方案。 

 

Cookies是作為HTTP傳輸?shù)念^信息的一部分發(fā)給客戶機(jī)的,所以向客戶機(jī)發(fā)送Cookies的代碼一般放在發(fā)送給瀏覽器的HTML文件的標(biāo)記之前。

 

正統(tǒng)的cookie分發(fā)是通過(guò)擴(kuò)展HTTP協(xié)議來(lái)實(shí)現(xiàn)的,服務(wù)器通過(guò)在HTTP的響應(yīng)頭中加上一行特殊的指示以提示瀏覽器按照指示生成相應(yīng)的cookie。然而純粹的客戶端腳本如JavaScript或者VBScript也可以生成cookie。 

而cookie的使用是由瀏覽器按照一定的原則在后臺(tái)自動(dòng)發(fā)送給服務(wù)器的。瀏覽器檢查所有存儲(chǔ)的cookie,如果某個(gè)cookie所聲明的作用范圍大于等于將要請(qǐng)求的資源所在的位置,則把該cookie附在請(qǐng)求資源的HTTP請(qǐng)求頭上發(fā)送給服務(wù)器。

  

由于Cookies的信息并不都是以文件形式存放在計(jì)算機(jī)里,還有部分信息保存在內(nèi)存里。比如你在瀏覽網(wǎng)站的時(shí)候,Web服務(wù)器會(huì)自動(dòng)在內(nèi)存中生成Cookie,當(dāng)你關(guān)閉IE瀏覽器的時(shí)候又自動(dòng)把Cookie刪除

 

默認(rèn)情況下,如果在某個(gè)頁(yè)面創(chuàng)建了一個(gè)cookie,那么該頁(yè)面所在目錄中的其他頁(yè)面也可以訪問(wèn)該cookie。如果這個(gè)目錄下還有子目錄,則在子目錄中也可以訪問(wèn)。

例如在www.xxxx.com/html/a.html中所創(chuàng)建的cookie,可以被www.xxxx.com/html/b.html或www.xxx.com/ html/some/c.html所訪問(wèn),但不能被www.xxxx.com/d.html訪問(wèn)。 

語(yǔ)法如下: document.cookie="name=value; path=cookieDir"; 其中cookieDir表示可訪問(wèn)cookie的目錄。

例如: document.cookie="userId=320; path=/shop"; 就表示當(dāng)前cookie僅能在shop目錄下使用。 如果要使cookie在整個(gè)網(wǎng)站下可用,可以將cookie_dir指定為根目錄,例如: document.cookie="userId=320; path=/"; 

  

hosts文件實(shí)際上可以看成一個(gè)本機(jī)的DNS系統(tǒng),它可以負(fù)責(zé)把域名解釋成IP地址,它的優(yōu)先權(quán)比DNS服務(wù)器要高,它的具體實(shí)現(xiàn)是TCP/IP協(xié)議中的一部分。

  

一、cookie機(jī)制和session機(jī)制的區(qū)別

***********************************************************************

具體來(lái)說(shuō)cookie機(jī)制采用的是在客戶端保持狀態(tài)的方案,而session機(jī)制采用的是在服務(wù)器端保持狀態(tài)的方案。

同時(shí)我們也看到,由于服務(wù)器端保持狀態(tài)的方案在客戶端也需要保存一個(gè)標(biāo)識(shí),所以session機(jī)制可能需要借助于cookie機(jī)制來(lái)達(dá)到保存標(biāo)識(shí)的目的,但實(shí)際上還有其他選擇

  

二、會(huì)話cookie持久cookie的區(qū)別

***********************************************************************

如果不設(shè)置過(guò)期時(shí)間,則表示這個(gè)cookie生命周期為瀏覽器會(huì)話期間,只要關(guān)閉瀏覽器窗口,cookie就消失了。這種生命期為瀏覽會(huì)話期的cookie被稱為會(huì)話cookie。會(huì)話cookie一般不保存在硬盤上而是保存在內(nèi)存里。

  如果設(shè)置了過(guò)期時(shí)間,瀏覽器就會(huì)把cookie保存到硬盤上,關(guān)閉后再次打開(kāi)瀏覽器,這些cookie依然有效直到超過(guò)設(shè)定的過(guò)期時(shí)間,如果過(guò)了此期限Cookies就自動(dòng)被刪除。

 

  存儲(chǔ)在硬盤上的cookie可以在不同的瀏覽器進(jìn)程(注意不是不同的瀏覽器)間共享,比如兩個(gè)IE窗口。而對(duì)于保存在內(nèi)存的cookie,不同的瀏覽器有不同的處理方式。

  

三、cookie如何解決快瀏覽器共享?

就是在IE里瀏覽器一個(gè)網(wǎng)站存了一些cookie,如何在別的瀏覽器再次打開(kāi)這個(gè)網(wǎng)站還能去讀到這些cookie.

 

cookie多瀏覽器實(shí)際上也是cookie跨域解決方案的范疇。

可通過(guò)cookie + JSONP來(lái)實(shí)現(xiàn)

 

cookies屬于隱私數(shù)據(jù),不同瀏覽器保存在不同地方。不可能共享的

再說(shuō)了市面上也基本見(jiàn)不到跨瀏覽器共享cookie的網(wǎng)站

 

在同一個(gè)瀏覽器中,打開(kāi)不同的網(wǎng)站可以讀取cookie是可以實(shí)現(xiàn)的,也就是所謂的跨域訪問(wèn)cookie

 

那個(gè)應(yīng)該叫跨瀏覽器訪問(wèn)cookie 而不是跨域

跨域的概念是: b域試圖訪問(wèn)a域下的資源。

你用firefox打開(kāi)的web.qq.com, 難道用ie或者chrome代開(kāi)的難道不是這個(gè)域名了

存儲(chǔ)和跟蹤用戶數(shù)據(jù)的方式不僅現(xiàn)于cookie, 比如可以記住你的ip, 或者讓上所說(shuō)使用flash

大概搜索了下 沒(méi)找到所謂的跨瀏覽器操作cookie

  

 

Session:

 

 session機(jī)制是一種服務(wù)器端的機(jī)制,服務(wù)器使用一種類似于散列表的結(jié)構(gòu)(也可能就是使用散列表)來(lái)保存信息。 

 

 當(dāng)程序需要為某個(gè)客戶端的請(qǐng)求創(chuàng)建一個(gè)session的時(shí)候,服務(wù)器首先檢查這個(gè)客戶端的請(qǐng)求里是否已包含了一個(gè)session標(biāo)識(shí) - 稱為session id,如果已包含一個(gè)session id則說(shuō)明以前已經(jīng)為此客戶端創(chuàng)建過(guò)session,服務(wù)器就按照session id把這個(gè)session檢索出來(lái)使用(如果檢索不到,可能會(huì)新建一個(gè)),如果客戶端請(qǐng)求不包含session id,則為此客戶端創(chuàng)建一個(gè)session并且生成一個(gè)與此session相關(guān)聯(lián)的session id,session id的值應(yīng)該是一個(gè)既不會(huì)重復(fù),又不容易被找到規(guī)律以仿造的字符串,這個(gè)session id將被在本次響應(yīng)中返回給客戶端保存。 

 

Session是什么

 

HTTP協(xié)議是一種無(wú)狀態(tài)的協(xié)議,用戶通過(guò)瀏覽器訪問(wèn)服務(wù)端的每次請(qǐng)求都是相互獨(dú)立的,服務(wù)端無(wú)法直接通過(guò)HTTP請(qǐng)求來(lái)判斷上次請(qǐng)求的用戶和本次請(qǐng)求的用戶是否是同一人,當(dāng)然,你可以使用Cookie來(lái)傳遞用戶狀態(tài)的標(biāo)識(shí),但是每次發(fā)起請(qǐng)求都必須來(lái)回傳遞這些Cookie數(shù)據(jù),為了實(shí)現(xiàn)更多的狀態(tài)跟蹤,傳遞的Cookie數(shù)據(jù)會(huì)越來(lái)越多,這無(wú)形中增加了瀏覽器與服務(wù)端的數(shù)據(jù)傳輸?shù)膲毫蛷?fù)雜性,Cookie的大小不僅有限制,而且這種方式是不安全的,容易被盜取和篡改,然而session的出現(xiàn)正解決了這些問(wèn)題session是存儲(chǔ)于服務(wù)端的、用于記錄和保持某些狀態(tài)的一種會(huì)話跟蹤技術(shù)。用戶通過(guò)瀏覽器發(fā)起請(qǐng)求的時(shí)候,不用每次都回傳所有的Cookie值了,只要回傳一個(gè)key-value的鍵值對(duì)就可以了,一般情況下這個(gè)key為JSESIONID,value為客戶端第一次訪問(wèn)服務(wù)端時(shí)生成的唯一值,這個(gè)value可以標(biāo)識(shí)和跟蹤用戶的會(huì)話信息,這個(gè)value在服務(wù)端被習(xí)慣稱作sessionId。

 

如何實(shí)現(xiàn)保持會(huì)話

 

正常情況下,用戶第一次通過(guò)瀏覽器請(qǐng)求服務(wù)端的時(shí)候是沒(méi)有value的,此時(shí)服務(wù)端會(huì)通過(guò)request.getSession()方法創(chuàng)建一個(gè)HttpSession對(duì)象,并給它設(shè)置一個(gè)有效期,然后將這個(gè)對(duì)象存儲(chǔ)在sessions的容器中,同時(shí)會(huì)把sessionId返回給瀏覽器端。如果用戶再次發(fā)起請(qǐng)求,服務(wù)端在解析得到sessionId后,會(huì)判斷sessionId對(duì)應(yīng)的HttpSession是否存在,如果不存在,會(huì)創(chuàng)建一個(gè)HttpSession對(duì)象,并將這個(gè)對(duì)象存儲(chǔ)在sessions的容器中,同時(shí)會(huì)把sessionId返回給瀏覽器端;如果存在,將可以得到對(duì)應(yīng)的HttpSession對(duì)象,這個(gè)HttpSession對(duì)象可以存儲(chǔ)很多狀態(tài)或表示數(shù)據(jù),如session.setAttribute(),從而實(shí)現(xiàn)會(huì)話跟蹤。

 

session對(duì)象都有一個(gè)有效期,一般情況下,應(yīng)用容器都會(huì)有一個(gè)后臺(tái)線程用于檢查每個(gè)session是否失效,如果失效將會(huì)被清除。而值得注意的是,調(diào)用request.getSession()時(shí)會(huì)檢查對(duì)應(yīng)的session對(duì)象是否過(guò)期,如果過(guò)期將會(huì)創(chuàng)建一個(gè)新session對(duì)象。

 

在應(yīng)用容器重啟或關(guān)閉的時(shí)候,未過(guò)期的session對(duì)象會(huì)被持久化到一個(gè)SESSIONS.ser文件中,當(dāng)應(yīng)用容器再次啟動(dòng)的時(shí)候,會(huì)重新讀取SESSIONS.ser中所有未過(guò)期的session對(duì)象,并將它們存儲(chǔ)到sessions集合中。一個(gè)應(yīng)用服務(wù)器存儲(chǔ)一套session數(shù)據(jù)。

 

一、保存session id的幾種方式

1、cookie,這樣在交互過(guò)程中瀏覽器可以自動(dòng)的按照規(guī)則把這個(gè)標(biāo)識(shí)發(fā)揮給服務(wù)器。一般這個(gè)cookie的名字都是類似于SEEESIONID,而。比如weblogic對(duì)于web應(yīng)用程序生成的cookie,JSESSIONID=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764,它的名字就是JSESSIONID。

 

 

 

2、由于cookie可以被人為的禁止,必須有其他機(jī)制以便在cookie被禁止時(shí)仍然能夠把session id傳遞回服務(wù)器,經(jīng)常被使用的一種技術(shù)叫做URL重寫,就是把session id直接附加在URL路徑的后面。

附加方式也有兩種,

一種是作為URL路徑的附加信息,表現(xiàn)形式為http://...../xxx;jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764 

另一種是作為查詢字符串附加在URL后面,表現(xiàn)形式為http://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764 

 

這兩種方式對(duì)于用戶來(lái)說(shuō)是沒(méi)有區(qū)別的,只是服務(wù)器在解析的時(shí)候處理的方式不同,采用第一種方式也有利于把session id的信息和正常程序參數(shù)區(qū)分開(kāi)來(lái)。 

為了在整個(gè)交互過(guò)程中始終保持狀態(tài),就必須在每個(gè)客戶端可能請(qǐng)求的路徑后面都包含這個(gè)session id。 

 

3、另一種技術(shù)叫做表單隱藏字段。就是服務(wù)器會(huì)自動(dòng)修改表單,添加一個(gè)隱藏字段,以便在表單提交時(shí)能夠把session id傳遞回服務(wù)器。比如下面的表單: 

   

   <form name="testform" action="/xxx"> 

<input type="text"> 

    </form> 

 

    在被傳遞給客戶端之前將被改寫成: 

 

    <form name="testform" action="/xxx"> 

<input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764"> 

<input type="text"> 

    </form> 

 

    這種技術(shù)現(xiàn)在已較少應(yīng)用,很古老的iPlanet6(SunONE應(yīng)用服務(wù)器的前身)就使用了這種技術(shù)。 

實(shí)際上這種技術(shù)可以簡(jiǎn)單的用對(duì)action應(yīng)用URL重寫來(lái)代替。 

 

 

二、session什么時(shí)候被創(chuàng)建

一個(gè)常見(jiàn)的錯(cuò)誤是以為session在有客戶端訪問(wèn)時(shí)就被創(chuàng)建,然而事實(shí)是直到某server端程序(如Servlet)調(diào)用HttpServletRequest.getSession(true)這樣的語(yǔ)句時(shí)才會(huì)被創(chuàng)建。

 

注意如果JSP沒(méi)有顯示的使用 <%@page session="false"%> 關(guān)閉session,則JSP文件在編譯成Servlet時(shí)將會(huì)自動(dòng)加上這樣一條語(yǔ)句HttpSession session = HttpServletRequest.getSession(true);這也是JSP中隱含的session對(duì)象的來(lái)歷。

  

三、session何時(shí)被刪除

 

session在下列情況下被刪除:

A.程序調(diào)用HttpSession.invalidate()

B.距離上一次收到客戶端發(fā)送的session id時(shí)間間隔超過(guò)了session的最大有效時(shí)間

C.服務(wù)器進(jìn)程被停止

再次注意關(guān)閉瀏覽器只會(huì)使存儲(chǔ)在客戶端瀏覽器內(nèi)存中的session cookie失效,不會(huì)使服務(wù)器端的session對(duì)象失效。

 

四、是否只要關(guān)閉瀏覽器,session就消失了

程序一般都是在用戶做login off的時(shí)候發(fā)個(gè)指令去刪除session,然而瀏覽器從來(lái)不會(huì)主動(dòng)在關(guān)閉之前通知服務(wù)器它將要被關(guān)閉,因此服務(wù)器根本不會(huì)有機(jī)會(huì)知道瀏覽器已經(jīng)關(guān)閉。服務(wù)器會(huì)一直保留這個(gè)會(huì)話對(duì)象直到它處于非活動(dòng)狀態(tài)超過(guò)設(shè)定的間隔為止。

之所以會(huì)有這種錯(cuò)誤的認(rèn)識(shí),是因?yàn)?span style="box-sizing: border-box; font-weight: bolder;">大部分session機(jī)制都使用會(huì)話cookie來(lái)保存session id,而關(guān)閉瀏覽器后這個(gè)session id就消失了,再次連接到服務(wù)器時(shí)也就無(wú)法找到原來(lái)的session。

如果服務(wù)器設(shè)置的cookie被保存到硬盤上,或者使用某種手段改寫瀏覽器發(fā)出的HTTP請(qǐng)求報(bào)頭,把原來(lái)的session id發(fā)送到服務(wù)器,則再次打開(kāi)瀏覽器仍然能夠找到原來(lái)的session。

恰恰是由于關(guān)閉瀏覽器不會(huì)導(dǎo)致session被刪除,迫使服務(wù)器為session設(shè)置了一個(gè)失效時(shí)間,當(dāng)距離客戶上一次使用session的時(shí)間超過(guò)了這個(gè)失效時(shí)間時(shí),服務(wù)器就可以認(rèn)為客戶端已經(jīng)停止了活動(dòng),才會(huì)把session刪除以節(jié)省存儲(chǔ)空間。

 

由此我們可以得出如下結(jié)論:

  關(guān)閉瀏覽器,只會(huì)是瀏覽器端內(nèi)存里的session cookie消失,但不會(huì)使保存在服務(wù)器端的session對(duì)象消失,同樣也不會(huì)使已經(jīng)保存到硬盤上的持久化cookie消失。

 

 

五、打開(kāi)兩個(gè)瀏覽器窗口訪問(wèn)應(yīng)用程序會(huì)使用同一個(gè)session還是不同的session

 

通常session cookie是不能跨窗口使用的,當(dāng)你新開(kāi)了一個(gè)瀏覽器窗口進(jìn)入相同頁(yè)面時(shí),系統(tǒng)會(huì)賦予你一個(gè)新的session id,這樣我們信息共享的目的就達(dá)不到了。

此時(shí)我們可以先把session id保存在persistent cookie中(通過(guò)設(shè)置session的最大有效時(shí)間),然后在新窗口中讀出來(lái),就可以得到上一個(gè)窗口的session id了,這樣通過(guò)session cookie和persistent cookie的結(jié)合我們就可以實(shí)現(xiàn)了跨窗口的會(huì)話跟蹤。

 

==============================================================

今天在測(cè)試Ticket時(shí),發(fā)現(xiàn)原來(lái)保存的Cookie莫名其妙的就被清除了,自己沒(méi)有做過(guò)任何的改動(dòng)。經(jīng)開(kāi)發(fā)人員Allon推斷,應(yīng)該是Cookie數(shù)量達(dá)到了瀏覽器的限制。

 

網(wǎng)上查找出來(lái)的結(jié)果是:

 

一、瀏覽器允許每個(gè)域名所包含的cookie數(shù):

 

  Microsoft指出InternetExplorer8增加cookie限制為每個(gè)域名50個(gè),但I(xiàn)E7似乎也允許每個(gè)域名50個(gè)cookie。

  Firefox每個(gè)域名cookie限制為50個(gè)。

  Opera每個(gè)域名cookie限制為30個(gè)。

  Safari/WebKit貌似沒(méi)有cookie限制。但是如果cookie很多,則會(huì)使header大小超過(guò)服務(wù)器的處理的限制,會(huì)導(dǎo)致錯(cuò)誤發(fā)生。

 

  注:“每個(gè)域名cookie限制為20個(gè)”將不再正確!

 

二、當(dāng)很多的cookie被設(shè)置,瀏覽器如何去響應(yīng)。

 

  除Safari(可以設(shè)置全部cookie,不管數(shù)量多少),有兩個(gè)方法:

  最少最近使用(leastrecentlyused(LRU))的方法:當(dāng)Cookie已達(dá)到限額,自動(dòng)踢除最老的Cookie,以使給最新的Cookie一些空間。Internet Explorer和Opera使用此方法。

 

  Firefox很獨(dú)特:雖然最后的設(shè)置的Cookie始終保留,但似乎隨機(jī)決定哪些cookie被保留。似乎沒(méi)有任何計(jì)劃(建議:在Firefox中不要超過(guò)Cookie限制)。

 

三、不同瀏覽器間cookie總大小也不同:

 

  Firefox和Safari允許cookie多達(dá)4097個(gè)字節(jié),包括名(name)、值(value)和等號(hào)。

  Opera允許cookie多達(dá)4096個(gè)字節(jié),包括:名(name)、值(value)和等號(hào)。

  Internet Explorer允許cookie多達(dá)4095個(gè)字節(jié),包括:名(name)、值(value)和等號(hào)。

 

      注:多字節(jié)字符計(jì)算為兩個(gè)字節(jié)。在所有瀏覽器中,任何cookie大小超過(guò)限制都被忽略,且永遠(yuǎn)不會(huì)被設(shè)置。


上一篇:JSON Web Tokens (JWT) 與 Sessions

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

在線咨詢

點(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)系
返回頂部