1. 程式人生 > >初識Cookie與Session機制(圖文詳解)

初識Cookie與Session機制(圖文詳解)

1、Cookie

cookie是一小段文字資訊,通過使用cookie可以標識使用者身份、記錄使用者名稱及密碼、跟蹤重複使用者等。cookie在伺服器生成併發送給瀏覽器。cookie的資訊格式為key/value,有瀏覽器儲存在本地的快取中。可以提高服務端的效率,但安全性較差。

在JSP中,cookie不屬於內建物件,若要向客戶端傳送cookie,則必須new一個物件。cookie的物件由javax.Servlet.http.Cookie產生。

關於cookie常用的方法:

public Cookie(String key,String name):cookie的構造方法。

String getName():獲取cookie物件的key

String getValue():獲取cookie物件的value

void setMaxAge():設定cookie物件的最大有效時間

下面看看服務端向客戶端傳送Cookie的過程:

response.addCookie(Cookie cookie)             頁面跳轉(請求轉發、重定向都行)             客戶端獲取Cookie(request.getCookies();

下面是登入案列:

//login.jsp
 <form action="cookie/response_addCookie.jsp" method="post">
    	使用者名稱:<input type="text" name="userName" value="<%=(userName==null ? "":userName)%>"><br/>
    	密碼:<input type="password" name="userPwd"><br/>
    	<input type="submit" value="登入"><br/>
 </form>
//response_addCookie.jsp
<%
    	String name = request.getParameter("userName");
    	String pwd = request.getParameter("userPwd");
    	
    	//服務端
        //建立Cookie物件
    	Cookie cookie1 = new Cookie("name",name);
    	Cookie cookie2 = new Cookie("password"),

    	response.addCookie(cookie1);
    	response.addCookie(cookie2);
    	
    	//頁面跳轉到客戶端(轉發重定向)
    	response.sendRedirect("result.jsp");
    	
    	
    	
 %>
 //result.jsp
<%
    		//客戶端
            //獲取服務端傳過來的所有Cookie
    		Cookie[] cookies= request.getCookies();
    		for(Cookie cookie : cookies){
    			out.print(cookie.getName()+"..."+cookie.getValue()+"<br/>");
    		
    		}
    		
%>

在瀏覽器中執行可以:

可以看到result.jsp一共獲得了三個cookie,其中name和password是在login.jsp登入時用的使用者名稱和密碼,在response_addCookie.jsp在獲取併發送回給客戶端。再由result.jsp打印出來。但是最後獲取到的cookie值有三個。在這裡先注意一下JSESSIONID,後面將會講解。

以下是Cookie的執行機制圖:

首先,使用者通過客戶端的login.jsp登入,此時,請求轉發到服務端的check.jsp。check.jsp可以對客戶端傳過來的資料進行驗證,建立自定義的cookie物件,並放入到response中(response.addCookie(cookie);),接著重定向到新的跳轉頁面。並將cookie到傳送到客戶端中。且cookie在被儲存在瀏覽器中。需要注意的是,客戶端用request獲取Cookie物件,但每次不能獲取一個值,只能將所有的cookie同時獲取(Cookie[] cookies = request.getCookies();)

2、Session

在WEB開發中,伺服器可以為每個使用者瀏覽器建立一個會話物件(session物件),注意:一個瀏覽器獨佔一個session物件(預設情況下)。 因此,在需要儲存使用者資料時,伺服器程式可以把使用者資料寫到使用者瀏覽器獨佔的session中,當用戶使用瀏覽器訪問其它程式時,其它程式可以從使用者的session中取出該使用者的資料,為使用者服務。   

在每一次開啟一個網站時:從開啟到關閉可稱為一次會話。

Session的執行機制:

客戶端第一次請求服務端時,服務端會產生一個session物件(用於儲存給客戶的資訊)             並且每個session物件都會有一個唯一的sessionID(用於區分其他session)             服務端又會產生一個Cookie,並且該cookie的name=JSESSIONID,value=服務端sessionID的值             然後服務端會在響應客戶端的同時將該cookie傳送給客戶端,至此客戶端就有了一個cookie(JSESSIONID)             因此,客戶端的cookie就可以和服務端的session一一對應(JSESSIONID-session-Id)                          客戶端第二/N次請求服務端時,服務端會先用客戶端cookie中的JSESSIONID去服務端中匹配sessionID,如果匹配成功(cookie JSESSIONID的值等於session sessionID的值)說明此使用者不是第一次訪問,無需登入

舉個例子:

假設客戶端是客戶,服務端是酒店。客戶(客戶端)剛入住酒店時,前臺(服務端)會判斷此人是否是已登記(第一次訪問),若為第一次登記,則前臺會給其分配一張門卡(JSESSIONID)。且門卡(JSESSIONID)和門鎖(sessionID)一一對應(建立會話)。第二次或第N次回酒店時(請求服務端),通過你手裡是否有與門鎖對應的門卡(JSEESIONID==sessionID)判斷是否需要新建會話。而當你隔天辦理退房手續時,則視為會話結束。(皮中帶騷,手動滑稽)

 Session執行機制圖如下:

session的常用方法:

String getId();獲取sessionID                    boolean isNew():判斷是否是新使用者(第一次訪問)            void invalidate():使session失效(退出登入、登出)            void setAttribute():            Object getAttribute():            void serMaxInactiveInterval(秒):設定最大有效非活動時間            int getMaxInactiveInterval():獲取最大非活動有效時間

舉個例子:

//check.jsp
<%
    	request.setCharacterEncoding("utf-8");
    	String name = request.getParameter("useName");
    	String pwd = request.getParameter("usePwd");
    	if(name.equals("Emove") && pwd.equals("123456")){
    		//只有登入成功,session中才會有userName和userPwd
    		session.setAttribute("userName", name);
    		session.setAttribute("userPwd", pwd);
    		//服務端在第一次響應客戶端時,會發送一個JSESSIONID的cooike
    		System.out.print("sessionid:"+session.getId()+"<br/>");
    		Cookie cookie = new Cookie("name",name);
    		response.addCookie(cookie);
    		//設定最大非活動時間10秒
    		//session.setMaxInactiveInterval(10);
    		//跳轉到welcome
    		request.getRequestDispatcher("Welcome.jsp").forward(request, response);
    	}else{	
    		//登入失敗
    		response.sendRedirect("login.jsp");
    	}
%>
//Welcome.jsp
歡迎您:
    	<%	
    		String name = (String)session.getAttribute("userName");
    		//如果使用者沒有登入,而是直接通過地址訪問,則獲取到的地址必然是null,
    		if(name!=null){
    			out.print(name);
    			
    			
    	%>
    			
    	<a href="sessionDemo/invalidate.jsp" >登出</a>		
    	<%
    		}else{
    			//跳回登入頁
    			response.sendRedirect("login.jsp");
    		}
    		
    			
    			
    	 %>

3、cookie和session的區別

session

cookie

儲存的位置

伺服器

客戶端

安全性

較安全

較不安全

儲存的內容

Object

String