初識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 |