七、Cookie、Session
7.1、會話:
會話:使用者開啟一個瀏覽器,點選了很多超連結,訪問多個web資源,關閉瀏覽器,這個過程可以稱之為會話;
有狀態會話:一個同學來過教師,下次再來教室,我們會知道這個同學,曾經來過,稱之為有狀態會話;
一個網站,怎麼證明你來過?
客戶端 服務端
-
伺服器給客戶端一個信件,客戶端下次訪問服務端帶上這個信件:Cookie
-
伺服器登入你來過了,下次你來的時候我來匹配你:Session
7.2、儲存會話的兩種技術
Cookie
-
客戶端技術(響應,請求)
Session
-
伺服器技術,利用這個技術,可以儲存使用者的會話資訊?
常見:網站登入之後,下次登入就不用在登入了,第二次訪問伺服器會快取你的使用者資訊
7.3、Cookie
-
從請求中拿到cookie資訊
-
伺服器響應給客戶端 cookie
//Cookie,伺服器從客戶端獲取 Cookie[] cookies = req.getCookies();//這個返回陣列,說明Cookie可以存在多個 cookie.getName();//獲取cookie的名字 cookie.getValue(); //伺服器給客戶響應一個cookie //System.currentTimeMillis() 獲得的是自1970-1-01 00:00:00.000 到當前時刻的時間距離,型別為long。 Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+""); //儲存這個網頁記錄多少天,到了時間就會失效 cookie.setMaxAge(24*60*60); //給響應新增一個cookie resp.addCookie(cookie);
cookie:一般會儲存在本地的使用者目錄下appData
一個網站cookie是否存在上限
-
一個cookie只能儲存一個資訊
-
一個web站點可以給瀏覽器傳送多個cookie,最多存放20個cookie
-
Cookie大小有限制4kb
-
300個cookie瀏覽器上限
刪除Cookie
-
不設定有效期,關閉瀏覽器,自動失效
-
設定有效期時間為0
編碼解碼
URLEncoder.encode("李永輝","utf-8")
URLDecoder.decode(cookie.getValue(),"UTF-8")
7.4、Session(重點):
什麼是session:
-
伺服器會給每一個使用者(瀏覽器)建立一個Session物件
-
一個Session獨佔一個瀏覽器,只要瀏覽器沒有關閉,這個Session就存在
-
使用者登入之後,整個網站都可以訪問!—>儲存使用者的資訊;儲存購物車的資訊……
Session和Cookie的區別:
-
Cookie是把使用者的資料寫給使用者的瀏覽器,瀏覽器儲存(可以儲存多個)
-
Session是把使用者的資料寫到使用者的獨佔Session中,伺服器端儲存(儲存重要的資訊,減少伺服器資源的浪費)
-
Session物件由伺服器建立
使用場景:
-
儲存一個登入使用者的資訊
-
在整個網站中經常會使用的資料,儲存在Session中
使用Session:
package com.lyh.servlet;
import com.lyh.pojo.Students;
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;
public class SessionDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解決亂碼問題
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
//得到Session
HttpSession session = req.getSession();
//給Session中存東西
session.setAttribute("name",new Students("李永輝",1));
//獲取Session的id
String id = session.getId();
//獲得Session是不是建立
if (session.isNew()){
resp.getWriter().write("session建立成功,id為:"+id);
}else {
resp.getWriter().write("session已經存在伺服器中,id為:"+id);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解決亂碼問題
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
//得到Session
HttpSession session = req.getSession();
Students name = (Students) session.getAttribute("name");
resp.getWriter().write(name+"");
}
會話自動過期:web.xml設定
<!--設定Session預設的失效時間--><session-config> <!--1分鐘之後Session自動失效--> <session-timeout>1</session-timeout></session-config>
Session和cookie的區別:
-
cookie是把使用者的資料寫給使用者的瀏覽器,瀏覽器可以儲存(可以儲存多個)
-
Session把使用者的資料寫到使用者獨佔Session中,伺服器端儲存(儲存一個)
使用場景:
-
儲存一個登入使用者的資訊;
-
購物車資訊;
-
在整個網站中經常會使用的資料,我們將它儲存在Session中;