SpringBoot--------Restful([夢學谷]十四)

Cookie是服務器存儲在本地計算機上的小塊文本,並隨每個請求發送到同一服務器。 IETF RFC 2965 HTTP狀態管理機制是一種通用的cookie規範。 Web服務器使用HTTP標頭將cookie發送到客戶端。在客戶端終端,瀏覽器解析cookie並將其保存爲本地文件,該文件自動將來自同一服務器的任何請求綁定到這些cookie。

具體來說,cookie機制使用一種在客戶端維護狀態的方案。它是客戶端會話狀態的存儲機制,他需要用戶打開客戶端的cookie支持。 Cookie的作用是解決HTTP協議中缺少無狀態缺陷的問題。

通過擴展HTTP協議來實現正統cookie分發。服務器通過向HTTP響應頭添加特殊指示來提示瀏覽器生成相應的cookie。但是,純JavaScript等客戶端腳本也可以生成cookie。根據某些原則,瀏覽器在後臺自動將cookie的使用發送到服務器。瀏覽器檢查所有存儲的cookie。如果cookie聲明範圍大於或等於要請求的資源的位置,則cookie將附加到請求資源的HTTP請求標頭併發送到服務器。

cookie的內容主要包括:名稱,值,到期時間,路徑和域。路徑與域一起構成了cookie的範圍。如果未設置到期時間,則表示此cookie的生命週期是在瀏覽器會話期間,瀏覽器窗口關閉,並且cookie消失。生命週期爲瀏覽器會話的cookie稱爲會話cookie。會話cookie通常不存儲在硬盤上,而是存儲在內存中。當然,這種行爲不受監管。如果設置了到期時間,瀏覽器會將cookie保存到硬盤,關閉它並再次打開瀏覽器。在超過設定的到期時間之前,這些cookie仍然有效。存儲在硬盤上的Cookie可以在不同的瀏覽器進程之間共享,例如兩個IE窗口。不同的瀏覽器對存儲在內存中的cookie有不同的處理方法。會話機制使用維護服務器端狀態的解決方案。同時,我們也看到,由於服務器端狀態保存方案還需要在客戶端保存標識符,會話機制可能需要使用cookie機制來達到保存標識符的目的。會話提供了一種管理全局變量的便捷方法。

該會話適用於每個用戶。變量的值存儲在服務器上。 sessionID用於區分使用哪個用戶會話變量。當用戶訪問瀏覽器時,該值將返回給服務器。當客戶端禁用cookie時,此值也可以設置爲通過get返回給服務器。

在安全性方面:當您訪問使用會話並在您自己的計算機上創建cookie的站點時,建議服務器端的會話機制更安全,因爲它不會任意讀取客戶端存儲的信息。

Session會話機制

Session會話機制

session會話機制是一種服務器端機制,它使用類似於哈希表(可能還有哈希表)的結構來保存信息。

當程序需要爲客戶端的請求創建會話時,服務器首先檢查客戶端的請求是否包含會話標識符(稱爲會話ID)。如果包含它,它先前已爲此客戶端創建了一個會話。服務器根據會話ID檢索會話(無法檢索,將創建新會話),如果客戶端請求不包含會話ID,則爲客戶端創建會話並生成與會話關聯的會話ID。 session id應該是一個既不重複也不容易被複制的字符串。會話ID將返回給客戶端以保存此響應。

保存此會話ID的方法可以是cookie,以便瀏覽器可以根據交互期間的規則自動將此標誌用於服務器。通常,此cookie的名稱與SEEESIONID類似。但是,cookie可以被人爲禁止,因此必須有其他機制在禁用cookie時將會話ID傳遞迴服務器。經常使用的一種技術稱爲URL重寫,它只是將會話ID直接附加到URL路徑。還有一種稱爲形式隱藏字段的技術。也就是說,服務器將自動修改表單並添加隱藏字段,以便在提交表單時將會話ID傳遞迴服務器。

