cookie和session

你們好,我是IT修真院深圳分院第5期學員,一枚正直善良的JAVA程序員。nginx

今天給你們分享一下,修真院官網JAVA任務5中,cookie和session的相關知識點程序員

1、背景介紹
HTTP協議的無狀態性web

有狀態數據庫

A:你今天中午吃的啥?後端

B:吃的大盤雞。跨域

A:味道怎麼樣呀?數組

B:還不錯,挺好吃的。瀏覽器

無狀態安全

A:你今天中午吃的啥?服務器

B:吃的大盤雞。

A:味道怎麼樣呀?

B:啊?啥?啥味道怎麼樣?

cookie和session存在的意義就是爲了保存http協議客戶端/服務器間的部分有用的狀態

無狀態加持cookie機制

A:你今天中午吃的啥?

B:吃的大盤雞。

A:你今天中午吃的大盤雞味道怎麼樣呀?

B:還不錯,挺好吃的。

cookie並無讓http協議變得有狀態,而是保留了部分有用的狀態

cookie和session

假如一個咖啡店有喝5杯咖啡免費贈一杯咖啡的優惠,然而一次性消費5杯咖啡的機會微乎其微,這時就須要某種方式來記錄某位顧客的消費數量。有兩個記錄的方案

一、發給顧客一張卡片,上面用印章記錄着消費的數量,通常卡片還有個有效期限。每次喝咖啡時,顧客出示這張卡片,店員就在卡片上蓋個章。

二、發給顧客一張會員卡,會員卡上有惟一標識的卡號,每次消費時,顧客出示該卡片,則店員在店裏的紀錄本上找到這個卡號對應的紀錄添加一些消費信息。

顧客就至關於客戶端瀏覽器,店員至關於服務器。方案一就是在客戶端保持狀態。也就是cookie;方案二是在服務器端保持狀態,也就是session。

cookie

Cookie 是在HTTP協議下,服務器或腳本能夠維護客戶工做站上信息的一種方式。Cookie 是由 Web 服務器保存在用戶瀏覽器內存或用戶本地硬盤(客戶端)上的小文本文件(內容一般通過加密),它能夠包含有關用戶的信息。不管什麼時候用戶連接到服務器,Web站點均可以訪問 Cookie 信息

session

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

2、知識剖析
怎麼應用cookie

學習cookie須要掌握的兩個要點

一、cookie的發放和讀取過程

二、cookie的經常使用方法(API)

cookie的發放和讀取

cookie的發放是經過擴展HTTP協議來實現的,服務器端經過在HTTP的響應中加上一行特殊的指示以提示瀏覽器按照指示生成相應的cookie。利用HttpServletRespones的addCookie()方法將它設置到客戶端

被該服務器設置過cookie的客戶端以後的每次訪問都會在請求頭上攜帶該cookie的信息(只要在設置的路徑範圍內),利用HttpServletRequest的getCookie()方法來讀取客戶端的Cookie,返回一個Cookie數組

cookie的經常使用API及注意事項

1.Cookie有效期:使用setMaxAge()方法設置

2.Cookie有效域:setDomain(String domain)/getDomain()

3.Cookie有效路徑:setPath(String uri)/getPath()

怎麼應用session

學習session須要掌握的兩個要點

一、理解sessionid

二、session的經常使用方法(API)

對sessionid的理解

sessionid是做爲服務器識別客戶端的手段而出現的,session是一種保存上下文信息的機制,它是針對每個用戶的,變量的值保存在服務器端,經過SessionID來區分不一樣的客戶

sessionid的載體有三種:

一、使用cookie(默認、最經常使用)

二、URL重寫的方式(針對cookie被禁的狀況)

三、在頁面表單裏面增長隱藏域(和第二種的區別是它使用post)

session的經常使用方法(API)及注意事項

一、setAttrubute(String name,Object value)/getAttrubute(String name)

二、session.setMaxInactiveInterval();參數單位是秒

Cookie和Session之間的區別

1.Cookie數據存放在客戶的瀏覽器(本地),session數據放在服務器上

2.Cookie不如session安全,別人能夠分析存放在本地的Cookie並進行Cookie欺騙,因此出於安全性的考慮應當使用Session

3.Session會在必定時間內保存在服務器上。當訪問增多,會佔用較多的服務器資源,因此出於性能考慮則應當使用cookie

4.session由於是保存在服務器上,因此不支持跨域的訪問

3、常見問題
一、配置服務器集羣狀況下客戶端拿不到session的問題

二、相同域下sessionid覆蓋的問題

四.解決方案
一、使用nginx負載均衡策略中的ip_hash設置,每一個請求按訪問ip的hash結果進行分配,這樣可使每個訪客固定訪問一個後端服務器。
二、在web服務器的配置中能夠修改自動分配的sessionid的key

5、編碼實戰

6、擴展思考
token
7、參考文獻
1.CSDN博客:https://blog.csdn.net/cxzhq20...

2.師兄的PPT

8、更多討論
Q一、 cookie存在本地的話會不會存在被篡改的風險?

答:不只存在本地會,存在瀏覽器也會,cookie自己安全性就低

Q二、若是cookie被禁用了,session還能用嗎

答:url重寫或者表單隱藏域均可以讓客戶端請求攜帶上sessionid

Q三、 發送到服務器的請求會攜帶所有cookie嗎?

答:不會,cookie自己會規定做用域的,在做用域之內纔會被客戶端攜帶

Q四、 cookie和localstorage有什麼區別?

clipboard.png

Q五、介紹下session鈍化機制

將服務器中不常用的Session對象暫時序列化到系統文件或是數據庫系統中,當被使用時反序列化到內存中,整個過程由服務器自動完成

小課堂視頻

PPT:PPT

感謝你們觀看

今天的分享就到這裏啦,歡迎你們點贊、轉發、留言、拍磚~

相關文章
相關標籤/搜索