前言
在 Web 應用程式中(通俗點,可以理解成一個網站),Session 和 Cookie 是兩個非常重要的概念,主要用于實作用戶身份認證、資料傳遞等功能,今天就來講講這兩個東西,
對于當時剛開始接觸到這兩個概念的我來說,這兩個東西是非常模糊的,當然,這樣也和我自己 Java 基礎不牢固有關,導致在學習 Java Web 的程序中,埋下了許多地雷,現如今,從新梳理下,希望能給螢屏前的你帶來識訓,
本篇文章目標人群是學了后忘了的,學了后想要鞏固的,當然,還沒學,那就更好啦,直接看這一篇就夠了!
Session 的概念
Session 是 Web 應用程式中的一種會話管理機制,用于存盤和維護用戶的會話狀態,
那問題來了,什么是「會話」?
會話是指在用戶與服務器之間的一系列請求和回應之間的互動程序,
當用戶訪問 Web 應用時,服務器會創建一個唯一的會話 ID,并將其存盤在用戶的瀏覽器中的 Cookie 中,在接下來的請求中,瀏覽器會將會話 ID 作為引數發送給服務器,以便服務器可以識別用戶并將其請求與之前的請求相關聯,
為什么會有 Session?
由于 HTTP 協議是無狀態的,當用戶在網站中進行多次請求,服務器并不能判斷這些請求是不是來自同一用戶,所以出現了一種技術,這種技術稱為「會話跟蹤技術」,
會話跟蹤技術就能解決這個問題,與無狀態的通信相比,會話是一種有狀態的通信,這種通信至少需要一方來維護當前的狀態資訊和歷史資訊,
而 Session 就是其中一種會話跟蹤技術,當然,后面說的 Cookie 也是,
,并將 Session ID 存盤在 Cookie 中或者 URL 引數中,
Session 的原理
Session 的原理是基于服務器端的存盤和管理,因此相對來說比較安全,在用戶訪問 Web 應用程式時,服務器會為每個用戶創建一個唯一的 Session ID,服務器會將 Session ID 和對應的會話狀態存盤在記憶體或者資料庫中,同時也回傳一份 Session ID 給瀏覽器,讓瀏覽器存盤在 Cookie 中,并在一定時間內保持有效,當用戶進行后續的請求時,服務器會根據 Session ID 來識別用戶,并獲取和維護用戶的會話狀態,最后,當用戶關閉瀏覽器或者超過一定時間沒有活動時,服務器會自動銷毀對應的 Session,
Session 的優點是安全性相對較高,存盤容量可以存盤任意資料型別,并且可以設定失效時間,但是它也存在一些缺點:
- 存盤在服務器端,需要占用服務器資源(比如記憶體資源)
- 失效時間短,一般只有數分鐘或數小時
- 難以跨域共享,不同域名的服務器無法共享 Session
代碼如何寫?
那服務器這邊是怎樣去存盤和管理的呢?代碼是怎樣寫的呢?
在 Java Web 中,可以使用 Servlet API 中封裝好的 Session 物件(HttpSession)來進行操作,
在Servlet API中,HttpSession 由 Servlet容器(比如 Tomcat)創建,它可以存盤任意的 Java 物件,我們可以通過 setAttribute()
方法將物件系結到 Session 中,之后通過 getAttribute()
方法獲取系結在 Session 中的物件,
也就是說,可以在一次會話的多次請求間共享資料,將資料保存在服務器端的物件中,
- 獲取 Session 物件
我們可以通過 HttpServletRequest 的 getSession() 方法來獲取 HttpSession 物件,如果 HttpSession 物件不存在,則會創建一個新的 Session 物件,
Session 常用方法
以下是一些常用的 Session 物件的方法:
-
setAttribute(String name, Object value)
:將一個名為 name,值為 value 的物件系結到 Session 中, -
getAttribute(String name)
:獲取 Session 中系結的名為 name 的物件, -
removeAttribute(String name)
:從 Session 中洗掉名為 name 的物件, -
getId()
:獲取 Session 的唯一識別符號, -
getCreationTime()
:獲取 Session 的創建時間, -
getLastAccessedTime()
:獲取 Session 的最后訪問時間, -
setMaxInactiveInterval(int interval)
:設定 Session 的最大不活動時間間隔,單位為秒, -
getMaxInactiveInterval()
:獲取 Session 的最大不活動時間間隔,
示例代碼:
SessionServlet
:
@WebServlet(name = "SessionServlet", urlPatterns = "/session")
public class SessionServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 獲取 Session 物件
HttpSession session = req.getSession();
// 將用戶名存盤到 Session 中
session.setAttribute("username", req.getParameter("username"));
// 重定向到另一個頁面
resp.sendRedirect("anotherPage.jsp");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
這里使用了 @WebServlet
來配置這個 Servlet,處理的請求映射的路徑為 /session
,主要進行了 Session 物件的相關操作,存盤了用戶資訊,重定向到另一個頁面,通過 Session,此時在另一個頁面,就能夠獲取到存盤的資訊,
anotherPage.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page session="true" %>
<html>
<head>
<title>這里是有Session的</title>
</head>
<body>
<%
String username = (String) session.getAttribute("username");
%>
<h2>從Session中獲取的資訊:<%=username%></h2>
</body>
</html>
生成唯一 ID 回傳給瀏覽器
@WebServlet(name = "SessionIdServlet", urlPatterns = "/sessionId")
public class SessionIdServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
// 獲取 SessionID
String sessionId = session.getId();
// 創建名為JSESSIONID的 Cookie
Cookie cookie = new Cookie("JSESSIONID", sessionId);
// 設定 Cookie 效時間為30分鐘
cookie.setMaxAge(30 * 60);
// 將 Cookie 追加到回應中回傳給瀏覽器
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
通過瀏覽器向這個路徑 /sessionId
發起請求,就會接收到服務器回傳的回應,這里的回應就有我們進行處理的名為 JSESSIONID 的 Cookie
Cookie 的概念
Cookie 和 Session 總是會被拿來比較的,Cookie 和 Session 都是用來跟蹤瀏覽器用戶身份的會話技術,或者說一種機制,它們都可以實作在多個頁面之間共享用戶的狀態,
Cookie 的原理
Cookie 是一種在客戶端(瀏覽器)保存資料的機制,
瀏覽器第一次發送請求到服務器,服務器就創建 Cookie(上面的代碼中我們寫了),該 Cookie 中包含著資訊,可以是用戶的資訊(用戶偏好設定、廣告偏好),然將該 Cookie 發送到瀏覽器,
瀏覽器之后再次訪問服務器時就會攜帶服務器創建的 Cookie,這不需要我們做任何操作,不需要寫任何代碼,瀏覽器幫我們實作了在每一次的請求中都攜帶上 Cookie,服務器端通過 Cookie 中攜帶的資料區分不同的用戶,
Cookie 的優點是可以長時間保存,并且可以在客戶端設定,但是它也存在一些缺點:
- 安全性相對較差,容易被不法分子獲取
- 存盤容量有限,一般只能存盤 ASCII 碼
- 失效時間可以設定,但是客戶端可以隨時清除 Cookie
總結
Session 是一種服務器端的存盤機制,它將用戶狀態資訊存盤在服務器上,每個用戶都有一個獨立的 Session,
在用戶第一次訪問服務器的時候,服務器會為其創建一個 Session,并將 Session ID 放到一個名為 JSESSIONID 的 Cookie 中發送給瀏覽器,
Cookie 是一種客戶端(瀏覽器)存盤機制,它將用戶狀態資訊存盤在客戶端瀏覽器上,我們知道,用戶第一次訪問服務器的時候,服務器會將一些資料(比如 JSESSIONID)寫入 Cookie 并發送給客戶端,客戶端在后續的請求中會將 Cookie 發送給服務器,
在存盤容量方面,Cookie 的存盤容量較小,一般只能存盤 ASCII 碼,而 Session 可以存盤任意資料型別,在安全性方面,Session 相對于 Cookie 更加安全,因為 Session 存盤在服務器,客戶端無法直接訪問,在跨域共享方面,Cookie 可以跨域共享,而 Session 只能在同一域名下共享,
最后的最后
由本人水平所限,難免有錯誤以及不足之處, 螢屏前的靚仔靚女們
如有發現,懇請指出!
最后,謝謝你看到這里,謝謝你認真對待我的努力,希望這篇博客對你有所幫助!
你輕輕地點了個贊,那將在我的心里世界增添一顆明亮而耀眼的星!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/546420.html
標籤:Java
上一篇:day05-功能實作04
下一篇:php之配置和選擇工具