1. 程式人生 > >javaweb學習筆記(四):會話管理(1)

javaweb學習筆記(四):會話管理(1)

目錄

會話管理

1.概念

2.cookie技術

2.1 Cookie一般處理流程

2.2 Cookie類


會話管理

1.概念

一次會話: 開啟瀏覽器 -> 訪問一些伺服器內容 -> 關閉瀏覽器。(瀏覽器A給伺服器傳送請求,訪問web程式,該次會話就已經接通,其中不管瀏覽器傳送多少請求,都視為一次會話,直到瀏覽器關閉,本次會話結束。若此時再開啟瀏覽器B,訪問伺服器,這是另一個會話,雖然是在同一臺電腦,同一個使用者在訪問,但是,這是兩次不同的會話。)

http是無狀態的,一次請求結束,連線斷開,下次伺服器再收到請求,它就不知道這個請求是哪個使用者發過來的。當然它知道是哪個客戶端地址發過來的,但是對於我們的應用來說,我們是靠使用者來管理,而不是靠客戶端。所以對我們的應用而言,它是需要有狀態管理的,以便服務端能夠準確的知道http請求是哪個使用者發起的,從而判斷他是否有許可權繼續這個請求。

會話管理: 管理瀏覽器客戶端和伺服器端之間會話過程中產生的會話資料。

兩種會話技術:

①cookie技術:會話資料儲存在瀏覽器客戶端。

②session技術:會話資料儲存在伺服器端。


2.cookie技術

Cookie是客戶端技術,程式把每個使用者的資料以cookie的形式寫給使用者各自的瀏覽器。當用戶使用瀏覽器再去訪問伺服器中的web資源時,就會帶著各自的資料去。這樣,web資源處理的就是使用者各自的資料了。

一個Cookie只能標識一種資訊,它至少含有一個標識該資訊的名稱(NAME)和設定值(VALUE)。

一個WEB站點可以給一個WEB瀏覽器傳送多個Cookie,一個WEB瀏覽器也可以儲存多個WEB站點提供的Cookie。

瀏覽器一般只允許存放300個Cookie,每個站點最多存放20個Cookie,每個Cookie的大小限制為4KB。


2.1 Cookie一般處理流程

1.伺服器建立cookie物件,把會話資料儲存到cookie物件中。

  Cookie cookie=new Cookie("name","value");

2.伺服器傳送cookie資訊到瀏覽器

 response.addCookie(cookie); 

(如: set-cookie: name=eric  隱藏傳送了一個set-cookie名稱的響應頭)

3.瀏覽器得到伺服器傳送的cookie,然後儲存在瀏覽器端。

4.瀏覽器在下次訪問伺服器時,會帶著cookie資訊

(如:cookie: name=eric  隱藏帶著一個叫cookie名稱的請求頭)

5.伺服器接收到瀏覽器帶來的cookie資訊

request.getCookies();

2.2 Cookie類

javax.servlet.http.Cookie類:用於儲存會話資料

1)構造方法:Cookie(java.lang.String name, java.lang.String value)

2)void setValue(java.lang.String  newValue) 設定cookie值

 java.lang.String   getValue() 取得cookie值

3)java.lang.String getName()   取得cookie名字

4)void setMaxAge(int expiry)    設定cookie的有效時間

int getMaxAge()   取得cookie有效期。

其中,expiry為正整數:表示cookie資料儲存瀏覽器的快取目錄(硬碟中),數值表示儲存 的時間。以秒為單位,如24*60*60表示一天。

 負整數:表示cookie資料儲存瀏覽器的記憶體中。瀏覽器關閉cookie就丟失了! 即只在一次會話中有效,通常取-1(沒有呼叫本方法,即預設為此)。

 零:表示刪除同名的cookie資料。(path必須一致,否則不會刪除)

 

 5)void setPath(java.lang.String uri) 設定cookie的有效訪問路徑

  java.lang.String getPath()   取得cookie的有效訪問路徑

有效路徑指的是cookie的有效路徑儲存在哪裡,那麼瀏覽器在有效路徑下訪問伺服器時就會帶著cookie資訊,否則不帶cookie資訊。


例1:驗證Cookie類的常用方法及流程

public class CookieDemo1 extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		//1.建立cookie物件
		Cookie cookie =new Cookie("name","hua");
		//設定cookie有效時間
		cookie.setMaxAge(5);
		//2.把資料傳送到瀏覽器(通過響應頭髮送:set-cookie)
		response.addCookie(cookie);
		//3.接收瀏覽器傳送的cookie資訊
		//String name=request.getHeader("cookie");
		Cookie[]  cookies=request.getCookies();
		if(cookies!=null) {
			for(Cookie c:cookies) {
				String name=c.getName();
				String value=c.getValue();
				System.out.println(name+"="+value);
			}
		}else {
			System.out.println("沒有cookie資料");
		}
	}
}

例2:使用cookie記錄使用者上次訪問時間

public class HistServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		//獲取當前時間
		SimpleDateFormat s=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String curTime=s.format(new Date());
		
		String lastTime=null;
		//取得cookie
		Cookie[] cookies=request.getCookies();
		//首次訪問
		if(cookies==null || lastTime==null) {
			response.getWriter().write("你是首次訪問,當前時間 為:"+curTime);
			Cookie cookie =new Cookie("lastTime",curTime);
			cookie.setMaxAge(1*24*60*60);//儲存一天
			response.addCookie(cookie);
		}
		//已經訪問過至少一次
		if(cookies!=null) {
			for(Cookie cookie:cookies) {
				if(cookie.getName().equals("lastTime")){
					lastTime=cookie.getValue();
					response.getWriter().write("歡迎回來,上次訪問時間為:"+lastTime+",當前時間為:"+curTime);
					
					cookie.setValue(curTime);
					cookie.setMaxAge(1*24*60*60);//儲存一天
					response.addCookie(cookie);
					break;
				}
			}
		}	
	}
}

第一次開啟瀏覽器:

稍等一下,再次重新整理: