淺談Servlet的Cookie和Session機制
一、Servlet Cookies
Cookies定義:Cookies是存儲在客戶端計算機上的文本文件,並保留瞭用戶的各種跟蹤信息。
Cookies作用:會話保持,如完成用戶的登錄與狀態保持
Cookies的工作原理:
客戶端向服務區發起登錄請求
服務器腳本(代碼)向瀏覽器發送一組Cookies,例如:姓名,年齡等
瀏覽器將這些信息存儲在本地計算機上,以備將來使用
當下一次瀏覽器向web服務器發送任何請求時。瀏覽器會把這些Cookies信息發送到服務器,服務器將使用這些信息來識別賬戶
1.1 Cookies構成
Cookies通常設置在HTTP頭信息中,設置Cookie的http請求,會向Servlet發送如下信息
- Set-Cookie頭包含瞭一個名稱值對,一個GMT日期,一個路徑和一個域,名稱和值都會被URL編碼
- expires字段是一個命令,告訴瀏覽器在給定的時間和日期之後過去(“忘記”)該Cookie
- 如果瀏覽器被配置為存儲Cookies,他將會保留此信息知道到期日期
如果用戶端的瀏覽器指向任何匹配該Cookie的路徑和域的頁面,他會重新發送Cookie到服務器,瀏覽器的頭信息可能會如下:
此時Servlet就能夠通過請求方法request.getCookies()訪問Cookie,該方法將返回一個Cookie對象的數組
1.2 Servlet操作Cookie方法
1.3 代碼示例:
具體步驟,創建兩個後端類,分別為:
- 設置cookie信息
- 獲取cookie信息
設置cookie信息代碼
import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; public class SetCookieServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1.創建Cookie對象 //首先需要一個cookie對象,這裡我們需要兩個cookie對象,一個來存儲用戶名(username——java),一個來存儲密碼(pwd——javas) Cookie username = new Cookie("uesrname","java"); Cookie pwd = new Cookie("pwd","javas"); //當我們創建好兩個cookie對象之後,就可以對這兩個對象進行一系列操作 //比如:設置他的過期時間,這裡我們將username的過期時間設置為永久 username.setMaxAge(-1); //密碼pwd的過期時間設置為一分鐘,註意他的過期時間是以秒為單位 pwd.setMaxAge(60); //2.將 Cookie 對象關聯到response上 resp.addCookie(username); resp.addCookie(pwd); //顯示給用戶部分的信息 resp.setCharacterEncoding("utf-8"); resp.setContentType("text/html"); //然後寫入響應給客戶端的內容 PrintWriter writer = resp.getWriter(); writer.println("<h1>Cookie 設置成功</h1>"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req, resp); } }
註意:一定不要忘記配置web.xml文件
結果驗證:
獲取cookie信息代碼
import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; public class GetCookieServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //讀取Cookie的信息 //因為客戶端的cookie可能會有多個,所以我們使用數組來接收,註意:cookie是從request獲取的 Cookie[] cookies = req.getCookies(); resp.setContentType("text/html"); resp.setCharacterEncoding("utf-8"); PrintWriter writer = resp.getWriter(); //然後讀取cookie的內容 for (Cookie item: cookies ) { writer.println(String.format("<h1>Cookie key: %s,Cookie value: %s</h1>",item.getName(),item.getValue())); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req, resp); } }
註意:
1.不要忘記配置web.xml文件
2.因為上面我們設置cookie信息的時候,pwd的過期時間為一分鐘,當我們要去獲取cookie信息的時候就看時間不夠,所以建議修改更長的過期時間。
1.4 驗證結果
二、Servlet Session
Session定義:session是存儲在服務器上的文本文件,並保留用戶的各種跟蹤信息
Session作用:會話保持,如完成用戶的登錄與狀態保持,因為在服務器端,所以相對安全一些。
Session在Servlet裡的存儲形式
2.1 Servlet操作session方法
session是借助cookie實現的
HttpSession對象
- Servlet提供瞭HttpSession接口,該接口提供瞭一種跨多個頁面請求或訪問網站時識別用戶以及存儲有關用戶信息的方式
- Servlet容器使用這個接口來創建一個HTTP客戶端和HTTP服務器之間的session會話,會話持續一個指定的時間段。跨多個連接或頁面請求
- 可以通過調用HttpServletRequest的公共方法 getSession() 來獲取 HttpSession對象(如:HttpSession session = request.getSession()),需要在向客戶端發送任何文檔內容之前調用 request.getSession()
HttpSession 對象中可用的幾個重要的方法:
小知識點:session都是通過request進行操作,而cookie是通過request和response進行操作。
2.2 代碼示例
關於session的讀寫操作代碼
import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; import java.io.PrintWriter; import java.util.Date; public class SessionServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //關於 session 的讀寫 //1.先獲取到session到對象 HttpSession session = req.getSession(); //2.得到session的屬性 //2.1獲取到session的ID String sessionID = session.getId(); //返回響應信息 resp.setContentType("text/html"); resp.setCharacterEncoding("utf-8"); PrintWriter writer = resp.getWriter(); writer.println("<h1>歡迎訪問頁面</h1>"); //輸出sessionID writer.println(String.format("<h3>SessionID : %s </h3>",sessionID)); //輸出session的創建時間,因為session的創建時間是一個時間戳,所以我們需要將其強轉成我們能看得懂的時間 writer.println(String.format("<h3>Session創建時間: %s</h3>",new Date(session.getCreationTime()))); //輸出session的最後訪問時間 writer.println(String.format("<h3>Session的最後訪問時間: %S</h3>",new Date(session.getLastAccessedTime()))); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req, resp); } }
2.3 驗證結果
到此這篇關於淺談Servlet的Cookie和Session機制的文章就介紹到這瞭,更多相關Servlet的Cookie和Session內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Java Session會話追蹤原理深入分析
- Java中Session的詳解
- Javaweb會話跟蹤技術Cookie和Session的具體使用
- Java中Servlet的生命周期詳解
- 基於Cookie與Session的Servlet API會話管理操作