cookies與session的區別

HTTP協議是無狀態的協議,因此服務端須要記錄用戶的狀態時,就須要用某種機制來識具體的用戶,這個機制就是Session。html

       當程序須要爲某個客戶端的請求建立一個session的時候,服務器首先檢查這個客戶端的請求裏是否已包含了一個session標識 - 稱爲 session id,若是已包含一個session id則說明之前已經爲此客戶端建立過session,服務器就按照session id把這個 session檢索出來使用(若是檢索不到,可能會新建一個),若是客戶端請求不包含session id,則爲此客戶端建立一個session而且生成一個與此session相關聯的session id,session id的值應該是一個既不會重複,又不容易被找到規律以仿造的字符串,這個 session id將被在本次響應中返回給客戶端保存。web

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

 

    偏偏是因爲關閉瀏覽器不會致使session被刪除,迫使服務器爲seesion設置了一個失效時間,當距離客戶端上一次使用session的時間超過這個失效時間時,服務器就能夠認爲客戶端已經中止了活動,纔會把session刪除以節省存儲空間。數據庫

    你們都知道,http是無狀態的協議,客戶每次讀取web頁面時,服務器都打開新的會話,並且服務器也不會自動維護客戶的上下文信息,那麼要怎麼才能實現網上商店中的購物車呢,session就是一種保存上下文信息的機制,它是針對每個用戶的,變量的值保存在服務器端,經過SessionID來區分不一樣的客戶,session是以cookie或URL重寫爲基礎的,默認使用cookie來實現,系統會創造一個名爲JSESSIONID的輸出cookie,咱們叫作session cookie,以區別persistent cookies,也就是咱們一般所說的cookie,注意session cookie是存儲於瀏覽器內存中的,並非寫到硬盤上的,這也就是咱們剛纔看到的JSESSIONID,咱們一般情是看不到JSESSIONID的,可是當咱們把瀏覽器的cookie禁止後,web服務器會採用URL重寫的方式傳遞Sessionid,咱們就能夠在地址欄看到sessionid=KWJHUG6JJM65HS2K6之類的字符串。數組

具體來講cookie機制採用的是在客戶端保持狀態的方案。它是在用戶端的會話狀態的存貯機制,他須要用戶打開客戶端的cookie支持。cookie的做用就是爲了解決HTTP協議無狀態的缺陷所做的努力.瀏覽器

而session機制採用的是一種在客戶端與服務器之間保持狀態的解決方案。同時咱們也看到,因爲採用服務器端保持狀態的方案在客戶端也須要保存一個標識,因此session機制可能須要藉助於cookie機制來達到保存標識的目的。而session提供了方便管理全局變量的方式安全

session是針對每個用戶的,變量的值保存在服務器上,用一個sessionID來區分是哪一個用戶session變量,這個值是經過用戶的瀏覽器在訪問的時候返回給服務器,當客戶禁用cookie時,這個值也可能設置爲由get來返回給服務器。服務器

    就安全性來講:當你訪問一個使用session 的站點,同時在本身機子上創建一個cookie,建議在服務器端的SESSION機制更安全些.由於它不會任意讀取客戶存儲的信息。cookie

    正統的cookie分發是經過擴展HTTP協議來實現的,服務器經過在HTTP的響應頭中加上一行特殊的指示以提示瀏覽器按照指示生成相應的cookie網絡

    從網絡服務器觀點看全部HTTP請求都獨立於先前請求。就是說每個HTTP響應徹底依賴於相應請求中包含的信息

    狀態管理機制克服了HTTP的一些限制並容許網絡客戶端及服務器端維護請求間的關係。在這種關係維持的期間叫作會話(session)。

    Cookies是服務器在本地機器上存儲的小段文本並隨每個請求發送至同一個服務器。

  明白了原理,咱們就能夠很容易的分辨出persistent cookies和session cookie的區別了,網上那些關於二者安全性的討論也就一目瞭然了,session cookie針對某一次會話而言,會話結束session cookie也就隨着消失了,而persistent cookie只是存在於客戶端硬盤上的一段文本(一般是加密的),並且可能會遭到cookie欺騙以及針對cookie的跨站腳本攻擊,天然不如session cookie安全了。

一般session cookie是不能跨窗口使用的,當你新開了一個瀏覽器窗口進入相同頁面時,系統會賦予你一個新的sessionid,這樣咱們信息共享的目的就達不到了,此時咱們能夠先把sessionid保存在persistent cookie中,而後在新窗口中讀出來,就能夠獲得上一個窗口SessionID了,這樣經過session cookie和persistent cookie的結合咱們就實現了跨窗口的session tracking(會話跟蹤)。

    在一些web開發的書中,每每只是簡單的把Session和cookie做爲兩種並列的http傳送信息的方式,session cookies位於服務器端,persistent cookie位於客戶端,但是session又是以cookie爲基礎的,明白的二者之間的聯繫和區別,咱們就不難選擇合適的技術來開發web service了

 

