1. 程式人生 > >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個屬性為:
名字(name)
值(value)
路徑(path)
域(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有大小和個數的限制。

相關推薦

cookiesession會話技術

一,什麼是會話? 會話可簡單理解為:使用者開啟一個瀏覽器,點選多個超連結,訪問伺服器多個web資源,然後關閉瀏覽器,整個過程稱之為一個會話。會話過程中要解決一些問題:每個使用者與伺服器進行互動的過程中,各自會有一些資料,程式要想辦法儲存每個使用者的資料;那麼怎

會話技術cookiesession

ron 不能 max 壓力 println 狀態 空間 ets 對象 2018-05-10  21:43:16 會話   從打開一個瀏覽器的某個站點到關閉這個瀏覽器的整個過程,叫做一次會話。會話技術用於記錄這次會話中客戶端的數據和狀態,它又分為cookie和session。

會話技術(CookieSession)

什麼是會話呢?       所謂的會話過程就是指從開啟瀏覽器到關閉瀏覽器的過程。Cookie和Session指的又是什麼呢? 大家都知道,http是無狀態的協議,客戶每次讀取web頁面時,伺服器都開啟新的會話,而且伺服器也不會自動維護客戶的上下文資訊。如果說我們要

會話管理——cookiesession技術

存在 span str jsession 代碼 tco 2.3 cin cell 1 Cookie技術 1.1 Cookie技術特點: 會話數據保存在瀏覽器客戶端 1.2 Cookie的API Cookie類: 保存會話數據 1)創建Cookie對象,用於保存會話

web開發(三) 會話機制,CookieSession詳解

response 客戶端請求 非正常關閉 特殊情況 刪除 session 協議 XML 容易 在網上看見一篇不錯的文章,寫的詳細。 以下內容引用那篇博文。轉載於《http://www.cnblogs.com/whgk/p/6422391.html》,在此僅供學習參考之用。

java web---會話機制cookiesession

轉載:https://www.cnblogs.com/whgk/p/6422391.html 一、會話機制     Web程式中常用的技術,用來跟蹤使用者的整個會話。常用的會話跟蹤技術是Cookie與Session。Cookie通過在客戶端記錄資訊確定使用者身份,Session通過在伺服器端

理解cookiesession技術

一、HTTP協議的無狀態性 WEB應用程式使用的是HTTP協議傳輸資料的,HTTP協議是一個無狀態的協議,這次資料傳輸完畢,客戶端會和服務端斷開連線,再次傳輸資料就需要重新建立新的連線,這也就無法會話跟蹤。可以理解為伺服器是一個健忘症,這次你訪問他和它交換資料,下次來他就不認識你了,這是一個很不友好的事情。

djjango cookiesession 的幾常用需求使用方法

------https://www.cnblogs.com/liuqingzheng/articles/8990027.html 需求情形一:正常設定cookie def test_cookie_login(request): if request.method == 'POST':

(關於Cookie共享的解決方案Domain屬性Nginx)

1.設定Cookie的Domain 首先要了解Cookie作用域,這裡就用到了cookie的兩個屬性 domain,path domain 這個屬性可以設定cookie的作用域,path可以設定cookie的作用路徑 當作用域相同和作用路徑相同的時候才

詳細探討整理一下 java的會話管理:CookieSession

java的會話管理:Cookie和Session1.什麼是會話此處的是指客戶端(瀏覽器)和服務端之間的資料傳輸。例如使用者登入,購物車等會話管理就是管理瀏覽器客戶端和服務端之間會話過程產生的會話資料常用的會話技術之前學會了域物件的作用,所以在會話管理的時候也可以使用域物件的概

cookie session 的區別詳解

重復 處理方式 一行 所有 有效 依據 是把 存儲 一個 二者的定義: 當你在瀏覽網站的時候,WEB 服務器會先送一小小資料放在你的計算機上,Cookie 會幫你在網站上所打的文字或是一些選擇, 都紀錄下來。當下次你再光臨同一個網站,WEB 服務器會先看看有沒有它上次留下的

C#將Word轉換成PDF方法總結(基於OfficeWPS方案)

path ebs htm soft off ros exc 標題 總結  有時候,我們需要在線上預覽word文檔,當然我們可以用NPOI抽出Word中的文字和表格,然後顯示到網頁上面,但是這樣會丟失掉Word中原有的格式和圖片。一個比較好的辦法就是將word轉換成pdf,然

Python之路66-Django中的CookieSession

python目錄一、Cookie二、Session一、Cookie1.獲取Cookie request.COOKIES["key"] request.get_signed_cookie(key, default=RAISE_ERROR, s, max_age=None) # 參數 # default:默認

CSS3實現五子棋Web小遊戲,Canvas畫布DOM實現,並且具有悔棋撤銷悔棋功能。

posit oct padding 角色 sar pac osi fse ech 用Canvas實現五子棋的思路: 1、點擊棋盤,獲取坐標x,y,計算出棋子的二維數組坐標i和j, 2、棋子的實現,先arc一個圓,再填充漸變色。 3、下完一步棋後切換畫筆和角色。 4、贏法算法

跨域問題相關知識詳解(原生jsjquery方法實現jsonp跨域)

syn con 加載 developer 兩種方法 ray exe 編寫 分組 1、同源策略 同源策略(Same origin policy),它是由Netscape提出的一個著名的安全策略。同源策略是一種約定,它是瀏覽器最核心也最基本的安全功能,如果缺少了同源策略,則瀏覽

Cookiesession

存在 購物車 自動 名稱 () 內存 request 標識 基於 1.會話定義:打開瀏覽器瀏覽某一個網站--多次請求--瀏覽器關閉這個過程稱之為會話。2.B 瀏覽器 /S 服務器 2.1.瀏覽器端的會話技術:cookie JAVA(Cookie)   

cookiesession的區別

開發人員 一個 客戶端 匹配 也會 自己 ssi 成了 本地 幾乎每個web開發人員都會問Cookie和Session有什麽聯系和區別 拋出問題: 1.首先服務器是無記性的,不知道那個客戶端上過自己的網站; 2.如果不手動添加記憶功能,那麽每次訪問都需要登錄,豈不是很麻煩?

Django之cookiesession

name resp wrap sign ide 服務端 rgs err response 一、cookie 保存在客戶端瀏覽器上的鍵值對 1.獲取cookie 1 request.COOKIES[‘key‘] 2 request.get_signed_cookie(key

django-將數據庫數據轉換成JSON格式(ORMSQL情況)

user 展示 blog serialize 進行 項目開發 不管怎麽說 語句 spa 最近打算搞一個自動化運維平臺,所以在看Django的知識。 在實際項目開發中,遇到一個小問題:前後端發生數據交互主流采用的是JSON。前端傳數據到服務器端比較簡單,稍微麻煩的是服務器端傳

Cookie Session

詳解 存儲 意見 語言 ron http font 郵箱 通過         PHP高級工程師之網站安全     在這裏和大家分享一下多數網絡黑客常用的攻擊方式及預防措施。     如有不善,多提意見(QQ:1595068971-郵箱:[email protec