Java會話主要分為兩塊:Cookie和HttpSession
Cookie技術:會話數據保存在浏覽器客戶端。
Session技術:會話數據保存在服務器端。
一.下面介紹一下Cookie的應用
1. Cookie技術核心
Cookie類:用於存儲會話數據
1)構造Cookie對象
Cookie(java.lang.String name, java.lang.String value)
2)設置cookie
void setPath(java.lang.String uri) :設置cookie的有效訪問路徑
void setMaxAge(int expiry) : 設置cookie的有效時間
void setValue(java.lang.String newValue) :設置cookie的值
3)發送cookie到浏覽器端保存
void response.addCookie(Cookie cookie) : 發送cookie
4)服務器接收cookie
Cookie[] request.getCookies() : 接收cookie
2. Cookie原理
1)服務器創建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();
3 Cookie的細節
1)void setPath(java.lang.String uri) :設置cookie的有效訪問路徑。有效路徑指的是cookie的有效路徑保存在哪裡,那麼浏覽器在有效路徑下訪問服務器時就會帶著cookie信息,否則不帶cookie信息。
2)void setMaxAge(int expiry) : 設置cookie的有效時間。
正整數:表示cookie數據保存浏覽器的緩存目錄(硬盤中),數值表示保存的時間。
負整數:表示cookie數據保存浏覽器的內存中。浏覽器關閉cookie就丟失了!!
零:表示刪除同名的cookie數據
3)Cookie數據類型只能保存非中文字符串類型的。可以保存多個cookie,但是浏覽器一般只允許存放300個Cookie,每個站點最多存放20個Cookie,每個Cookie的大小限制為4KB。
4.下面是Cookie應用的代碼
1)設置Cookie
1 package com.vastsum; 2 3 import java.io.IOException; 4 import javax.servlet.ServletException; 5 import javax.servlet.annotation.WebServlet; 6 import javax.servlet.http.Cookie; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 11 /** 12 * Servlet implementation class CookieDemo 13 */ 14 @WebServlet("/CookieDemo") 15 public class CookieDemo extends HttpServlet { 16 17 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 18 //創建Cookie對象 19 Cookie cookie = new Cookie("name","shutu008"); 20 /** 21 * 如果沒有設置路徑,表示當前項目根目錄下 22 * 如果設置路徑保存在指定目錄下 23 */ 24 //設置保存在 /test目錄下,設置Cookie對象的路徑,如果設置表示此Cookie不在根目錄下。 25 cookie.setPath("/test"); 26 //設置cookie時間,默認時間粒度為秒 27 cookie.setMaxAge(1000); 28 //將Cookie對象發送到浏覽器 29 response.addCookie(cookie); 30 31 } 32 33 34 }
2)獲取cookie
1 package com.vastsum; 2 3 import java.io.IOException; 4 import javax.servlet.ServletException; 5 import javax.servlet.annotation.WebServlet; 6 import javax.servlet.http.Cookie; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 11 /** 12 * Servlet implementation class CookieTest 13 */ 14 @WebServlet("/CookieTest") 15 public class CookieTest extends HttpServlet { 16 private static final long serialVersionUID = 1L; 17 18 /** 19 * @see HttpServlet#HttpServlet() 20 */ 21 public CookieTest() { 22 super(); 23 // TODO Auto-generated constructor stub 24 } 25 26 /** 27 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 28 */ 29 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 30 31 //將Cookie對象存儲到數組中 32 Cookie[] cookies = request.getCookies(); 33 if (cookies!=null){ 34 //遍歷所有Cookie對象 35 for(Cookie c:cookies){ 36 //獲取Cookie對象的名稱 37 String name = c.getName(); 38 //獲取Cookie對象的值 39 String value = c.getValue(); 40 //將結果輸出到頁面上 41 response.getWriter().write(name+ "=" + value); 42 } 43 } 44 } 45 46 }
二.接下來介紹一下session的應用
1.HttpSession類:用於保存會話數據
1)創建或得到session對象
HttpSession getSession()
HttpSession getSession(boolean create)
2)設置session對象
void setMaxInactiveInterval(int interval) : 設置session的有效時間
void invalidate() : 銷毀session對象
java.lang.String getId() : 得到session編號
3)保存會話數據到session對象
void setAttribute(java.lang.String name, java.lang.Object value) : 保存數據
java.lang.Object getAttribute(java.lang.String name) : 獲取數據
void removeAttribute(java.lang.String name) : 清除數據
2.Session原理
問題: 服務器能夠識別不同的浏覽者!!!
前提: 在哪個session域對象保存數據,就必須從哪個域對象取出!!!!
浏覽器1:(給s1分配一個唯一的標記:s001,把s001發送給浏覽器)
1)創建session對象,保存會話數據
HttpSession session = request.getSession(); --保存會話數據 s1
浏覽器1 的新窗口(帶著s001的標記到服務器查詢,s001->s1,返回s1)
1)得到session對象的會話數據
HttpSession session = request.getSession(); --可以取出 s1
新的浏覽器1:(沒有帶s001,不能返回s1)
1)得到session對象的會話數據
HttpSession session = request.getSession(); --不可以取出 s2
浏覽器2:(沒有帶s001,不能返回s1)
1)得到session對象的會話數據
HttpSession session = request.getSession(); --不可以取出 s3
3. Sesson細節
1)java.lang.String getId() : 得到session編號
2)兩個getSession方法:
getSession(true) / getSession() : 創建或得到session對象。沒有匹配的session編號,自動創 建新的session對象。
getSession(false): 得到session對象。沒有匹配的session編號,返回null
3)void setMaxInactiveInterval(int interval) : 設置session的有效時間
session對象銷毀時間:
3.1 默認情況30分服務器自動回收
3.2 修改session回收時間
3.3 全局修改session有效時間
<!-- 修改session全局有效時間:分鐘 -->
<session-config>
<session-timeout>1</session-timeout>
</session-config>
手動銷毀session對象
void invalidate() : 銷毀session對象
4)如何避免浏覽器的JSESSIONID的cookie隨著浏覽器關閉而丟失的問題
/**
* 手動發送一個硬盤保存的cookie給浏覽器
*/
Cookie c = new Cookie("JSESSIONID",session.getId());
c.setMaxAge(60*60);
response.addCookie(c);
4.下面是HttpSession應用的代碼
1 package com.vastsum; 2 3 import java.io.IOException; 4 import java.util.Enumeration; 5 6 import javax.servlet.ServletException; 7 import javax.servlet.annotation.WebServlet; 8 import javax.servlet.http.HttpServlet; 9 import javax.servlet.http.HttpServletRequest; 10 import javax.servlet.http.HttpServletResponse; 11 import javax.servlet.http.HttpSession; 12 13 /** 14 * Servlet implementation class HttpSessionDemo 15 */ 16 @WebServlet("/HttpSessionDemo") 17 public class HttpSessionDemo extends HttpServlet { 18 private static final long serialVersionUID = 1L; 19 20 /** 21 * @see HttpServlet#HttpServlet() 22 */ 23 public HttpSessionDemo() { 24 super(); 25 // TODO Auto-generated constructor stub 26 } 27 28 /** 29 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 30 */ 31 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 32 // TODO Auto-generated method stub 33 //設置編碼 34 response.setContentType("text/html;charset=UTF-8"); 35 //創建HttpSession對象 36 HttpSession httpSession = request.getSession(); 37 //設置HttpSession的值和內容 38 httpSession.setAttribute("name", "srv"); 39 httpSession.setAttribute("phone", "051112345678"); 40 //獲取唯一的session id 41 String sessionId = httpSession.getId(); 42 //獲取指定名稱的值 43 //String value = (String)httpSession.getAttribute("name"); 44 45 /** 46 * 獲取HttpSession中所有的值。返回值是枚舉類型 47 */ 48 Enumeration<String> attributeNames = httpSession.getAttributeNames(); 49 50 while(attributeNames.hasMoreElements()){ 51 //遍歷出session中所有的name 52 String name = (String)attributeNames.nextElement(); 53 //找出name對應的value 54 String value = (String)httpSession.getAttribute(name); 55 //輸出到浏覽器 56 response.getWriter().write(name+ "=" + value); 57 } 58 if(httpSession.isNew()){ 59 response.getWriter().write("session不存在,最新sessionId是:" + sessionId); 60 } 61 else{ 62 response.getWriter().write("session已經存在,設置的sessionId是:" + sessionId ); 63 } 64 //設置對象銷毀時間,時間粒度為分鐘 65 httpSession.setMaxInactiveInterval(1); 66 } 67 68 }