會話管理

羊咩咩a284811發表於2021-01-04
會話管理技術
會話管理: 管理瀏覽器與伺服器之間的會話過程中產生的會話資料。 Cookie技術:會話資料儲存在瀏覽器端。 Session技術: 會話資料儲存在伺服器端。
Cookie技術

Cookie技術的使用
Cookie物件:步驟
(1)建立Cookie物件,用於儲存會話資料
new Cookie(java.lang.String name, java.lang.String value)
(2)修改Cookie物件
void setPath(java.lang.String uri)
void setMaxAge(int expiry)
void setValue(java.lang.String newValue)
(3)把cookie資料傳送給瀏覽器儲存
response.addCookie(cookie);
(4)瀏覽器帶著cookie訪問伺服器,伺服器接收cookie資訊
request.getCookies();
非簡化版本:

package cn.web001;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletCookie extends HttpServlet {
	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//建立Cookie物件,儲存會話資料
		Cookie cookie = new Cookie("name","miemie");
		//把cookie資料傳送給瀏覽器儲存,通過響應頭攜帶cookie資料給瀏覽器(set-cookie)
		response.setHeader("set-cookie", "name=miemie");
		//瀏覽器在下次訪問的時候攜帶了cookie資料,通過請求頭髮送給伺服器(cookie)
		//伺服器獲取瀏覽器傳送的cookie資料
		String header = response.getHeader("name");
		System.out.println(header);
	}
	

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
	}

}

在這裡插入圖片描述
在這裡插入圖片描述
簡化版本(物件導向)

package cn.web001;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletCookie extends HttpServlet {
	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//建立Cookie物件,儲存會話資料
		Cookie cookie = new Cookie("name","miemie");
		//把cookie資料傳送給瀏覽器儲存,通過響應頭攜帶cookie資料給瀏覽器(set-cookie)
		//response.setHeader("set-cookie", "name=miemie");
		response.addCookie(cookie);
		//瀏覽器在下次訪問的時候攜帶了cookie資料,通過請求頭髮送給伺服器(cookie)
		//伺服器獲取瀏覽器傳送的cookie資料
		//String header = response.getHeader("name");
		//System.out.println(header);
		//簡化版本
		Cookie[] cookies = request.getCookies();
		if(cookies!=null) {
		    for(Cookie cookie1:cookies) {
				String name= cookie1.getName();
				String value = cookie1.getValue();
				System.out.println(name+"="+value);
			}
		}else {
			System.out.println("nullcookie");
		}
	}
	

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
	}

}

在這裡插入圖片描述

Cookie技術原理

(1)伺服器建立Cookie物件,儲存會話資料,把Cookie資料傳送給瀏覽器
response.addCookie(cookie); (響應頭:set-cookie: name=jacky)
(2)瀏覽器獲取cookie資料,儲存在瀏覽器快取區,然後在下次訪問伺服器時攜帶cookie資料
(請求頭: cookie: name=jacky)
(3)伺服器獲取瀏覽器傳送的cookie資料
request.getCookies();

Cookie細節

(1)cookie的資料型別一定是字串,如果要傳送中文,必須先對中文進行URL加密才可以傳送。
(2)setPath(path): 修改cookie所在的有效路徑。 如果把該cookie設定到某個有效路徑下,然後當瀏覽器訪問這個有效路徑的時候,才會攜帶cookie資料給伺服器。
(3) setMaxAge(整數) : 設定cookie的有效時間
正整數: 表示超過了正整數的數值的時間,cookie就會丟失(cookie儲存瀏覽器的快取。 目錄)單位:秒
負整數: 表示如果瀏覽器關閉了,cookie就會丟失(cookie儲存瀏覽器記憶體)。
0 : 表示刪除同名的cookie 。
(4)cookie可以有多個,但是瀏覽器一般只允許存放300個Cookie,每個站點最多存放20個Cookie,每個Cookie的大小限制為4KB。

