瀏覽器在請求訪問服務器開始,一直到訪問瀏覽器結束,瀏覽器關閉爲止,這期間瀏覽器和服務器之間產生的全部請求和響應加在一塊兒,就稱爲瀏覽器和服務器之間的一次會話。 在一次會話中每每會產生一些數據,而這些數據須要咱們保存起來,例: *好比在沒有登陸時,將商品記載到購物車,其實就是將商品信息存入到了coocie或者session中。
能夠用cookie或者session保存會話中產生的數據數組
1:Cookie是將會話中產生的數據保存在客戶端,屬於客戶端技術;
2:Cookie是基於兩個頭進行工做的:Set-Cookie響應頭和Cookie請求頭;
3:經過Set-Cookie響應頭將Cookie從服務器發送到瀏覽器,讓瀏覽器保存到內部;而瀏覽器一旦保存了Cookie,之後瀏覽器每次訪問服務器時,都會經過Cookie請求頭,將Cookie信息帶回到服務器中。在須要時,在服務器端能夠獲取請求中Cookie的數據,從而實現一些功能;瀏覽器
1.建立Cookie對象安全
Cookie cookie = new Cookie(String name,Stringvalue); // 建立cookie的同時須要指定cookie的名字和cookie要保存的值 // Cookie的名字一旦指定後,就沒法修改!
2.將Cookie添加到response響應中服務器
response.addCookie(Cookie cookie); // 將cookie添加到響應中,由服務器負責將cookie信息發送給瀏覽器,再由瀏覽器保存到內部(能夠屢次調用該方法,添加一個以上的cookie
3.獲取請求中的全部Cookie對象組成的數組cookie
Cookie[] cookie = request.getCookies(); // 獲取請求中攜帶的全部cookie組成的cookie對象數組,若是請求中沒有攜帶任何cookie,調用該方法會返回null。
4.刪除瀏覽器中的Cookiesession
// cookie的API中沒有提供直接刪除cookie的方法,能夠經過別的方式間接刪除cookie // 刪除名稱爲cart的cookie:能夠向瀏覽器再發送一個同名的cookie(即名稱也叫作cart),並設置cookie的最大生存時間爲零,因爲瀏覽器是根據cookie的名字來區分cookie,若是先後兩次向瀏覽器發送同名的cookie,後發送的cookie會覆蓋以前發送的cookie。然後發送的cookie設置了生存時間爲零,所以瀏覽器收到後也會當即刪除!
5.Cookie的經常使用方法:併發
cookie.getName(); // 獲取cookie的名字 cookie.getValue(); // 獲取cookie中保存的值 cookie.setValue(); // 設置/修改cookie中保存的值(沒有setName方法,由於cookie的名字沒法修改) cookie.setMaxAge(); //設置cookie的最大生存時間(若是不設置,cookie默認在一次會話結束時銷燬!)
6.設置Cookie最大的生存時間(SetMaxAge):spa
cookie。setMaxAge(60) //單位爲秒
示例:
3d
1:Session是將會話中的產生的數據保存在服務器端,屬於服務器端技術;
2:Session是一個域對象,Seesion中也保存了一個map集合,往Session中存數據,其實就是將數據保存到Session指定map集合中;
3:經過session.setAttribute()方法,能夠將數據存入到Session中,經過session.getAttribute()方法能夠將數據從session中取出來;code
獲取session對象:
request.getSession() //獲取一個Session對象,若是在服務器內部中由當前瀏覽器對應的session,則直接返回該session對象;若是沒有對應的session,則會先建立一個新的session對象再返回;
Session是一個域對象,在session中也保存了一個map集合,而且sess中也提供了存取數據的方法,以下:
session.setAttribute(String attrName,Object attrValue); //往session域中添加一個域屬性,屬性名必須爲字符串類型,屬性值能夠爲任意類型 session。setAttribute(String attrName); //根據屬性名能夠獲取域中的屬性值,返回值是一個Object類型
Session域對象的三大特性:
建立session:
第一次調用request.getSession()方法時,會建立一個session對象。(當瀏覽器在服務器端沒有對應的session時,調用request.getSession()方法,服務器會建立一個session對象)
銷燬session:
1.超時銷燬:
默認狀況下,當超過30分鐘沒有訪問session時,session就會超時銷燬(30分鐘是默認時間,能夠修改);
2.自殺:
調用session的invalidate方法時,會當即銷燬session;
3.意外身亡:
1)當服務器非正常關閉時(硬件損壞,斷電,內存溢出等致使服務器非正常關閉),session會隨着服務器的關閉而銷燬;
2)當服務器正常關閉,在關閉以前,服務器會將內部的session對象序列化保存到服務器的work目錄下,變爲一個文件。這個過程叫作session的鈍化(序列化);再次將服務器啓動起來,鈍化着的session會再次回到服務器,變爲服務中的對象,這個過程叫作session的活化(反序列化);
在一次會話範圍內(獲取到的都是同一個session對象)
在整個會話範圍內實現數據的共享
Cookie和Session都屬於會話技術,均可以保存會話中產生的數據,可是因爲Cookie和Session的工做原理和特色不一樣,多以二者的應用場景也不一樣。
1.Cookie是將會話中產生的數據存入到瀏覽器客戶端,屬於客戶端技術(JS能夠訪問cookie)
2.Cookie是將數據保存到瀏覽器客戶端,容易隨着用戶的操做致使cookie丟失或被竊取,所以cookie中保存的數據不太穩定,也不太安全
3.cookie中數據存在瀏覽器中,對服務器端沒有太大影響,能夠將數據保存很長時間
4.瀏覽器對cookie的大小和個數都有限制,通常每一個站點給瀏覽器發送的cookie不超過20個,每一個cookie大小不超過1KB
1.Session是將會話產生的內容存入到服務器端,屬於服務器端技術
2.session將數據存入到服務器端的session對象中,相對來講更加安全,穩定。不容易隨着用戶的操做而致使session中數據丟失
3.session是服務器端的對象,在併發量較高的時候,每個瀏覽器客戶端在服務端都要對應一個session對象,佔用服務器的內存空間,影響效率
將商品保存到session中後,關閉瀏覽器再打開瀏覽器,訪問服務器,此時獲取不到以前的session。由於session是基於Cookie工做的。
在服務器建立一個session後,會爲session分配一個獨一無二的編號,稱之爲session的id,在這次響應時,服務器會將session的id以一個名稱爲JSESSIONID的cookie發送給瀏覽器保存到瀏覽器內部。
因爲保存sessionid的cookie默認是會話級別的cookie,在瀏覽器關閉後,cookie會跟着銷燬,sessionid也丟失了。所以下次訪問服務器,沒有session的id就獲取不到以前的session。也獲取不到session中的商品信息
解決方法:咱們能夠建立一個名稱爲JSESSIONID的cookie,其中保存session的ID,並設置cookie的最大存活時間,讓cookie保存到硬盤上(即便瀏覽器關閉,cookie也不會銷燬),這樣下次訪問服務器時,還能夠將sessionid帶給服務器,服務器能夠經過sessionid獲取到以前的session。 從session中獲取到商品信息