国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
理解cookie和session機制 - Sumongh Zone - JavaEye技術網(wǎng)站
具體來說cookie機制采用的是在客戶端保持狀態(tài)的方案。它是在用戶端的會話狀態(tài)的存貯機制,他需要用戶打開客戶端的cookie支持。cookie的作用就是為了解決HTTP協(xié)議無狀態(tài)的缺陷所作的努力.
而session機制采用的是一種在客戶端與服務器之間保持狀態(tài)的解決方案。同時我們也看到,由于采用服務器端保持狀態(tài)的方案在客戶端也需要保存一個標識,所以session機制可能需要借助于cookie機制來達到保存標識的目的。而session提供了方便管理全局變量的方式
session是針對每一個用戶的,變量的值保存在服務器上,用一個sessionID來區(qū)分是哪個用戶session變量,這個值是通過用戶的瀏覽器在訪問的時候返回給服務器,當客戶禁用cookie時,這個值也可能設置為由get來返回給服務器。
就安全性來說:當你訪問一個使用session 的站點,同時在自己機子上建立一個cookie,建議在服務器端的SESSION機制更安全些.因為它不會任意讀取客戶存儲的信息。

正統(tǒng)的cookie分發(fā)是通過擴展HTTP協(xié)議來實現(xiàn)的,服務器通過在HTTP的響應頭中加上一行特殊的指示以提示瀏覽器按照指示生成相應的cookie
從網(wǎng)絡服務器觀點看所有HTTP請求都獨立于先前請求。就是說每一個HTTP響應完全依賴于相應請求中包含的信息
狀態(tài)管理機制克服了HTTP的一些限制并允許網(wǎng)絡客戶端及服務器端維護請求間的關系。在這種關系維持的期間叫做會話(session)。
Cookies是服務器在本地機器上存儲的小段文本并隨每一個請求發(fā)送至同一個服務器。IETF RFC 2965 HTTP StateManagement Mechanism是通用cookie規(guī)范。網(wǎng)絡服務器用HTTP頭向客戶端發(fā)送cookies,在客戶終端,瀏覽器解析這些cookies并將它們保存為一個本地文件,它會自動將同一服務器的任何請求縛上這些cookies
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
理解session機制
session機制是一種服務器端的機制,服務器使用一種類似于散列表的結(jié)構(gòu)(也可能就是使用散列表)來保存信息。

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

保存這個session id的方式可以采用cookie,這樣在交互過程中瀏覽器可以自動的按照規(guī)則把這個標識發(fā)揮給服務器。一般這個cookie的名字都是類似于SEEESIONID,而。比如weblogic對于web應用程序生成的cookie,JSESSIONID=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764,它的名字就是JSESSIONID。

由于cookie可以被人為的禁止,必須有其他機制以便在cookie被禁止時仍然能夠把session id傳遞回服務器。經(jīng)常被使用的一種技術叫做URL重寫,就是把session id直接附加在URL路徑的后面,附加方式也有兩種,一種是作為URL路徑的附加信息,表現(xiàn)形式為http://...../xxx;jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
另一種是作為查詢字符串附加在URL后面,表現(xiàn)形式為http://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
這兩種方式對于用戶來說是沒有區(qū)別的,只是服務器在解析的時候處理的方式不同,采用第一種方式也有利于把session id的信息和正常程序參數(shù)區(qū)分開來。
為了在整個交互過程中始終保持狀態(tài),就必須在每個客戶端可能請求的路徑后面都包含這個session id。

另一種技術叫做表單隱藏字段。就是服務器會自動修改表單,添加一個隱藏字段,以便在表單提交時能夠把session id傳遞回服務器。比如下面的表單
<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>
這種技術現(xiàn)在已較少應用,筆者接觸過的很古老的iPlanet6(SunONE應用服務器的前身)就使用了這種技術。
實際上這種技術可以簡單的用對action應用URL重寫來代替。

在談論session機制的時候,常常聽到這樣一種誤解“只要關閉瀏覽器,session就消失了”。其實可以想象一下會員卡的例子,除非顧客主動對店家提出銷卡,否則店家絕對不會輕易刪除顧客的資料。對session來說也是一樣的,除非程序通知服務器刪除一個session,否則服務器會一直保留,程序一般都是在用戶做log off的時候發(fā)個指令去刪除session。然而瀏覽器從來不會主動在關閉之前通知服務器它將要關閉,因此服務器根本不會有機會知道瀏覽器已經(jīng)關閉,之所以會有這種錯覺,是大部分session機制都使用會話cookie來保存session id,而關閉瀏覽器后這個session id就消失了,再次連接服務器時也就無法找到原來的session。如果服務器設置的cookie被保存到硬盤上,或者使用某種手段改寫瀏覽器發(fā)出的HTTP請求頭,把原來的session id發(fā)送給服務器,則再次打開瀏覽器仍然能夠找到原來的session。