cookies和session的關係1。 Cookie是一種發送到客戶瀏覽器的文本串句柄,並保存在客戶機硬盤上, 

能夠用來在某個Web站點會話之間持久地保持數據。Request和Response對象都有 

一組Cookie。Request.cookie集合是一系列Cookie,從客戶端與HTTP Request一 

起發送到Web服務器。反過來,若是你但願把Cookie發送到客戶機,就可使用R 

esponse.cookie 
一、ExpiresAbsolute屬性 
該屬性能夠賦一個日期,過了這個日期Cookie就不能再被使用了。經過給Ex 

pires屬性賦一個過時的日期,就能夠刪除Cookie。如: 
<%Response.cookies("passtime").expiresAbsolute="1/1/99"%> 
二、Domain屬性 
該屬性定義Cookie要傳送的惟一域。如:Cookie只傳送給Microsoft的人, 

則可使用如下代碼。 
<%Response.Cookies("domain").Domain="www.microsoft.com"%> 三、ASP用來寫入Cookie即向客戶機發送Cookie的語法以下: Response.Cookie("Cookie名").[("鍵名").屬性]=內容 若是某個ASP文件要建立一個Cookie,則下面的代碼能夠放在ASP文件的第一 個<html>以前,以免產生錯誤. <%Response.Cookies("CookieName")="NewCookie" %> <html> ...... </html> 四、一樣ASP用Request對象的Cookies集合來讀取Cookie,如: <%Response.write Request.Cookies("CookieName")%> 下面以一個完整的例子來講明Cookie: <% dim Num Num=Request.Cookies("Visit_num") if Num>0 then Num=Num+1 Response.write "您已經是第" & Num & "次訪問本站點了。" else Response.write "歡迎您首次訪問本站。" Num=1 end if Response.Cookies("Visit_num")=Num %> 在該例子中,首先讀取Cookies變量Visit_num,看用戶端計算機是否保存有 Cookies變量。若是有該變量,則說明用戶已經訪問過該頁面,同時輸入出訪問 次數。若是用戶是首次訪問該頁面,則其計算機內不會有Cookies變量,程序會 顯示「歡迎」字樣,而後將Cookies變量Visit_num存到用戶計算機中,以便該用 戶下一次訪問該頁面時給出「訪問的次數」信息。 五、Cookie字典 有時在一個頁面中可能須要定義不少個Cookies變量,爲了更好地管理它, 在Cookies組件中常引入一人的概念「子鍵」。引用它的語法以下: Request.Cookies("變動名")("子鍵名") 以下面的Cookie建立一個名爲"Dictionary"的字典,其中保存了三個鍵值: <% Response.Cookie("info")("Myname")="jeff" Response.Cookie("info")("Gender")="male" Response.Cookie("info")("Myheight")="172" %> 事實上客戶機上的Cookie字典是以字符串的形式存在: info=Myname=jeff&Gender=male&Myheight=172 若是用戶沒有指定「子鍵」名而直接引用Cookies變量,將會返回一個包含 全部的「子鍵」名及值的字符串。例如上面這個例子包含三個「子鍵」:"Mynam e"、"Gender"和"Myheight",當用戶沒有指定其「子鍵」而直接經過Request.Co okies("info")來引用時,則會獲得下列字符串: info=Myname=jeff&Gender=male&Myheight=172 若是要把Cookie中讀取的全部數據,能夠用下面的代碼獲得: <%For each cookie in Request.Cookies if Not cookie.HasKeys then Response.write cookie & "=" & Request.Cookies(cookie) Else for each key in Request.Cookies(cookie) Response.write cookie&"("&key&")"&"="& Request.Cookies(cookie)(key) next end if next %> 2。Session其實指的就是訪問者從到達某個特定主頁到離開爲止的那段時間。每 一訪問者都會單獨得到一個Session。在Web應用程序中,當一個用戶訪問該應用 時,Session類型的變量能夠供這個用戶在該Web應用的全部頁面中共享數據;如 果另外一個用戶也同時訪問該Web應用,他也擁有本身的Session變量,但兩個用戶 之間沒法經過Session變量共享信息,而Application類型的變動則能夠實現站點 多個用戶之間在全部頁面中共享信息。 一、SessionID屬性 該屬性返回當前會話的惟一標誌,爲每個Session分配不一樣的編號。 我曾在開發過程當中就遇到對用戶的控制問題。它要實現的功能就是,針對某 個網站的一個模塊,當一個會員登陸後正在看此模塊時,另外一我的用一樣的會員 名登陸,就不能瀏覽這個模塊。也就是說一個會員名同時只能一我的瀏覽此模塊 。我經過用會員名(假設爲UserID,惟一)和SessionID來實現了控制。當會員 登陸時,給這個會員一個Session記錄登陸狀態如:Session("Status")="Logged ",同時把這個會員的Session.SessionID寫入數據庫。當他要瀏覽此模塊時,先 判斷其是否登陸,若已經登陸再判斷它的SessionID是否與數據庫記錄的相同, 若是不一樣則不能訪問。這樣,當另外一個用戶用相同的會員名登陸時,那麼數據庫 中記錄的就是新的SessionID,前者訪問此模塊時就不能經過檢查。這就實現了 一個會員名同時只能一我的瀏覽某個模塊。這個功能在一些收費網站有頗有特別 做用,它防止了一個會員名給多我的瀏覽的問題,爲公司保障了利益。 二、TimeOut屬性 該屬性用來定義用戶Session對象的時限。若是用戶在規定的時間內沒有刷 新網頁,則Session對象就會終止。通常默認爲20分鐘。 三、Abandon方法 該方法是Session對象的惟一方法,能夠清除Session對象,用來消除用戶的 Session對象並釋放其所佔的資源。如: <% Session.Abandon %> 四、Session_OnStart和Session_OnEnd事件 和Application同樣,當對象的例程每一次啓動時觸發Session_OnStart事件 ,而後運行Session_Onstart事件的處理過程。也就是說,當服務器接收到應用 程序中的URL的HTTP請求時,觸發此事件,並創建一個Session對象。同理,這個 事件也必須定在Global.asa文件中。 當調用Session.Abandon方法時或者在TimeOut的時間內沒有刷新,這會觸發 Session_OnEnd事件,而後執行裏面的腳本。Session變量與特定的用戶相聯繫, 針對某一個用戶賦值的Session變量是和其餘用戶的Session變量徹底獨立的,不 會存在相互影響。 Session應用一列: 與Application同樣,一個被定義爲Session類型的數組只能將整個數組做爲 一個對象,用戶不能直接改變Session數組中某個元素的值。爲了建立一個Sessi on數組,需先定義一個普通的數組,並對它的每個元素賦初值,最後把它定義 爲一個Session數組。如: <% dim array() array=array("jeff","zhu","male") Session("info")=array Response.write Session("info")(0) &"-" Response.write Session("info")(1) &"-" Response.write Session("info")(2) &"<br>" %> <hr> <% array(0)="jun" array(1)="li" array(2)="female" Session("info")=array Response.write Session("info")(0) & "-" Response.write Session("info")(1) & "-" Response.write Session("info")(2) & "<br>" %> 以上這段程序輸出結果是: jeff-zhu-male _____________ jun-li-female Session是怎樣工做的? Session實際上是利用Cookie進行信息處理的,(參見後面有關Cookies的介紹), 當用戶首先進行了請求後,服務端就在用戶瀏覽器上建立了一個Cookie,當這個 Session結束時,其實就是意味着這個Cookie就過時了。 爲這個用戶建立的Cookie的名稱是ASPSESSIONID。這個Cookie的惟一目的就是爲 每個用戶提供不一樣的身份認證。 注:若是你對名字是ASPSESSIONID的COOKIE感到好奇,你能夠利用ServerVariab les集合的COOKIE Header來接受這個信息,參看下面這個腳本: <%=Request.ServerVariables(「HTTP COOKIE」) %> 你能夠刷新不止一次而顯示結果依然不變。若是但願對ServerVariables集合有 Session變量本身不會存在用戶瀏覽器上。不過,ASPSESSIONID這個cookie須要 使用session變量。server使用ASPSESSIONID cookie來將特定的用戶和特定的session信息聯繫起來。沒有cookie的話,Serve r就不會了解到每個特定用戶在網站中移動的信息。 利用SessionID變量存儲ASPSESSIONID cookie和直接對名爲ASPSESSIONID的cookie賦值有很大不一樣。微軟利用了一個復 雜的數學算法對SessionID進行了加密措施,以防止黑客猜想出SessionID的值並 且依據這個得到不應得到的身份或權限。 注:你能夠用兩種方法屏蔽掉SessionID,一種是將全站進行屏蔽,另一種是 將一個單獨Active Server Page進行相應屏蔽。 若是想要將整個站點的Session操做進行屏蔽,你可使用Internet Service Manager。從Application設置對話框,點擊Active Server Pages表而且取消對Enable Session State選項的選擇。 你還能夠在特定的Active Server Page的首行加入使之屏蔽的語句來進行這種操 做。 <% EnableSessionState=False %> 因爲Session對象使用了Cookies,那麼它的兼容性就受到了限制,一些老的瀏覽 器顯然是不行的,新的瀏覽器象是NetScape4.0也提供了屏蔽Cookie的選項。 這樣就出了問題、因爲Cookie不能適用於全部瀏覽器,那麼在建站時你就必須注 意了,若是你的網站定位於大衆通用,就必須考慮各類不一樣的用戶狀況。不過現 在確實有能夠替代的方法,有些取代Cookies來進行身份認證的方法將在後面的 注:當前瀏覽器,是否發送一個Cookie在URL是區分大小寫的,所以,微軟提醒你 最好使用一樣的大小寫方式,例如一塊兒使用/WWW/mypage.asp和/www/mypage.asp 確定會使瀏覽器出錯。

相關文章
相關標籤/搜索