Java web會話簡單應用,javaweb會話
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 CookieDemo13 */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 CookieTest13 */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 stub24 }25 26 /**27 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)28 */29 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {30 31 //將CookieObject Storage Service到數組中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 HttpSessionDemo15 */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 stub26 }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 stub33 //設定編碼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 id41 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中所有的name52 String name = (String)attributeNames.nextElement();53 //找出name對應的value54 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 }