7、Cookie、Session
7.1、會話
會話:使用者開啟一個瀏覽器,點選了很多超連結,訪問多個web資源,關閉瀏覽器,這個過程可以稱之為會話
有狀態會話:一個同學來過教室,下次再來教室,我們會知道這個同學,曾經來過,稱之為有狀態會話;
你能怎麼證明你是西開的學生?
你 西開
- 發票 西開給你發票
- 學校登記 西開標記你來過了
一個網站,怎麼證明你來過?
客戶端 服務端
- 服務端給客戶端一個信件,客戶端下次訪問服務端帶上信件就可以了;cookie
- 伺服器登記你來過了,下次你來的時候我來匹配你;session
7.2、儲存會話的兩種技術
cookie
- 客戶端技術 (響應,請求)
session
- 伺服器技術,利用這個技術,可以儲存使用者的會話資訊?我們可以把資訊或者資料放在session中!
常見場景:網站登入之後,你下次不用再登入了,第二次訪問直接就上去了!
7.3、Cookie
- 從請求中拿到cookie資訊
- 伺服器響應給客戶端
Cookie[] cookies = req.getCookies(); //獲得Cookie
cookie.getName(); //獲得cookie中的key
cookie.getValue(); //獲得cookie中的value
new Cookie("lastLoginTime", System.currentTimeMillis()+""); //新建一個cookie
cookie.setMaxAge(24*60*60); //設定cookie的有效期
resp.addCookie(cookie); //響應給客戶端一個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:
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("秦疆",1));
//獲取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
HttpSession session = req.getSession();
Person person = (Person) session.getAttribute("name");
System.out.println(person.toString());
==========================================
HttpSession session = req.getSession();
session.removeAttribute("name");
//手動登出Session
session.invalidate();
會話自動過期:web.xml配置
<!--設定Session預設的失效時間-->
<session-config>
<!--15分鐘後Session自動失效,以分鐘為單位-->
<session-timeout>15</session-timeout>
</session-config>