Session技術

Cookie特點:
1)會話資料放在瀏覽器端
2)資料型別只能string,而且有大小限制的
3)相對資料存放不安全。

Session特點:
1)會話資料放在伺服器端(伺服器記憶體),佔用伺服器資源
2)資料型別任意型別,沒有大小限制的。
3)相對安全

Session使用步驟

HttpSession物件:
1)建立HttpSession物件,用於儲存會話資料
session = request.getSession(); 建立或獲取session物件
2)修改HttpSession物件
void setMaxInactiveInterval(int interval) 設定session物件的有效時間
void invalidate() 手動銷燬session物件
3)儲存會話資料(作為域物件)
session.setAttribute(“name”,Object); 儲存資料
session.getAttribute(“name”) 獲取資料
session.removeAttribute(“name”) 刪除資料
在這裡插入圖片描述

Session原理

可以從session物件取出資料必須是存放資料的sessinon物件。
HttpSession session = request.getSession();含義((1)-(6))
(1)伺服器建立Session物件,伺服器會給這個session物件分配一個唯一的標記JSESSIONID。
(2)把JSESSIONID作為Cookie傳送給瀏覽器。
(3)瀏覽器得到JSESSIONID儲存下來,在下次訪問時攜帶這個JSESSIONID去訪問伺服器。
(4)伺服器得到JSESSIONID,在伺服器記憶體中搜尋是否存在指定JSSESSINOID的session物件。
(5)如果找到,則返回這個session物件。
(6)如果找不到,可能直接返回null,或者再建立新的session物件。

結論: 通過JSESSIONID在伺服器中查詢對應的session物件。

Session細節

1.setMaxInactiveInterval(秒數): 設定session物件的有效時間
注意:不是瀏覽器關閉,session物件就銷燬。
預設情況: 等待30分鐘空閒時間,session物件才會銷燬。
session.setMaxInactiveInterval(20);

<!-- 設定全域性的session物件的過期時間 (分鐘)-->
	<session-config>
		<session-timeout>1</session-timeout>
	</session-config>

2.可以讓JSESSIONID不會隨著瀏覽器關閉而丟失

/**
* 設定JSESSIONID的時間,不會隨著瀏覽器關閉而丟失。
*/
		Cookie c = new Cookie("JSESSIONID",session.getId());
		c.setMaxAge(1*30*24*60*60);//1個月
		response.addCookie(c);

3.直接手動銷燬sessino物件
invalidate();
4.建立或得到session物件
request.getSession() / request.getSession(true)
建立或得到session物件。查詢session物件,如果沒有sessino物件,則建立新的session物件。

//建立或得到session物件
		HttpSession session = 
				request.getSession(true);

request.getSession(false)
得到session物件。查詢session物件,如果沒有session物件,直接返回null。

	//得到session物件
		HttpSession session = 
					request.getSession(false);
		
		if(session==null){
			System.out.println("沒有session物件");
		}else{
			//獲取會話資料
			String name = 
					(String)session.getAttribute("name");
			System.out.println("name="+name);
		}

總結:
會話管理: 瀏覽器與伺服器之間會話過程中產生的會話資料

Cookie技術:會話資料儲存在瀏覽器
核心的API:
(1)建立Cookie物件
Cookie c = new Cookie(“name”,“value”)
(2)傳送給瀏覽器
respone.addCookie©;
(3)瀏覽器傳送cookie給伺服器,伺服器接收cookie
Cookie[] cookies = request.getCookies()

Session技術: 會話資料儲存在伺服器(記憶體中)
核心API:
(1)建立或得到HttpSession物件
HttpSession session = request.getSession(true) 建立或得到
HttpSession session = request.getSession(false) 得到
(2)使用HttpSession儲存和獲取,刪除會話資料
session.setAttribure(“name”,Object);
session.getAttribute(“name”);
session.removeAttrbute(“name”);

相關文章