前言
談到Cookie和Session,我們就得先了解一下會話這個概念。那麼網絡上的一次會話定義是什麼呢?
會話:用戶打開一個瀏覽器,點擊了很多超鏈接,訪問多個web資源,關閉瀏覽器,這個過程稱之爲會話。
有狀態會話:給一次會話加上標誌位,證明他來過。舉一個現實生活中的例子,一個同學來到教室,下次同學再來教室,我們就知道這個同學曾經來過,這就稱之爲有狀態會話。
每篇無獎問答:
我們該如何證明你是某個學校的學生呢?
你 學校
這其實無外乎兩種方式:一種是學校給你一張繳費單,上面有你的相關信息,你進入學校後,可以把它作爲你身份的憑證。
另外一種是學校對你的信息進行登記,就像你在班級裏都有一個固定的學號信息,這就是你身份的·憑證。
繼續思考一下,一個網站又如何證明你來過呢(類比學校和你的關係)
客戶端 服務器
- 服務端給客戶端一個信件(類似於繳費單),客戶端下次訪問服務器帶上信件就可以了。(這就是所謂的cookie)
- 服務端登記你來過(相當月學號信息),下次你來的時候我來匹配你。(這就是所謂的session)
上面的例子我們可以做出如下總結:
網絡上保存會話有兩種技術:
Cookie : 客戶端技術 (響應,請求)
Session: 服務端技術,利用這個技術,可以保存用戶的會話信息。
常用場景:網站登錄之後,你下次不用再登錄,第二次直接就登上去了。
1. Cookie
用戶第二次可以免登陸的原因:
[1] 服務器 從客戶端的請求中拿到cookie信息
[2] 服務端響應客戶端的cookie信息
Cookie的主要方法
(其中req表示request對象,resp表示response對象)
Cookie[] cookies = req.getCookies(); //獲得Cookie
cookie.getName(); //獲得cookie中的key
Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + ""); //新建一個cookie對象
cookie.setMaxAge(24*60*60); //設置cookie的有效期
resp.addCookie(cookie); //響應給客戶端一個cookie
以一個設置cookie的有效期爲例子
package com.gs.servlet;
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;
import java.util.Date;
/**
* @Auther: Gs
* @Date: 2020/5/16
* @Description: PACKAGE_NAME
* @version: 1.0
*/
public class CookieDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//服務器給客戶端響應一個Cookie
Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");
//cookie有效期爲1天
cookie.setMaxAge(24*60*60);
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
記得寫完cookie後都要進行註冊,因爲它本質上是一個Servlet類
在web.xml上進行註冊
<servlet>
<servlet-name>CookieDemo02</servlet-name>
<servlet-class>com.gs.servlet.CookieDemo02</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CookieDemo02</servlet-name>
<url-pattern>/cookie2</url-pattern>
</servlet-mapping>
這樣cookie的信息就可以保存一天了。
思考:一個網站的cookie是否存在上限?
- 一個Cookie只能保存一個信息
- 一個Web站點可以給瀏覽器發送多個cookie, 最多存放20個cookie(關於這個web站點的,其他站點分開累積)
- Cookie信息大小限制爲4kb
- 300個 cookie爲瀏覽器的上限
刪除Cookie
- 不設置有效期,關閉瀏覽器,自動失效
- 設置有效時間爲0
2. Session
什麼是Session?
- 服務器會給每一個用戶(瀏覽器)創建一個Session對象
- 一個Session獨佔一個瀏覽器,只要瀏覽器沒關閉,這個Session就存在。
- 用戶登錄之後,整個網站它都可以訪問 —>應用場景: 保存用戶的信息,保存購物車的信息
使用場景:
- 保存一個登錄用戶的信息
- 購物車信息
- 在整個網站中經常使用的數據,我們將他保存在Session中
Session 和Cookie的區別:
- Cookie是把用戶的數據寫給用戶瀏覽器,瀏覽器保存 (可以保存多個)
- Session把用戶的數據寫到用戶獨佔Session中,服務器保存 (保存重要信息,減少服務器資源的浪費)
- Session對象由服務器創建
Session的使用:(本質上也是同一個Servlet)
package com.gs.servlet;
import com.gs.pojo.Person;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;
/**
* @Auther: Gs
* @Date: 2020/5/16
* @Description: com.gs.servlet
* @version: 1.0
*/
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 Person("張三",18));
//獲取session的ID
String sessionId = session.getId();
//判斷session是不是新創建的
if(session.isNew()){
resp.getWriter().write("session創建成功,Id:"+sessionId);
}else {
resp.getWriter().write("session已經在服務中存在了,ID:"+sessionId);
}
//session創建的時候做了什麼事情
//Cookie cookie = new Cookie("JSESSIONID", sessionId);
//resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
其他的使用說明:
session可以存放對象,可以手動註銷,也可以移除某個key
(其中Person是一個實體對象)
HttpSession session = req.getSession();
Person person = (Person) session.getAttribute("name");
System.out.println(person.toString());
session.removeAttribute("name");
//手動註銷session
session.invalidate();
上面的Session類寫完記得在web.xml中註冊
<servlet>
<servlet-name>SessionDemo01</servlet-name>
<servlet-class>com.gs.servlet.SessionDemo01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SessionDemo01</servlet-name>
<url-pattern>/s1</url-pattern>
</servlet-mapping>
我們不僅能在 Servlet類對Session的值進行設置,還可以在web.xml中進行設置
比如:設置會話自動過期
<!--設置session默認的失效時間-->
<session-config>
<!--1分鐘後session自動失效,以分鐘爲單位-->
<session-timeout>1</session-timeout>
</session-config>
小結:
以上就是Sesion和Cookie的全部內容,其實這兩者的本質都是鍵值對,只不過Cookie是客戶端的行爲,Session是服務器的行爲。而且Cookie的value值只能是字符串,而Session則是Object,所以Session在我們日常開發中使用較爲廣泛。
下面是關於我們瀏覽器中保存的Cookie值,(我們每個人通過審查元素都能看到瀏覽器對於我們會話的保存)