Cookie和Sessions都能夠進行會話跟蹤,但原則並不相同。一般情況下,兩者都可以滿足需求,但有時候他們不能使用cookies,有時候不能使用Session。以下是兩者和適用場所的特徵比較。

1.不同的訪問方法

只有ASCII字符串可以存儲在cookie中。如果需要訪問Unicode字符或二進制數據,則需要先對其進行編碼。無法在cookie中直接訪問Java對象。要存儲稍微複雜的信息,使用cookie會更難。

會話可以訪問任何類型的數據,包括但不限於字符串、Integer、List、Map等。 Session也可以直接存儲Java Beans甚至任何Java類,對象等,使用起來非常方便。將Session視爲Java容器類。

2.不同的隱私政策

Cookie存儲在客戶端閱讀器中,對客戶端可見。客戶端上的某些程序可能會窺探、副本以更正cookie的內容。會話存儲在服務器上,對客戶端是透明的。不存在敏感信息泄露的風險。

如果您選擇cookie,最好不要寫敏感信息,如帳戶密碼。最好加密像Google、Baidu這樣的cookie信息,並將其提交給服務器進行解密,以確保我自己可以讀取cookie中的信息。如果選擇Session,則可以省去很多麻煩。無論如何,它被放置在服務器上,並且會話中的任何隱私都可以得到有效保護。

3.有效期的差異

使用Google的任何人都知道,如果您已登錄Google,Google的登錄信息將長期有效。用戶每次訪問時都不必再次登錄,Google會永久記錄用戶的登錄信息。要達到這個效果,使用cookies將是一個不錯的選擇。只需將cookie的到期時間屬性設置爲一個非常大的數字。由於Session依賴於名爲JSESSIONID的cookie,並且Cookie JSESSIONID的到期時間默認爲-1,因此只需關閉閱讀器就會使Session無效,Session將無法永久完成信息。無法使用URL地址重寫。此外,如果設置Session的超時時間太長,服務器將累積的Sessions越多,導致內存溢出的可能性就越大。

4.不同的服務器壓力

會話保留在服務器端,每個用戶都將生成一個會話。如果有很多併發用戶,它會產生大量的Session並消耗大量內存。因此,具有高併發流量的站點(如Google、Baidu、Sina)不太可能使用Session來跟蹤客戶會話。

Cookie保留在客戶端上,不消耗服務器資源。如果有很多用戶同時閱讀,那麼cookie是一個不錯的選擇。關於Google、Baidu、Sina,cookies可能是唯一的選擇。

5.不同的瀏覽器支持

客戶端瀏覽器需要支持Cookie。如果客戶端禁用cookie或不支持cookie,則會話跟蹤將無效。關於WAP上的應用程序,常規cookie無用。

如果客戶端瀏覽器不支持cookie,則需要使用會話和URL地址重寫。應該注意的是,Session程序中使用的所有URL都必須重寫URL地址,否則會話會話跟蹤將無效。對於WAP應用程序,會話+ URL地址重寫可能是唯一的選擇。

如果客戶端支持cookie,則可以在瀏覽器窗口和子窗口中將cookie設置爲有效(將到期時間設置爲-1),或者可以將cookie設置爲在所有閱讀器窗口中有效(設置到期時間)大於1)0的整數。但是,Session只能在此閱讀器窗口及其子窗口中使用。如果兩個瀏覽器窗口彼此不相關,則它們將使用兩個不同的會話。 (與IE8下不同窗口相關的會話)

6.跨域支持的差異Cookie支持跨域訪問。例如,如果domain屬性設置爲“.biaodianfu.com”,則所有以“.biaodianfu.com”爲後綴的域名都可以訪問cookie。跨域cookie現在通常在網絡上使用,例如Google、Baidu、Sina。會話不支持跨域訪問。會話僅在其所在的域名內有效。

僅使用cookie或僅使用Sessions可能無法達到預期的效果。此時,您應該嘗試使用Cookie和會話。 Cookie和Sessions的組合將在練習項目中實現許多意想不到的結果。

我的理解:

