1. 程式人生 > >Cookie和session小結

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的物件鈍化到磁碟來實現。