會話技術Session&Cookie
一、會話技術簡介
1.存儲客戶端的狀態
由一個問題引出今天的內容,例如網站的購物系統,用戶將購買的商品信息存儲到哪 裏?因為Http協議是無狀態的,也就是說每個客戶訪問服務器端資源時,服務器並不知道該客戶端是誰,所以需要會話技術識別客戶端的狀態。會話技術是幫助服務器 記住客戶端狀態(區分客戶端)
舉例購物過程:
2.會話技術
從打開一個瀏覽器訪問某個站點,到關閉這個瀏覽器的整個過程,成為一次會話。會話技術就是記錄這次會話中客戶端的狀態與數據的。
會話技術分為Cookie和Session:
Cookie:數據存儲在客戶端本地,減少服務器端的存儲的壓力,安全性不好,客戶端可以清除cookie
Session:將數據存儲到服務器端,安全性相對好,增加服務器的壓力
二、Cookie技術
Cookie技術是將用戶的數據存儲到客戶端的技術,我們分為兩方面:
第一,服務器端怎樣將一個Cookie發送到客戶端
第二,服務器端怎樣接受客戶端攜帶的Cookie
1.服務器端向客戶端發送一個Cookie
1)創建Cookie:
Cookie cookie = new Cookie(String cookieName,String cookieValue);
示例:
Cookie cookie = new Cookie("username","zhangsan");
那麽該cookie會以響應頭的形式發送給客戶端:
註意:Cookie中不能存儲中文
2)設置Cookie在客戶端的持久化時間:
cookie.setMaxAge(int seconds); ---時間秒
註意:如果不設置持久化時間,cookie會存儲在瀏覽器的內存中,瀏覽器關閉 cookie信息銷毀(會話級別的cookie),如果設置持久化時間,cookie信息會 被持久化到瀏覽器的磁盤文件裏
示例:
cookie.setMaxAge(10*60);
設置cookie信息在瀏覽器的磁盤文件中存儲的時間是10分鐘,過期瀏覽器自動刪除該cookie信息
3)設置Cookie的攜帶路徑:
cookie.setPath(String path);
註意:如果不設置攜帶路徑,那麽該cookie信息會在訪問產生該cookie的web資源所在的路徑都攜帶cookie信息
示例:
cookie.setPath("/WEB16");
代表訪問WEB16應用中的任何資源都攜帶cookie
cookie.setPath("/WEB16/cookieServlet");
代表訪問WEB16中的cookieServlet時才攜帶cookie信息
4)向客戶端發送cookie:
response.addCookie(Cookie cookie);
5)刪除客戶端的cookie:
如果想刪除客戶端的已經存儲的cookie信息,那麽就使用同名同路徑的持久化時 間為0的cookie進行覆蓋即可
2.服務器端怎麽接受客戶端攜帶的Cookie
cookie信息是以請求頭的方式發送到服務器端的:
1)通過request獲得所有的Cookie:
Cookie[] cookies = request.getCookies();
2)遍歷Cookie數組,通過Cookie的名稱獲得我們想要的Cookie
for(Cookie cookie : cookies){
if(cookie.getName().equal(cookieName)){
String cookieValue = cookie.getValue();
}
}
案例一:顯示用戶上一次訪問時間
案例分析:
案例實現:
1 /** 2 * 案例一:顯示用戶上一次的訪問時間 3 * @author vanguard 4 * 5 */ 6 public class LastAccessTimeServlet extends HttpServlet { 7 8 public void doGet(HttpServletRequest request, HttpServletResponse response) 9 throws ServletException, IOException { 10 //獲得當前的時間 11 Date date = new Date(); 12 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); 13 String currentTime = format.format(date); 14 15 //1. 第一次訪問,把當前時間以Cookie的形式寫給客戶端 16 Cookie cookie = new Cookie("lastAccessTime", currentTime); 17 cookie.setMaxAge(60*10*500); 18 response.addCookie(cookie); 19 20 //2. 獲取客戶端攜帶的Cookie信息 21 Cookie[] cookies = request.getCookies(); 22 String lastAccessTime = null; 23 //3. 判斷獲得的cookie是否為null 24 if(cookies != null) { 25 //4. 不為空,遍歷獲得的cookie數組 26 for(Cookie c : cookies) { 27 String CookieName = c.getName(); 28 //5. 獲得上一次的訪問時間 lastAccessTime 29 if("lastAccessTime".equals(CookieName)) { 30 lastAccessTime = c.getValue(); 31 } 32 } 33 } 34 response.setCharacterEncoding("UTF-8"); 35 //6. lastAccessTime為null,為第一次訪問 36 if(lastAccessTime != null) { 37 response.getWriter().write("您的上一次訪問時間為" + lastAccessTime); 38 } else { 39 response.getWriter().write("您是第一次訪問"); 40 } 41 42 } 43 44 public void doPost(HttpServletRequest request, HttpServletResponse response) 45 throws ServletException, IOException { 46 doGet(request, response); 47 48 } 49 50 }
三、Session技術
Session技術是將數據存儲在服務器端的技術,會為每個客戶端都創建一塊內存空間 存儲客戶的數據,但客戶端需要每次都攜帶一個標識ID去服務器中尋找屬於自己的內 存空間。所以說Session的實現是基於Cookie,Session需要借助於Cookie存儲客戶的唯一性標識JSESSIONID。在Session這我們需要學習如下三個問題:
怎樣獲得屬於本客戶端的session對象(內存區域)?
怎樣向session中存取數據(session也是一個域對象)?
session對象的生命周期?
1.獲得Session對象
HttpSession session = request.getSession();
此方法會獲得專屬於當前會話的Session對象,如果服務器端沒有該會話的Session 對象會創建一個新的Session返回,如果已經有了屬於該會話的Session直接將已有的Session返回(實質就是根據JSESSIONID判斷該客戶端是否在服務器上已經存在 session了)
2.怎樣向session中存取數據(session也是一個域對象)
Session也是存儲數據的區域對象,所以session對象也具有如下三個方法:
session.setAttribute(String name,Object obj);
session.getAttribute(String name);
session.removeAttribute(String name);
3.Session對象的生命周期(面試題/筆試題)
創建:第一次執行request.getSession()時創建
銷毀:
1)服務器(非正常)關閉時
2)session過期/失效(默認30分鐘)
問題:時間的起算點 從何時開始計算30分鐘?
從不操作服務器端的資源開始計時
可以在工程的web.xml中進行配置
<session-config>
<session-timeout>30</session-timeout>
</session-config>
3)手動銷毀session
session.invalidate();
作用範圍:
默認在一次會話中,也就是說在,一次會話中任何資源公用一個session對象
面試題:瀏覽器關閉,session就銷毀了? 不對
會話技術Session&Cookie