1.由於HTTP協議是無狀態協議,當服務器需要記錄用戶的狀態時,需要一些機制來識別特定用戶。這個機制是Session。點擊下訂單時,購物車等典型場景使用按鈕時,由於HTTP協議是無狀態的,因此不知道哪個用戶在運行。因此,服務器需要爲特定用戶創建特定會話,該會話用於識別用戶並跟蹤用戶,以便知道購物車。有幾本書。此會話存儲在服務器上,並具有唯一標識符。有很多方法可以在服務器端保存會話,內存、數據庫、文件有它。在羣集中,您還應該考慮轉移會話。在大型網站上,將有一個特殊的會話服務器羣集來保存用戶會話。此時,會話信息存儲在內存中,並使用一些緩存服務,如Memcached。來吧,把會議。2.考慮服務器如何識別特定客戶?此時,cookie已出現在場景中。每次發出HTTP請求時,客戶端都會將相應的cookie信息發送到服務器。事實上,大多數應用程序使用cookie來實現會話跟蹤。在第一次創建會話時,服務器將告訴HTTP協議中的客戶端需要在cookie中記錄會話ID。會話ID被髮送到服務器,我知道你是誰。有人問,如果客戶端的瀏覽器禁用了cookie,該怎麼辦?在這種情況下,稱爲URL重寫的技術用於會話跟蹤。也就是說,每個HTTP交互,諸如sid = xxxxx之類的URL被附加到URL,並且服務器相應地識別用戶。

3. Cookie也可用於某些用戶友好的場景。想象一下,您已經登錄過一次網站。下次登錄時,您不想再次輸入帳戶。我該怎麼辦?此信息可以寫入cookie。訪問網站時,網站頁面的腳本可以讀取此信息,並自動爲您填寫用戶名,方便用戶使用。這也是cookie名稱的起源,給用戶一點點甜蜜。

所以,總結一下:

Session是保存在服務器上的數據結構,用於跟蹤用戶的狀態。此數據可以保存在羣集、數據庫、文件中。

Cookie是客戶端存儲用戶信息的機制。它用於記錄有關用戶的一些信息,是實現會話的一種方式。

1.狀態保持

http協議是無狀態的:每個請求都是一個新請求,並且不會記住先前通信的狀態。

 

客戶端和服務器之間的一次通信是會話實現狀態保留的方法:在客戶端或服務器端存儲與會話相關的數據存儲方法包括cookie、session,會話通常是指會話對象。使用cookie,所有數據都存儲在客戶端上,注意不要存儲敏感信息建議使用sesison模式,所有數據都存儲在服務器端,session_id存儲在客戶端cookie中。狀態保持的目的是在一段時間內跟蹤請求者的狀態,並實現對當前請求者的數據的跨頁訪問。注意:不同請求者之間不會共享此數據,與請求者一一對應

 

2.Session會話(示例Django)·默認情況下啓用使用django-admin startproject創建的項目

·在settings.py文件中

在INSTALLED_APPS列表中添加:

'django.contrib.sessions',

在MIDDLEWARE_CLASSES列表中添加:

'django.contrib.sessions.middleware.SessionMiddleware',

·禁用會話:刪除上面指定的兩個值,禁用會話將保存一些性能

3.使用session

·啓用會話後,每個HttpRequest對象都將具有會話屬性,該屬性是類字典對象

Get(key,default = None):根據密鑰獲取會話的值

Request.session.get(“UNAME”,””)

·clear():清除所有會話

Flus():刪除當前會話數據並刪除會話的cookie

Del request.session ['uname']:刪除會話

4.session到期時間

Set_expiry(value):設置會話的超時時間

·如果未指定,則在兩週後過期

·如果value是整數,則會話值將在值秒內沒有活動後到期

·如果值是timedelta對象,則會話將在當前時間加上指定的日期/時間到期

·如果value爲0,則用戶會話的cookie將在用

 

 

 

------------------------------------------------ 我是低調的分隔線  ----------------------------------------------------

                

面向對象,面向卿;不負代碼,不負心... ...

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章