什麼是會話呢???
當瀏覽器發送請求訪問服務器開始,一直到訪問服務器結束,瀏覽器關閉爲止,這期間瀏覽器和服務器之間產生的全部請求和響應加在一塊兒,就稱之爲瀏覽器和服務器之間的一次會話。
在一次會話中每每會產生一些數據,而這些數據每每是須要咱們保存起來的。數組
那麼如何保存會話中產生的數據呢?瀏覽器
!!可使用cookie或session保存會話中產生的數據。安全
cookie的工做原理服務器
(1)Cookie是將會話中產生的數據保存在瀏覽器客戶端,是客戶端技術
(2)Cookie是基於兩個頭進行工做的: 分別是Set-Cookie響應頭和Cookie請求頭:
服務器在響應中給瀏覽器發送Cookie時,是經過Set-Cookie響應頭將cookie從服務器端發送給客戶端瀏覽器,讓瀏覽器保存到內部;而瀏覽器內部一旦保存了cookie,之後瀏覽器每次訪問服務器時,都會經過cookie請求頭,將cookie信息從瀏覽器再帶回服務器端,若是服務器端須要,能夠獲取請求中的cookie,從cookie中獲取保存的數據,從而實現某些功能。cookie
cookie的API及應用session
一、建立Cookie對象
`Cookie c = new Cookie(String name, String value);
// 建立Cookie的同時須要制定Cookie的名字 以及 cookie中要保存的值(數據)`併發
二、將Cookie添加到response響應中
`response.addCookie( Cookie c );
// 將Cookie添加到response響應中, 由服務器負責將cookie信息發送給瀏覽器, 再由瀏覽器保存到內部
// 能夠屢次調用該方法, 添加一個以上的cookie`對象
三、獲取請求中的全部cookie對象組成的數組
`Cookie[] cs = request.getCookies();
// 獲取請求中攜帶的全部cookie組成的cookie對象數組;
// 若是請求中沒有攜帶任何cookie, 調用該方法會返回null值。`
四、刪除瀏覽器中的Cookie
在cookie的API中沒有提供直接將cookie刪除的方法, 能夠經過別的方式間接刪除cookie
代碼示例:刪除名稱爲cart的cookie: 能夠向瀏覽器再發送一個同名的cookie(即名稱也叫cart),並設置cookie的最大生存時間爲零,因爲瀏覽器是根據cookie的名字來區分cookie,若是先後兩次向瀏覽器發送同名的cookie,後發送的cookie會覆蓋以前發送的cookie,然後發送的cookie也設置了生存時間爲零,所以瀏覽器收到後也會當即刪除!
`//建立一個名稱爲cart的cookie
Cookie c = new Cookie( "cart" , "" );
//設置cookie的最大生存時間爲零
c.setMaxAge( 0 );
//將cookie添加到響應中,發送給瀏覽器
response.addCookie( c );`
五、Cookie的經常使用方法
`cookie.getName() //獲取cookie的名字
cookie.getValue() //獲取cookie中保存的值
cookie.setValue() //設置/修改cookie中保存的值(沒有setName方法,由於cookie的名字沒法修改)
cookie.setMaxAge() //設置cookie的最大生存時間`生命週期
session的工做原理
(1)session保存在服務器端,屬於服務器端技術
(2)session是一個域對象,session中保存了一個map集合,往session中存數據,其實就是將數據保存到session的map集合中
(3)經過session.setAttribute方法能夠將數據保存到session對象map集合中,經過session.getAttribute方法能夠將數據從session中取出來。內存
session做爲域對象使用
Session是一個域對象,所以session中也提供了存取數據的方法。
session.setAttribute(String attrName, Object attrValue);
//往session域中添加一個域屬性, 屬性名只能是字符串, 屬性值能夠是任意類型
session.getAttribute(String attrName);
//根據屬性名獲取session域中的屬性值, 返回值是一個Object類型
如何獲取session對象:
HttpSession session = request.getSession(); // 獲取一個session對象, 若是在服務器內部有當前瀏覽器對應的session對象,則直接返回該session對象; 若是在服務器內部沒有對應session, 則會建立一個新的session對象再返回。
Session域對象的三大特徵:
(1)生命週期:
建立session: 在第一次調用request.getSession()方法時, 會建立一個session對象(當客戶端在服務器端沒有對應的session時, 調用request.getSession方法會讓建立一個session對象並返回)
銷燬session:
a)超時銷燬: 默認狀況下, 當超過30分鐘沒有訪問session, session就會超時銷燬(30分鐘是默認時間,能夠修改,但不推薦修改)
b)自殺: 調用session的invalidate方法, 會當即銷燬session
c)意外身亡: 當服務器非正常關閉時(斷電/硬件損壞/內存溢出等致使服務器意外關閉), session會隨着服務器的關閉而銷燬;
當服務器正常關閉, 在關閉以前, 服務器會將內部的session對象序列化保存到服務器的work目錄下, 變爲一個文件, 這個過程叫作session的序列化(也叫作鈍化)。再次啓動服務器, 鈍化着的session會再次回到服務器,變爲服務器中的session對象,這個過程叫作session的反序列化(活化)
(2)做用範圍:(同一個客戶端)在一次會話中,獲取到的都是同一個session對象
(3)主要功能:在一次會話範圍內實現數據的共享
Session和cookie都屬於會話技術, 均可以用於保存會話中產生的數據, 但因爲Cookie和Session的工做原理和特色不一樣, 所以二者的應用場景也不同。
cookie的特色
一、cookie是將會話中產生的數據保存在瀏覽器客戶端, 是客戶端技術
二、cookie是將數據保存在客戶端瀏覽器,容易隨着用戶的操做致使cookie丟失或者被竊取,所以cookie中保存的數據不太穩定,也不太安全。
但cookie將數據保存在客戶端,對服務器端沒有太多影響,能夠將數據保存很長時間。
所以cookie中適合存儲須要長時間保存的數據,但對安全性要求不高。
三、瀏覽器對cookie的大小和個數都有限制,通常推薦每個站點給瀏覽器發送的cookie數量不超過20個,每個cookie的大小不超過1kb。
Cookie的應用:實現購物車、記住用戶名、30天內自動登陸等。
session的特色
一、session是將會話中產生的數據保存在服務器端,是服務器端技術
二、session將數據存在服務器端的session對象中,相對更加的安全,並且更加穩定。不容易隨着用戶的操做而致使session中的數據丟失或者是被竊取。
但session是服務器端的對象,在併發量較高時每個瀏覽器客戶端在服務器端都要對應一個session對象,佔用服務器的內存空間,影響效率。
所以session中適合存儲對安全性要求較高,但不須要長時間保存的數據。
Session的應用:保存登陸狀態、保存驗證碼