恰恰是由于關閉瀏覽器不會導致session被刪除,迫使服務器為seesion設置了一個失效時間,當距離客戶端上一次使用session的時間超過這個失效時間時,服務器就可以認為客戶端已經(jīng)停止了活動,才會把session刪除以節(jié)省存儲空間。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
 由JSESSIONID談cookie與SESSION的區(qū)別和聯(lián)系

在一些投票之類的場合,我們往往因為公平的原則要求每人只能投一票,在一些WEB開發(fā)中也有類似的情況,這時候我們通常會使用COOKIE來實現(xiàn),例如如下的代碼:
< % cookie[]cookies = request.getCookies();
if (cookies.lenght == 0 || cookies == null)
doStuffForNewbie();
//沒有訪問過
}

else
{
doStuffForReturnVisitor(); //已經(jīng)訪問過了
}

% >

這是很淺顯易懂的道理,檢測COOKIE的存在,如果存在說明已經(jīng)運行過寫入COOKIE的代碼了,然而運行以上的代碼后,無論何時結(jié)果都是執(zhí)行doStuffForReturnVisitor(),通過控制面板-Internet選項-設置-察看文件卻始終看不到生成的cookie文件,奇怪,代碼明明沒有問題,不過既然有cookie,那就顯示出來看看。
cookie[]cookies = request.getCookies();
if (cookies.lenght == 0 || cookies == null)
out.println("Has not visited this website");
}

else
{
for (int i = 0; i < cookie.length; i++)
{
out.println("cookie name:" + cookies[i].getName() + "cookie value:" +
cookie[i].getValue());
}
}

運行結(jié)果:
cookie name:JSESSIONID cookie value:KWJHUG6JJM65HS2K6為什么會有cookie呢,大家都知道,http是無狀態(tài)的協(xié)議,客戶每次讀取web頁面時,服務器都打開新的會話,而且服務器也不會自動維護客戶的上下文信息,那么要怎么才能實現(xiàn)網(wǎng)上商店中的購物車呢,session就是一種保存上下文信息的機制,它是針對每一個用戶的,變量的值保存在服務器端,通過SessionID來區(qū)分不同的客戶,session是以cookie或URL重寫為基礎的,默認使用cookie來實現(xiàn),系統(tǒng)會創(chuàng)造一個名為JSESSIONID的輸出cookie,我們叫做session cookie,以區(qū)別persistentcookies,也就是我們通常所說的cookie,注意sessioncookie是存儲于瀏覽器內(nèi)存中的,并不是寫到硬盤上的,這也就是我們剛才看到的JSESSIONID,我們通常情是看不到JSESSIONID的,但是當我們把瀏覽器的cookie禁止后,web服務器會采用URL重寫的方式傳遞Sessionid,我們就可以在地址欄看到sessionid=KWJHUG6JJM65HS2K6之類的字符串。
明白了原理,我們就可以很容易的分辨出persistent cookies和sessioncookie的區(qū)別了,網(wǎng)上那些關于兩者安全性的討論也就一目了然了,session cookie針對某一次會話而言,會話結(jié)束sessioncookie也就隨著消失了,而persistentcookie只是存在于客戶端硬盤上的一段文本(通常是加密的),而且可能會遭到cookie欺騙以及針對cookie的跨站腳本攻擊,自然不如session cookie安全了。
通常sessioncookie是不能跨窗口使用的,當你新開了一個瀏覽器窗口進入相同頁面時,系統(tǒng)會賦予你一個新的sessionid,這樣我們信息共享的目的就達不到了,此時我們可以先把sessionid保存在persistentcookie中,然后在新窗口中讀出來,就可以得到上一個窗口SessionID了,這樣通過session cookie和persistentcookie的結(jié)合我們就實現(xiàn)了跨窗口的session tracking(會話跟蹤)。
在一些web開發(fā)的書中,往往只是簡單的把Session和cookie作為兩種并列的http傳送信息的方式,sessioncookies位于服務器端,persistentcookie位于客戶端,可是session又是以cookie為基礎的,明白的兩者之間的聯(lián)系和區(qū)別,我們就不難選擇合適的技術來開發(fā)webservice了。

本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
JSESSION,Session,Cookie淺談
android客戶端與服務器端交互 如何保持session
cookie與session的關系
url中的jsessionid解釋 - 梧桐的日志 - 網(wǎng)易博客
Tomcat中的Session小結(jié)
關閉瀏覽器后再次訪問session 保證是同一個sessionid
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服