編程屆控制師:Cookie和Session兩種會話技術分享



編程屆控制師:Cookie和Session兩種會話技術分享

一、什麼是會話?

會話可簡單理解為:用戶打開一個瀏覽器,點擊多個超鏈接,訪問服務器多個web資源,然後關閉瀏覽器,整個過程稱之為一個會話。會話過程中要解決一些問題:每個用戶與服務器進行交互的過程中,各自會有一些數據,程序要想辦法保存每個用戶的數據;那麼怎樣解決這樣的問題呢?——藉助於兩種會

話技術。

二、Cookie會話技術

1、Cookie的定義

Cookie是客戶端技術,程序把每個用戶的數據以cookie的形式寫給用戶各自的瀏覽器。當用戶使用瀏覽器再去訪問服務器中的web資源時,就會帶著各自的數據去。這樣,web資源處理的就是用戶各自的數據了(Cookie翻譯成中文是小甜點,小餅乾的意思。在HTTP中它表示服務器送給客戶端瀏覽器的小甜點。其實Cookie就是一個鍵和一個值構成的,隨著服務器端的響應發送給客戶端瀏覽器。然後客戶端瀏覽器會把Cookie保存起來,當下一次再訪問服務器時把Cookie再發送給服務器。)。

2、Cookie的規範

我們可以放心,Cookie不會佔滿你的硬盤。因為一個Cookie最多隻有4KB,一個服務器最多隻能發送到客戶端20個Cookie,並且瀏覽器最多可以保存300個Cookie。當然,在瀏覽器大戰的今天,一些瀏覽器為了打敗對手,可能對Cookie規範“擴展”了一些,例如每個Cookie的大小為8KB,最多可保存500個Cookie等!但也不會出現把你硬盤佔滿的可能。不同的瀏覽器之間不能共享Cookie

3、Cookie的作用

Cookie的作用很大,但無論怎麼誇大Cookie的作用都離不開“跟蹤客戶端狀態”這句話。我們知道Cookie是服務器保存在客戶端的信息,然後客戶端會在下次請求時把Cookie在還給服務器,這樣服務器就可以通過信息來識別客戶端了。就好比你去醫院看病,第一次去需要買卡片,然後你去任何科室都需要你出示卡片。只要你出示卡片,醫生就會知道你去過哪些科室,看了哪些病!卡片上只有一個ID,它就是Cooke,而你本人就是客戶端,而醫生就是服務器了。

4、Cookie的屬性:

Cookie最重要的4個屬性為:

  1. 名字(name)
  2. 值(value)
  3. 路徑(path)
  4. 域(domain)

5、Cookie的API

保存Cookie到客戶端,這是響應工作的一部分,所以這個方法是response對象的,並且Cookie是HTTP協議中的內容,所以保存Cookie是HttpServletResponse類中的方法。

javax.servlet.http.Cookie類用於創建一個Cookie,response接口中定義了一個addCookie方法,void addCookie(Cookie c):添加Cookie對象到當前response對象中,這個方法可以被調用多次,從而完成添加多個Cookie對象到response中。它用於在其響應頭中增加一個相應的Set-Cookie頭字段。 同樣,request接口中也定義了一個getCookies方法,它用於獲取客戶端提交的Cookie:HttpServletRequest:Cookie[] getCookies(),它返回的是Cookie數組,而不是一個Cookie對象。如果請求中沒有Cookie,那麼該方法返回null。

Cookie類中的方法有:

public Cookie(String name,String value):cookie的構造方式

String getName():獲取cookie的名稱

String getValue():獲取cookie的值

void setMaxAge(int expiry):設置有效時間,失效cookie:setMaxAge(0);前提條件是:設置有效路徑(和之前設置過相同),cookie.setMaxAge(-1):cookie的maxAge屬性的默認值就是-1(其實只要是負數都是一個意思),表示只在瀏覽器內存中存活。一旦關閉瀏覽器窗口,那麼cookie就會消失。

void setPath(String uri):設置有效路徑

void setDomain(String pattern):設置有效域名

6、Cookie的分類:

會話級別cookie:保存在瀏覽器中,瀏覽器關閉cookie就失效了

持久的cookie:存到本地的文件中,需要設置有效的保存時間(通過setMaxAge(int a)進行設置);

如果創建了一個cookie,並將他發送到瀏覽器,默認情況下它是一個會話級別的cookie(即存儲在瀏覽器的內存中),用戶退出瀏覽器之後即被刪除。若希望瀏覽器將該cookie存儲在磁盤上,則需要使用maxAge,並給出一個以秒為單位的時間。

刪除持久cookie,可以將cookie最大時效設為0,注意,刪除cookie時,path必須一致,否則不會刪除

二、Session會話技術

Session是服務器端技術,利用這個技術,服務器在運行時可以為每一個用戶的瀏覽器創建一個其獨享的session對象,由於session為用戶瀏覽器獨享,所以用戶在訪問服務器的web資源時,可以把各自的數據放在各自的session中,當用戶再去訪問服務器中的其它web資源時,其它web資源再從用戶各自的session中取出數據為用戶服務。Session對象由服務器創建,開發人員可以調用request對象的getSession方法得到session對象。

  1. Session也是域對象之一,它的範圍是在一個會話範圍內有效。Session既然是域對象,那麼當然就要有getAttribute()和setAttribute()系列方法了。
  2. 在一個會話內共享一個Session對象,所以Session中可以保存一個會話內的數據。例如當前用戶的信息。
  3. Session的範圍大於request,可以在一個會話中多個請求之間共享數據。但Session的範圍小於application,Session不能在多個用戶之間共享數據。

