日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

之前寫過一個個人門戶網站,在登錄這塊,其中涉及到了Cookie和Session的相關知識,忽然發現,雖然自己經常使用Cookie和Session,但對兩者的原理和聯系卻知之甚少,所以寫了一篇博客來記錄一下。今天主要從以下三個方面來闡述這兩者的原理和聯系:

  • 產生背景
  • 運行機制
  • 使用時需要注意的相關問題

Cookie

一、Cookie的產生背景

在web應用中,會話跟蹤是很重要的。一個用戶的所有請求操作都應該屬于同一個會話。 例如,在網上商城中,用戶A購買的商品都應該放在A的購物車內,而不能放在用戶B或C的購物車內,因為它們不屬于同一個會話。

眾所周知,web應用是使用HTTP協議傳輸數據的,而HTTP協議是無狀態的。這里稍微解釋一下HTTP協議的無狀態特性:瀏覽器的每一次請求,服務器都會獨立處理,不與之前或之后的請求產生關聯,也就是說,瀏覽器的每一次請求,對服務器來說都是全新的。這個過程可以用下圖說明:

前端入門:重學Cookie與Session

 

一旦數據交換完畢,客戶端與服務器端的連接就會關閉,再次交換數據需要建立新的連接,這就意味著服務器無法從連接上跟蹤會話。 即用戶A購買了一件商品放入購物車內,當再次購買商品時,服務器已經無法判斷該購買行為是屬于用戶A的會話還是用戶B的會話了。要跟蹤該會話,必須引入一種機制,于是Cookie就應運而生了。Cookie由W3C組織提出,最早由Netscape社區發展,目前所有的主流瀏覽器都支持Cookie。Cookie的工作原理

上面說到由于HTTP協議的無狀態特性,服務器無法從連接上知道客戶身份。解決辦法就是給客戶端頒發一個“通行證”,無論誰訪問都必須攜帶自己的通行證,這樣服務器就能從通行證上確認客戶身份了,這就是Cookie的工作原理。

Cookie實際上是一小段文本信息。客戶端請求服務器,如果服務器需要記錄該用戶狀態,就使用response向客戶端瀏覽器頒發一個Cookie,在Servlet中即調用response.addCookie(Cookie cookie)方法。客戶端瀏覽器會把Cookie保存起來,當瀏覽器再次請求該網站時,瀏覽器把請求的網址連同該Cookie一同提交給服務器,服務器檢查該Cookie,從而獲得用戶身份信息。服務器還可以根據需要修改Cookie的內容。

二、Cookie的機制

Cookie機制采用的是在客戶端保持狀態的方案。 當服務器調用addCookie方法向瀏覽器頒發Cookie,本質上是在HTTP的響應頭中加上一行特殊的指示以提示瀏覽器按照指示生成相應的Cookie,保存在客戶端,里面記錄著用戶當前的信息。當用戶再次訪問服務器時,瀏覽器檢查所有存儲的Cookie,如果某個Cookie所聲明的作用范圍大于等于將要請求的資源所在的位置,則把該Cookie附在請求資源的HTTP請求頭上發送給服務器,服務器根據該Cookie獲得用戶身份信息。

前端入門:重學Cookie與Session

 

三、Cookie相關問題

1、Cookie的生命周期

在討論Cookie的生命周期之前,先說一下setMaxAge(int maxAge)方法,該方法用于設置Cookie的失效時間。

如果maxAge為正數,則表示該Cookie會在maxAge秒之后自動失效。瀏覽器會將maxAge為正數的Cookie持久化,即寫到對應的Cookie文件中。無論客戶關閉了瀏覽器還是電腦,只要還在maxAge秒之前,登錄網站時該Cookie仍然有效。

如果maxAge為負數,則表示該Cookie僅在本瀏覽器窗口以及本窗口打開的子窗口內有效,關閉窗口后該Cookie即失效。maxAge為負數的Cookie,為臨時性Cookie,不會被持久化,不會被寫到Cookie文件中。Cookie信息保存在瀏覽器內存中,因此關閉瀏覽器該Cookie就消失了。Cookie默認的maxAge值為–1。

2、Cookie的修改和刪除

Cookie并不提供修改、刪除操作。如果要修改某個Cookie,只需要新建一個同名的Cookie,添加到response中覆蓋原來的Cookie即可。

如果要刪除某個Cookie,可以將Cookie的maxAge屬性設置為0;也可以新建一個同名的Cookie,并將maxAge設置為0,并添加到response中覆蓋原來的Cookie。maxAge為0的Cookie即失效Cookie,會被瀏覽器從Cookie文件或者內存中刪除。

注意:修改、刪除Cookie時,新建的Cookie除value、maxAge之外的所有屬性,例如name、path、domain等,都要與原Cookie完全一樣。否則,瀏覽器將視為兩個不同的Cookie不予覆蓋,導致修改、刪除失敗。

3、Cookie的不可跨域名性

很多網站都會使用Cookie,例如,google會向客戶端頒發Cookie,Baidu也會向客戶端頒發Cookie。但是瀏覽器訪問Google只會攜帶Google的Cookie,而不會攜帶Baidu的Cookie;Google也只能操作Google的Cookie,而不能操作Baidu的Cookie。這是由Cookie的隱私安全機制決定的,隱私安全機制能夠禁止網站非法獲取其他網站的Cookie,即Cookie的不可跨域名性。

Cookie在客戶端是由瀏覽器來管理的,瀏覽器能夠保證Google只會操作Google的Cookie而不會操作Baidu的Cookie,從而保證用戶的隱私安全。瀏覽器判斷一個網站是否能操作另一個網站Cookie的依據是域名,Google與Baidu的域名不一樣,因此Google不能操作Baidu的Cookie。

需要注意的是,用戶登錄網站 www.google.com 之后會發現訪問 images.google.com 時登錄信息仍然有效,二者雖然同屬于Google,但是域名不一樣,同樣不能互相操作彼此的Cookie,這是因為Google做了特殊處理。想讓同一個一級域名下的兩個二級域名能交互使用Cookie,需要設置Cookie的domain參數。例如想所有 wsghawk.com 名下的二級域名都可以使用該Cookie,可以這么寫:cookie.setDomain(".wsghawk.com"); 注意,domain參數必須以點(".")開始。

4、Cookie的路徑

domain屬性決定允許訪問Cookie的域名,而path屬性決定允許訪問Cookie的路徑(ContextPath)。例如,如果只允許/hawk/下的程序使用Cookie,可以這么寫:cookie.setPath("/hawk/"); 設置為“/”時允許所有路徑使用Cookie,path屬性需要使用符號“/”結尾。

Session

一、Session的工作原理

Session是另一種記錄客戶狀態的機制,不同的是Cookie保存在客戶端瀏覽器中,而Session保存在服務器上。客戶端瀏覽器訪問服務器的時候,服務器把客戶端信息以某種形式記錄在服務器上,這就是Session。客戶端瀏覽器再次訪問時只需要從該Session中查找該客戶的狀態就可以了。

如果說Cookie機制是通過檢查客戶身上的“通行證”來確定客戶身份的話,那么Session機制就是通過檢查服務器上的“客戶明細表”來確認客戶身份。Session相當于程序在服務器上建立的一份客戶檔案,客戶來訪的時候只需要查詢客戶檔案表就可以了。

二、Session的機制

Session機制采用的是在服務器端保持狀態的方案。 當用戶訪問到一個服務器,服務器就要為該用戶創建一個Session,在創建這個Session的時候,服務器首先檢查這個用戶發來的請求里是否包含了一個SessionId,如果包含了一個SessionId則說明之前該用戶已經登陸過并為此用戶創建過Session,那服務器就按照這個SessionId把這個Session在服務器的內存中查找出來(如果查找不到,就有可能為它新創建一個)。如果客戶端請求里不包含有SessionId,則為該客戶端創建一個Session并生成一個與此Session相關的SessionId。這個SessionId是一個唯一的、不重復的字符串,這個SessionId將被在本次響應中返回到客戶端保存,而保存這個SessionId的正是Cookie。 這樣在交互過程中瀏覽器可以自動的按照規則把這個標識發送給服務器。

前端入門:重學Cookie與Session

 

三、Session相關問題

1、Session的生命周期

之前我一直認為,一個瀏覽器窗口被打開是創建一個Session,而關閉瀏覽器窗口時該Session就會被刪除,其實這是錯誤的! 實際上直到某服務器端程序調用 HttpServletRequest.getSession(true); 這樣的語句時Session才被創建。而除非程序通知服務器刪除Session,否則Session會被服務器一直保留,直到Session的失效時間到了自動刪除。服務器是不知道瀏覽器是否被關閉的。

之前會產生這種錯覺的原因是:一般Session機制都使用Cookie來保存SessionId,而一旦關閉瀏覽器,SessionId就不存在了,再連接服務器時就找不到原來的Session了。如果服務器設置的Cookie被保存到硬盤上,或者使用某種手段改寫瀏覽器發出的HTTP請求頭,把原來的SessionId發送給服務器,則再次打開瀏覽器仍然能夠找到原來的Session。由于關閉瀏覽器不會導致Session被刪除,迫使服務器為Seesion設置了一個失效時間,當距離客戶端上一次使用Session的時間超過這個失效時間時,服務器就可以認為客戶端已經停止了活動,才會把Session刪除以節省存儲空間。

一般情況下,Session都是存儲在內存里,當服務器進程被停止或者重啟的時候,內存里的Session也會被清空。如果設置了Session的持久化特性,服務器就會把Session保存到硬盤上,當服務器進程重新啟動或這些信息將能夠被再次使用(Tomcat在shutdown前默認會自動將Session保存到指定的目錄中,因此tomcat重新啟動后,Session是可以繼續使用的)。

2、Session對瀏覽器的要求

SessionId為服務器自動生成的,它的maxAge屬性一般為–1,表示僅當前瀏覽器內有效,并且各瀏覽器窗口間不共享,關閉瀏覽器就會失效。因此同一機器的兩個瀏覽器窗口訪問服務器時,會生成兩個不同的Session。但是由瀏覽器窗口內的鏈接、腳本等打開的新窗口(也就是說不是雙擊桌面瀏覽器圖標等打開的窗口)除外,這類子窗口會共享父窗口的Cookie,因此會共享一個Session。注意:新開的瀏覽器窗口會生成新的Session,但子窗口除外,子窗口會共用父窗口的Session。

其實目前企業流行的方式還是在請求頭中攜帶token來進行身份驗證,因為Session會占用服務器較多的內存空間,影響效率。

如對文章內容有疑問或發現其中的錯誤,請在評論區留言。

分享到:
標簽:Cookie
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定