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 }