1.獲取Session對象

使用request.getSession()方法就可以獲取Session對象。有了Session,就不用使用Cookie來跟蹤會話了!但是Session不能像Cookie那樣長命,一旦用戶關閉瀏覽器窗口,那麼Session就死掉了。

2.Session的實現原理

我們都知道HTTP是無狀態協議,但是為什麼session可以跟蹤會話狀態呢?因為,session依賴Cookie。利用cookie回寫了一個JSESSIONID(JESSIONID就是為每個seesion起一個唯一的標識)

類似於銀行卡,卡上只有一個ID,其他什麼都沒有,表示金額的這個數據在銀行的數據庫裡。那為什麼在ATM上我們只需要把卡插入就可以看到卡上餘額呢?原因是ATM獲取卡上的ID,然後通過ID去銀行數據庫中查找對應的賬戶!每個賬戶都有一個ID屬性,賬戶上可能還會有密碼屬性、餘額屬性等。每張卡上只有一個ID,再沒有其他的東西了。但ATM可以讀取卡上的ID,然後去銀行數據庫中查找對應的賬戶!所以你大可以放心,銀行卡壞掉了沒有關係,錢不會掉的,因為賬戶餘額在銀行的數據庫中,你只需要重新去銀行辦一張卡,把你的卡號置入到新卡中就OK了。

每個session對象都有一個id屬性,session就相當於銀行的賬戶。而sessionId就相當於卡!銀行數據庫就是Tomcat服務器,而手裡只有卡的我們就是客戶端瀏覽器。

當你第一次去銀行辦理業務時,這需要辦一張卡,然後你需要拿著卡回家,下一次再去銀行辦理業務時就不需要再辦卡了,但你不要忘記帶著卡去銀行。

當客戶端第一次訪問服務器時,服務器會為客戶端創建一個session對象,然後把session對象放到session池中,在響應時把sessionId通過Cookie響應給客戶端。注意,只有在第一次訪問時,服務器才會創建session,給客戶端響應sessionId。從此以後就不會了!

當客戶端再次訪問服務器時,會在請求中帶著sessionId給服務器,服務器通過sessionId到session池中找到session對象,這就可以完成會話跟蹤了。也就是說,服務器端保存的是session對象,而客戶端只有sessionId。每次訪問都需要通過客戶端的sessionId來匹配服務器端的session對象!這樣用戶在session中保存的數據就可以再次被使用了。

sessionId是服務器通過Cookie發送給客戶端瀏覽器的,這個Cookie的maxAge為-1,即只在瀏覽器內存中存在。如果你關閉所有瀏覽器窗口,那麼這個Cookie就會消失了!

3.Session失效

Session失效有如下幾個原因:

  1. 客戶端的請求中沒有sessionId。可能是因為這是第一次請求(開始一個新的會話),也可能是服務器設置Cookie的maxAge為0導致的;(客戶端沒有銀行卡)
  2. 客戶端請求中存在sessionId,但這個sessionId在session池中沒有匹配的session對象。這可能是因為session太久沒有使用,服務器把session從池中移除的原因;(銀行卡沒有對應的銀行賬戶)
  3. 客戶端請求中存在sessionId,但匹配的session對象被標記為失效!這可能是因為服務器調用了session.invalidate()方法導致的。(銀行賬戶找到了,但賬戶已被凍結)

4.與session相關的方法

String getId():獲取sessionId;

int getMaxInactiveInterval():獲取session可以的最大不活動時間(秒),默認為30分鐘。當session在30分鐘內沒有使用,那麼Tomcat會在session池中移除這個session;

void setMaxInactiveInterval(int interval):設置session允許的最大不活動時間(秒),如果設置為1秒,那麼只要session在1秒內不被使用,那麼session就會被移除;

long getCreationTime():返回session的創建時間,返回值為當前時間的毫秒值;

long getLastAccessedTime():返回session的最後活動時間,返回值為當前時間的毫秒值;

void invalidate()

:讓session失效,調用這個方法會讓session失效,當session失效後,客戶端再次請求,服務器會給客戶端創建一個新的session,並在響應中給客戶端新session的sessionId;

boolean isNew():查看session是否為新。當客戶端第一次請求時,服務器為客戶端創建session,但這時服務器還沒有響應客戶端,也就是還沒有把sessionId響應給客戶端時,這時session的狀態為新。

5.Session和Cookie的主要區別在於:

具體來總結:用於面試中回答

都是用來跟蹤瀏覽器用戶身份的會話方式

  1. Cookie是把用戶的數據寫給用戶的瀏覽器,數據保存在客戶端;Session技術把用戶的數據寫到用戶獨佔的session中(服務器端),數據保存在服務器端。
  2. Cookie不是很安全,別人可以分析存在本地的Cookie,並進行Cookie欺騙,如果需要考慮安全,則使用Session;
  3. Session會在一定時間內保存在服務器上,當訪問增多,會筆尖佔用你的服務器的性能,如果主要考慮減輕服務器性能方面,應當使用Cookie
  4. Cookie有大小和個數的限制。

為了幫助小夥伴們更好的學習Python,技術學派整理了Python的相關學習視頻及學習路線圖。

領取方式

關注小編後,評論轉發文章,私信回覆:學習


分享到:


相關文章: