Cookie和session小結
1、由於http協議是無狀態的,為了幫助伺服器記錄瀏覽器端的狀態,就有了會話技術。會話技術分為cookie(客戶端)和伺服器端(session)。一次會話技術的過程是(預設)從瀏覽器第一次開啟網址到這個瀏覽器關閉為止。
2、Cookie的內容是存在瀏覽器端,預設是瀏覽器關閉,Cookie的內容就取消。除非設定了Cookie的時間。cookie.setMaxAge(int second);
//設定cookie Cookie cookie1=new Cookie("name", "andy"); //向response新增cookie response.addCookie(cookie1); //獲取所有的cookie Cookie[] cookies = request.getCookies(); if (cookies!=null) { for (Cookie cookie : cookies) { String name = cookie.getName(); String value = cookie.getValue(); System.out.println("cookie name:"+name+";value is:"+value); } }
Cookie的設定,除了時間,還有個路徑。如果沒有設定的話,預設就是訪問路徑上一層的資源路徑。比如一個http://localhost:8080/user/path1/testHttp?username=andy&password=123產生了Cookie。
Cookie cookie1=new Cookie("name", "lucy");
// cookie1.setPath("/user/path1/"); //不設定相當於這一行程式碼
response.addCookie(cookie1);
那麼,訪問http://localhost:8080/user/path1/下的資源都會帶這個cookie。包括子目錄。比如訪問http://localhost:8080/user/path1/path2/login3。也同樣帶這個cookie
3、Session是伺服器端記錄會話的狀態。伺服器會為每個客戶端開闢一塊記憶體用於記錄客戶端的狀態,其標識為JSESSIONID。
HttpSession session = request.getSession();
通過上述方法,會獲得該會話的session物件,如果沒有這個物件,就會建立一個session。並且會向客戶端傳送關於此會話的sessionid,即會自動在cookie中寫入JESSIONID為名的鍵值對。下次客戶端訪問伺服器(HttpSession session = request.getSession())伺服器會自動從cookie中取出JESSIONID,
Set-Cookie: JSESSIONID=04AB4A86583A17E5B8050F2C2E5591A5;
session是一塊域,可以向其寫入鍵值對。
4、Session的生命週期預設是30分鐘,但是瀏覽器關閉後,其Cookie就不存JSESSIONID了,所以瀏覽器就找不到這個session物件了(通過JSESSIONID查詢)。為了瀏覽器關閉後還能找到上次的session,需要通過設定關於此JSESSIONID的cookie的存活時間來實現。
for (Cookie cookie : cookies) {
String name = cookie.getName();
String value = cookie.getValue();
System.out.println("cookie name:"+name+";value is:"+value);
//session持久化
if ("JSESSIONID".endsWith(name)) {
cookie.setMaxAge(60);
response.addCookie(cookie);
}
}
這樣瀏覽器關閉後,在訪問伺服器,仍可以找到上次的session物件。
5、session物件過多,會對伺服器造成壓力。一種優化方法是通過配置鈍化與活化的監聽器HttpSessionActivationListener,來實現多久時間存放在session的物件鈍化到磁碟來實現。