淺談Servlet的Cookie和Session機(jī)制
一、Servlet Cookies
Cookies定義:Cookies是存儲(chǔ)在客戶端計(jì)算機(jī)上的文本文件,并保留了用戶的各種跟蹤信息。
Cookies作用:會(huì)話保持,如完成用戶的登錄與狀態(tài)保持
Cookies的工作原理:
客戶端向服務(wù)區(qū)發(fā)起登錄請(qǐng)求
服務(wù)器腳本(代碼)向?yàn)g覽器發(fā)送一組Cookies,例如:姓名,年齡等
瀏覽器將這些信息存儲(chǔ)在本地計(jì)算機(jī)上,以備將來(lái)使用
當(dāng)下一次瀏覽器向web服務(wù)器發(fā)送任何請(qǐng)求時(shí)。瀏覽器會(huì)把這些Cookies信息發(fā)送到服務(wù)器,服務(wù)器將使用這些信息來(lái)識(shí)別賬戶
1.1 Cookies構(gòu)成
Cookies通常設(shè)置在HTTP頭信息中,設(shè)置Cookie的http請(qǐng)求,會(huì)向Servlet發(fā)送如下信息
- Set-Cookie頭包含了一個(gè)名稱值對(duì),一個(gè)GMT日期,一個(gè)路徑和一個(gè)域,名稱和值都會(huì)被URL編碼
- expires字段是一個(gè)命令,告訴瀏覽器在給定的時(shí)間和日期之后過(guò)去(“忘記”)該Cookie
- 如果瀏覽器被配置為存儲(chǔ)Cookies,他將會(huì)保留此信息知道到期日期
如果用戶端的瀏覽器指向任何匹配該Cookie的路徑和域的頁(yè)面,他會(huì)重新發(fā)送Cookie到服務(wù)器,瀏覽器的頭信息可能會(huì)如下:
此時(shí)Servlet就能夠通過(guò)請(qǐng)求方法request.getCookies()訪問(wèn)Cookie,該方法將返回一個(gè)Cookie對(duì)象的數(shù)組
1.2 Servlet操作Cookie方法
1.3 代碼示例:
具體步驟,創(chuàng)建兩個(gè)后端類,分別為:
- 設(shè)置cookie信息
- 獲取cookie信息
設(shè)置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.創(chuàng)建Cookie對(duì)象 //首先需要一個(gè)cookie對(duì)象,這里我們需要兩個(gè)cookie對(duì)象,一個(gè)來(lái)存儲(chǔ)用戶名(username——java),一個(gè)來(lái)存儲(chǔ)密碼(pwd——javas) Cookie username = new Cookie("uesrname","java"); Cookie pwd = new Cookie("pwd","javas"); //當(dāng)我們創(chuàng)建好兩個(gè)cookie對(duì)象之后,就可以對(duì)這兩個(gè)對(duì)象進(jìn)行一系列操作 //比如:設(shè)置他的過(guò)期時(shí)間,這里我們將username的過(guò)期時(shí)間設(shè)置為永久 username.setMaxAge(-1); //密碼pwd的過(guò)期時(shí)間設(shè)置為一分鐘,注意他的過(guò)期時(shí)間是以秒為單位 pwd.setMaxAge(60); //2.將 Cookie 對(duì)象關(guān)聯(lián)到response上 resp.addCookie(username); resp.addCookie(pwd); //顯示給用戶部分的信息 resp.setCharacterEncoding("utf-8"); resp.setContentType("text/html"); //然后寫(xiě)入響應(yīng)給客戶端的內(nèi)容 PrintWriter writer = resp.getWriter(); writer.println("<h1>Cookie 設(shè)置成功</h1>"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req, resp); } }
注意:一定不要忘記配置web.xml文件
結(jié)果驗(yàn)證:
獲取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的信息 //因?yàn)榭蛻舳说腸ookie可能會(huì)有多個(gè),所以我們使用數(shù)組來(lái)接收,注意:cookie是從request獲取的 Cookie[] cookies = req.getCookies(); resp.setContentType("text/html"); resp.setCharacterEncoding("utf-8"); PrintWriter writer = resp.getWriter(); //然后讀取cookie的內(nèi)容 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.因?yàn)樯厦嫖覀冊(cè)O(shè)置cookie信息的時(shí)候,pwd的過(guò)期時(shí)間為一分鐘,當(dāng)我們要去獲取cookie信息的時(shí)候就看時(shí)間不夠,所以建議修改更長(zhǎng)的過(guò)期時(shí)間。
1.4 驗(yàn)證結(jié)果
二、Servlet Session
Session定義:session是存儲(chǔ)在服務(wù)器上的文本文件,并保留用戶的各種跟蹤信息
Session作用:會(huì)話保持,如完成用戶的登錄與狀態(tài)保持,因?yàn)樵诜?wù)器端,所以相對(duì)安全一些。
Session在Servlet里的存儲(chǔ)形式
2.1 Servlet操作session方法
session是借助cookie實(shí)現(xiàn)的
HttpSession對(duì)象
- Servlet提供了HttpSession接口,該接口提供了一種跨多個(gè)頁(yè)面請(qǐng)求或訪問(wèn)網(wǎng)站時(shí)識(shí)別用戶以及存儲(chǔ)有關(guān)用戶信息的方式
- Servlet容器使用這個(gè)接口來(lái)創(chuàng)建一個(gè)HTTP客戶端和HTTP服務(wù)器之間的session會(huì)話,會(huì)話持續(xù)一個(gè)指定的時(shí)間段??缍鄠€(gè)連接或頁(yè)面請(qǐng)求
- 可以通過(guò)調(diào)用HttpServletRequest的公共方法 getSession() 來(lái)獲取 HttpSession對(duì)象(如:HttpSession session = request.getSession()),需要在向客戶端發(fā)送任何文檔內(nèi)容之前調(diào)用 request.getSession()
HttpSession 對(duì)象中可用的幾個(gè)重要的方法:
小知識(shí)點(diǎn):session都是通過(guò)request進(jìn)行操作,而cookie是通過(guò)request和response進(jìn)行操作。
2.2 代碼示例
關(guān)于session的讀寫(xiě)操作代碼
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 { //關(guān)于 session 的讀寫(xiě) //1.先獲取到session到對(duì)象 HttpSession session = req.getSession(); //2.得到session的屬性 //2.1獲取到session的ID String sessionID = session.getId(); //返回響應(yīng)信息 resp.setContentType("text/html"); resp.setCharacterEncoding("utf-8"); PrintWriter writer = resp.getWriter(); writer.println("<h1>歡迎訪問(wèn)頁(yè)面</h1>"); //輸出sessionID writer.println(String.format("<h3>SessionID : %s </h3>",sessionID)); //輸出session的創(chuàng)建時(shí)間,因?yàn)閟ession的創(chuàng)建時(shí)間是一個(gè)時(shí)間戳,所以我們需要將其強(qiáng)轉(zhuǎn)成我們能看得懂的時(shí)間 writer.println(String.format("<h3>Session創(chuàng)建時(shí)間: %s</h3>",new Date(session.getCreationTime()))); //輸出session的最后訪問(wèn)時(shí)間 writer.println(String.format("<h3>Session的最后訪問(wèn)時(shí)間: %S</h3>",new Date(session.getLastAccessedTime()))); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req, resp); } }
2.3 驗(yàn)證結(jié)果
到此這篇關(guān)于淺談Servlet的Cookie和Session機(jī)制的文章就介紹到這了,更多相關(guān)Servlet的Cookie和Session內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 詳解Struts2中Action訪問(wèn)Servlet API的幾種方法
- Action訪問(wèn)Servlet的API的簡(jiǎn)單實(shí)例
- SpringBoot項(xiàng)目找不到j(luò)avax.servlet.Filter的問(wèn)題及解決
- Servlet連接數(shù)據(jù)庫(kù)實(shí)現(xiàn)用戶登錄的實(shí)現(xiàn)示例
- SpringBoot詳細(xì)講解異步任務(wù)如何獲取HttpServletRequest
- JavaWeb之Servlet注冊(cè)頁(yè)面的實(shí)現(xiàn)示例
- 基于Cookie與Session的Servlet?API會(huì)話管理操作
相關(guān)文章
使用try-with-resource的輸入輸出流自動(dòng)關(guān)閉
這篇文章主要介紹了使用try-with-resource的輸入輸出流自動(dòng)關(guān)閉方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07IDEA快速部署Spring?Boot?項(xiàng)目到Docker的實(shí)現(xiàn)方法
本文主要介紹了IDEA快速部署Spring?Boot?項(xiàng)目到Docker的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07Java Spring MVC獲取請(qǐng)求數(shù)據(jù)詳解操作
Spring MVC 是 Spring 提供的一個(gè)基于 MVC 設(shè)計(jì)模式的輕量級(jí) Web 開(kāi)發(fā)框架,本質(zhì)上相當(dāng)于 Servlet,Spring MVC 角色劃分清晰,分工明細(xì)。由于 Spring MVC 本身就是 Spring 框架的一部分,可以說(shuō)和 Spring 框架是無(wú)縫集成2021-11-11MyBatis自定義TypeHandler如何解決字段映射問(wèn)題
這篇文章主要介紹了MyBatis自定義TypeHandler如何解決字段映射問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12教你如何用Jenkins自動(dòng)化部署項(xiàng)目(從零到搭建完成)
這篇文章主要介紹了教你如何用Jenkins自動(dòng)化部署項(xiàng)目(從零到搭建完成),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10Java StringBuffer類與StringBuilder類用法實(shí)例小結(jié)
這篇文章主要介紹了Java StringBuffer類與StringBuilder類用法,結(jié)合實(shí)例形式總結(jié)分析了Java StringBuffer類與StringBuilder類的功能、原理及添加、刪除、替換、截取等操作實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-03-03使用SpringBoot的CommandLineRunner遇到的坑及解決
這篇文章主要介紹了使用SpringBoot的CommandLineRunner遇到的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02java 方法重寫(xiě)與權(quán)限修飾符以及多態(tài)和抽象類詳解概念和用法
重寫(xiě)是子類對(duì)父類的允許訪問(wèn)的方法的實(shí)現(xiàn)過(guò)程進(jìn)行重新編寫(xiě), 返回值和形參都不能改變。即外殼不變,核心重寫(xiě),權(quán)限修飾符用于控制被修飾變量、方法、類的可見(jiàn)范圍,說(shuō)明了面向?qū)ο蟮姆庋b性,所以我們要適用他們盡可能的讓權(quán)限降到最低,從而安全性提高2021-10-10