查詢有道詞典得:html
web和餅乾有啥關係?java
這個謎底等等來爲你們揭曉web
web中的會話技術相似於生活中兩我的聊天,不過web中的會話指的是服務器與客戶端的交互數組
一次會話中包含屢次的請求與響應,當瀏覽器給服務器發送請求時會話創建,直到一方斷開時會話結束。
功能:在一次會話的範圍內的屢次請求之間,能夠共享數據
這句話是什麼意思呢,我用購物車來解釋
瀏覽器
1.在瀏覽器中,常常涉及到數據交換,如:你登陸一個頁面。咱們常常會設置自動登陸選項。那麼它們就是經過cookie來記住咱們的信息的, cookie是由HTTP服務器社長子的,保存在瀏覽器中,但HTTP協議是一種無狀態協議,在數據交換完畢後,服務端和客戶端的連接就會關閉,每次交換數據都須要創建新的連接。就像咱們去超市買東西,沒有積分卡的狀況下,咱們買完東西以後,超市沒有咱們任何的消費信息,但咱們辦了積分卡以後,超市就有了咱們的消費信息。cookie就像是積分卡,能夠保存積分,商品就是咱們的信息,超市的系統就像服務器後臺,HTTP協議就是交易的過程。tomcat
2.如今上許多網站都用新用戶註冊這一項,有時註冊一下,等到下次在訪問該站點時,會自動識別到你,並貼向你問好,是否是以爲很親切?固然這種做用知識表面現象,更重要的是,網站能夠利用Cookie跟蹤統計用戶訪問該網站的習慣,好比什麼時間訪問,訪問了哪些頁面,在每一個網頁的停留時間等。利用這些信息,一方面是能夠爲用戶提供個性化服務,另外一方面,也能夠做爲了解全部用戶行爲的工具,對於網站經營策略的改進有必定參考價值。例如,你在某家航空公司站點查閱航班時刻表,該站點可能就建立了包含你旅行計劃的Cookies,也可能它只記錄了你在該站點上曾經訪問過的Web頁,在你下次訪問時,網站根據你的狀況對顯示的內容進行調整,將你所感興趣的內容放在前列。這是高級的COokie應用。服務器
是一種客戶端會話技術將數據保存到客戶端cookie
cookie的利弊:
1.將數據保存到客戶端,十分方便,同時減輕服務器存儲壓力
2.對保存數據的個數(20)及大小有限制(4kb)java-web
做用
cookie用來保存少許及不太敏感的數據
能夠在不登入的狀況下,對客戶端完成身份識別(即在客戶端設置一個set-cookie的鍵值對,在訪問的時候使用鍵值對來獲取客戶端的身份)ide
我從如下三個步驟來介紹cookie的使用
1.建立cookie對象
2.發送cookie對象
3.獲取cookie對象
由Servlet1設置cookie,Servlet2獲取cookie
Servlet1
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; import java.io.IOException; @WebServlet("/demo1") public class Servlet1 extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //建立cookie Cookie cookie = new Cookie("name", "zhangsan"); resp.addCookie(cookie); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doPost(req, resp); } }
Servlet2
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; import java.io.IOException; @WebServlet("/demo2") public class Servlet2 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //獲取cookie Cookie[] cookies = req.getCookies(); if (cookies!=null){ for (Cookie cookie : cookies) { //獲取cookie值與名稱 String value = cookie.getValue(); String name = cookie.getName(); System.out.println(name+":"+value); } } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req, resp); } }
響應cookie
請求cookie,另外兩個cookie咱們這裏不作介紹
圖解:
1.如何實現發送多個Cookie
2.Cookie能夠在瀏覽器中保存多長時間
3.Cookie如何保存中文
4.Cookie共享問題
使用response對象調用addCookie方法發送cookie便可
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; import java.io.IOException; @WebServlet("/demo1") public class Servlet1 extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //建立cookie //建立第一個cookie Cookie cookie = new Cookie("name", "zhangsan"); //發送第一個cookie resp.addCookie(cookie); //建立第二個cookie Cookie id = new Cookie("id", "1"); //發送第二個cookie resp.addCookie(id); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doPost(req, resp); } }
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; import java.io.IOException; @WebServlet("/demo2") public class Servlet2 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //獲取cookie Cookie[] cookies = req.getCookies(); //遍歷cookie數組 if (cookies!=null){ for (Cookie cookie : cookies) { //獲取cookie值與名稱 String value = cookie.getValue(); String name = cookie.getName(); System.out.println(name+":"+value); } } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req, resp); } }
客戶端顯示
IDEA打印
2.Cookie能夠在瀏覽器中保存多長時間
默認狀況下瀏覽器關閉後,Cookie數據被銷燬
咱們能夠調用setmaxage(int seconds)方法來設置Cookie的存儲時間
1.second爲正數,將Cookie持久化寫入硬盤,而且指定存儲的時間,時間到了cookie自動失效
2.second爲零,刪除cookie
3.second小於零,默認值,即瀏覽器關閉後刪除cookie
好比我使用如下代碼往Cookie中加入數據發送cookie瀏覽器就會報錯,由於往cookie中加入了空格
Cookie cookie = new Cookie("name", "張 三"); //發送第一個cookie resp.addCookie(cookie);
因此我須要使用url編碼來控制數據
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; import java.io.IOException; import java.net.URLDecoder; import java.net.URLEncoder; @WebServlet("/demo1") public class Servlet1 extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //設置響應的消息體的數據格式以及編碼 resp.setContentType("text/html;charset=utf-8"); //建立cookie //建立第一個cookie String name="張 三"; //URL編碼 name= URLEncoder.encode(name,"utf-8"); Cookie cookie = new Cookie("name", name); resp.addCookie(cookie); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doPost(req, resp); } }
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; import java.io.IOException; import java.net.URLDecoder; @WebServlet("/demo2") public class Servlet2 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //獲取cookie Cookie[] cookies = req.getCookies(); //遍歷cookie數組 if (cookies!=null){ for (Cookie cookie : cookies) { //獲取cookie值與名稱 String value = cookie.getValue(); String name = cookie.getName(); //解碼前 System.out.println(name+":"+value); //解碼後 System.out.println(name+":"+ URLDecoder.decode(value,"utf-8")); } } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req, resp); } }
結果:
再也不報錯
1.假設在一個Tomcat服務器中部署了多個web項目,如何實現cookie在這些項目中的共享
默認狀況下是不能夠共享的
可是咱們能夠調用setpath()方法來設置cookie的獲取範圍默認狀況下,設置當前的虛擬目錄 * 若是要共享,則能夠將path設置爲"/"
//設置響應的消息體的數據格式以及編碼 resp.setContentType("text/html;charset=utf-8"); //建立cookie //建立第一個cookie String name="張 三"; //URL編碼 name= URLEncoder.encode(name,"utf-8"); Cookie cookie = new Cookie("name", name); //設置path讓當前服務器下部署的全部項目共享cookie的信息 //設置爲」/「便可共享 cookie.setPath("/"); resp.addCookie(cookie);
//設置響應的消息體的數據格式以及編碼 resp.setContentType("text/html;charset=utf-8"); //建立cookie //建立第一個cookie String name="張 三"; //URL編碼 name= URLEncoder.encode(name,"utf-8"); Cookie cookie = new Cookie("name", name); //設置path讓不一樣的服務器之間能夠共享cookie的信息 //好比設置域名爲".baidu.com"的能夠共享cookie cookie.setDomain(".baidu.com"); resp.addCookie(cookie);