2018年5月9日JAVA-servlet02
- session對象用於在會話範圍內,記錄每個客戶端的訪問狀態,以便於跟蹤每個客戶端的操作狀態,在會話存儲的信息,在瀏覽器發出後續請求時可以獲取這些會話的有效數據。
- 在jsp頁面中可以直接使用session對象(jsp的內置對象),也可以通過pageContext.getSession()或者request.getSession重新回去session對象。
- session可以保存用戶的信息和實現購物車等功能。
- HTTP協議是一種無狀態協議,客戶向服務器發出的請求request,然後服務器返回響應response,連接就被關閉了,在服務器不保存連接的有關信息,因此在下一次連接時,服務器已經沒有以前的連接信息了,無法判斷這一次連接和上一次連接時同一個客戶信息,因此,必須使用會話記錄有關連接的信息。
- 從客戶打開瀏覽器連接到服務器,到客戶關閉瀏覽器離開這個服務器,稱做一個會話。當客戶訪問服務器是,可能會反復連接這個服務器上的幾個頁面、反復刷新一個頁面或不斷地向一個頁面提交信息等,服務器應當通過某種方法知道這是同一個客戶,這時就需要session對象。
- session的工作原理如下:
- 1、客戶首次訪問服務器的一個頁面時,服務器就會為該用戶分配一個session對象,同時為這個session指定唯一的ID,並且將該ID發送到客戶端並寫入到cookie中,使得客戶端與服務器的session建立一一對應的關系;
- 2、當客戶端繼續訪問服務器端的其它資源時,服務器不再為該客戶分配新的session對象,直到客戶端瀏覽器關閉、超時或調用session的invalidate()方法使其失效,客戶端與服務器的會話結束。
- 3、當客戶重新打開瀏覽器訪問網站時,服務器會重新為客戶分配一個session對象,並重新分配sessionID。
- session對象主要用於屬性操作和會話管理,常用方法如下:
- 1、public void setAttribute(String name,String value)設定指定名字的屬性的值,並將它添加到session會話範圍內,如果這個屬性是會話範圍內存在,則更改該屬性的值。
- 2、public Object getAttribute(String name)在會話範圍內獲取指定名字的屬性的值,返回值類型為object,如果該屬性不存在,則返回null。
- 3、public void removeAttribute(String name),刪除指定名字的session屬性,若該屬性不存在,則出現異常。
- 4、public void invalidate(),使session失效。可以立即使當前會話失效,原來會話中存儲的所有對象都不能再被訪問。
- 5、public String getId( ),獲取當前的會話ID。每個會話在服務器端都存在一個唯一的標示sessionID,session對象發送到瀏覽器的唯一數據就是sessionID,它一般存儲在cookie中。
- 6、public void setMaxInactiveInterval(int interval) 設置會話的最大持續時間,單位是秒,負數表明會話永不失效。
- 7、public int getMaxInActiveInterval(),獲取會話的最大持續時間。
- 8、使用session對象的getCreationTime()和getLastAccessedTime()方法可以獲取會話創建的時間和最後訪問的時間,但其返回值是毫秒,一般需要使用下面的轉換來獲取具體日期和時間。
- Date creationTime = new Date(session.getCreationTime());
- Date accessedTime = new Date(session.getLastAccessedTime());
-
<%@ page language="java" import="java.util.*" contentType="text/html;charset=GBK"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>session對象方法</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <b> 會話ID:<%=session.getId() %> <br> 是否新會話:<%=session.isNew() %><br> 設置和獲取屬性對象:用戶名 = <%session.setAttribute("用戶名","bing"); %> <%=session.getAttribute("用戶名") %><br> <% Date creationTime = new Date(session.getCreationTime()); Date accessedTime = new Date(session.getLastAccessedTime()); %> 會話創建時間:<%=creationTime %><br> 上次訪問時間:<%=accessedTime %><br> 會話持續時間(s):<%=session.getMaxInactiveInterval() %><br> <%session.setMaxInactiveInterval(12); %> 修改後的會話持續時間(s):<%=session.getMaxInactiveInterval() %><br> <%session.invalidate(); %> </b> </body> </html>
-
瀏覽器在訪問服務器時,服務器將一些數據以 set-cookie 消息頭的形式發送給瀏覽器。瀏覽器會將這些數據保存起來。當瀏覽器再次訪問服務器時,會將這些數據以 cookie 消息頭的形式發送給服務器。
2、創建 cookie
Cookie cookie = new Cookie(String name,String value); response.addCookie(cookie);
cookie的name不可以重復,和Map集合類似,當有重復的name的時候,會替代。
3、查詢cookie
//如果沒有 cookie,則返回 null。 Cookie[] cookies = request.getCookies(); String name = cookie.getName(); String value = cookie.getValue();
4、cookie 保存時的編碼問題
cookie 的值叧能是ascii 字符,如果是中文,需要將中文轉換成 ascii 字符形式。可以使用 URLEncoder.encode()方法和 URLDecoder.decode()方法來進行這種轉換。
5、cookie 的保存時間
cookie.setMaxAge(int seconds);//單位為秒
? seconds > 0
瀏覽器會將 cookie 以文件的方式保存在硬盤上。在超過指定的時間以後,會刪除該文件。
? seconds < 0
默認值,瀏覽器會將 cookie 保存在內存裏面。叧有當瀏覽器關閉以後,才會刪除。
? seconds = 0
立即刪除該 Cookie6、刪除 cookie
比如要刪除一個 name 為”username”的 cookie。
Cookie c = new Cookie(“username”,”“);
c.setMaxAge(0);
cookie.setPath(request.getContextPath());//路徑
response.addCookie(c);7、cookie 的限制
? cookie 可以禁止
? cookie 的大小有限制(4k 左右)
? cookie 的數量也有限制(瀏覽器大約能保存 300 個)
? cookie 的值叧能是字符串,要考慮編碼問題。
? cookie 不安全8、cookie 的路徑問題
瀏覽器在向服務器上的某個地址發送請求時,會先比較 cookie 的路徑不向訪問的路徑(地址)是否匹配, 叧有匹配的 cookie, 才會發送。
cookie 的路徑可以通過 cookie.setPath(String path)方法來設置。如果沒有設置, 則有一個缺省的路徑,缺省的路徑是生成該 cookie 的組件的路徑。
比如: /appname/addCookie 保存了一個 cookie,則該 cookie 的路徑就是/appname/addCookie。
規則:
cookie 的路徑必須是要訪問的路徑的上層目錄戒者是不要訪問的路徑相等, 瀏覽器才會將 cookie 發送給服務器。一般可以設置 setPath(“/appname”),表示訪問該應用下的所有地址,均會發送 -
服務端如何識別特定的客戶?這個時候Cookie就登場了。每次HTTP請求的時候,客戶端都會發送相應的Cookie信息到服務端。實際上大多數的應用都是用 Cookie 來實現Session跟蹤的,第一次創建Session的時候,服務端會在HTTP協議中告訴客戶端,需要在 Cookie 裏面記錄一個Session ID,以後每次請求把這個會話ID發送到服務器,我就知道你是誰了,註意,第一次請求時,請求頭中是沒有Cookie的,響應頭中會Set-Cookie。
第一次請求時,響應頭中Set-Cookie:
Session利用Cookie的實現機制:
有人問,如果客戶端的瀏覽器禁用了 Cookie 怎麽辦?一般這種情況下,會使用一種叫做URL重寫的技術來進行會話跟蹤,即每次HTTP交互,URL後面都會被附加上一個諸如 jsessionid 這樣的參數,服務端據此來識別用戶。
<a href="<%=response.encodeURL("getSession.jsp")%>">跳轉到獲取session的頁面</a>
Cookie其實還可以用在一些方便用戶的場景下,設想你某次登陸過一個網站,下次登錄的時候不想再次輸入賬號了,怎麽辦?這個信息可以寫到Cookie裏面,訪問網站的時候,網站頁面的腳本可以讀取這個信息,就自動幫你把用戶名給填了,能夠方便一下用戶。這也是Cookie名稱的由來,給用戶的一點甜頭。 Session是在服務端保存的一個數據結構,用來跟蹤用戶的狀態,這個數據可以保存在集群、數據庫、文件中;
Cookie是客戶端保存用戶信息的一種機制,用來記錄用戶的一些信息,也是實現Session的一種方式。 Cookie發送:<% Cookie c = new Cookie("name","Gareen");//鍵值對 c.setMaxAge(60*60*24);//有效期24小時,本地持久化 c.setPath("127.0.0.1");//Path表示服務器的主機名,只有瀏覽器通過這個主機名訪問服務器的時候,才會提交這個cookie到服務端 response.addCookie(c);//發送生成的Cookie %> <a href="getCookie.jsp">跳轉到獲取cookie的頁面</a>
註意path的問題:
path表示cookie所在的目錄。”/”表示根目錄,所有頁面都能訪問根目錄下面的cookie。如果cookie的path為test,那麽只test目錄下或者是test下的子目錄的頁面和代碼才獲取到這個cookie。
例如http://localhost:8080/Web02/test
當URL的path值是以“/”結尾的時候,直接設置為cookie的path值
當URL的path值不是以“/”結尾的時候,查看path裏面是否有“/”
例:http://localhost:8080/Web02/test/testServlet
如果有“/”的話,直接截取到最後一個“/”,然後設置為cookie的path值。
如果沒有“/”的話,將cookie的path設置為”/”。
Cookie讀取
Cookie[] cookies = request.getCookies(); if(cookies != null) for(int i=0;i<cookies.length;i++){ response.getWriter().print(cookies[i].getName()+":"+cookies[i].getValue()); }
Cookie刪除
Cookie c = new Cookie("name","peter"); c.setMaxAge(24*60*60); c.setPath("/"); response.addCookie(c); Cookie cookie = new Cookie("username","peter");// 新建Cookie cookie.setMaxAge(0); // 設置生命周期為0,表示將要刪除 response.addCookie(cookie);
2018年5月9日JAVA-servlet02