7、Cookie、Session
阿新 • • 發佈:2020-12-14
7.1、會話
會話:使用者打開了一個瀏覽器,點選了很多連結,訪問多個web資源,關閉瀏覽器,這個過程可以稱之為會話
有狀態會話:一個同學來過教室,下次再來教室,我們會知道這個同學,增經來過,稱之為有狀態會話;
一個網站怎麼證明你來過了?
客戶端 服務端
1.伺服器給客戶端一個信件就可以了; cookie
2.伺服器登入記你來過了,下次你來的時候我來匹配你; seesion
7.2、儲存會話的兩種技術
cookie
- 客戶端技術(響應,請求)
session
- 伺服器技術,利用這個技術,可以儲存使用者的會話資訊?我們可以把資訊或者資料放在Session中!
常見場景:網站登入之後,你下次不用再登陸了,第二次訪問直接就上去了!
7.3、Cookie
1.從請求中拿到cookie資訊
2.伺服器響應給客戶端cookie
1 Cookie[] cookies = req.getCookies();//獲得Cookie 2 cookie.getName(); //獲得cookie中的key 3 cookie.getValue(); //獲得cookie中的value 4 new Cookie("lastLoginTime", System.currentTimeMillis()+"");//新建一個cookie 5 cookie.setMaxAge(24*60*60);//設定cookie的有效期 6 resp.addCookie(cookie);//響應給客戶端
cookie:一般會儲存在本地的使用者目錄下 appdata;
一個網站cookie是否存在上限!聊聊細節問題
- 一個Cookie只能儲存一個資訊;
- 一個web站點可以給瀏覽器傳送多個cookie,最多存放20個cookie;
- Cookie大小有限制4kb;
- 300個cookie瀏覽器上限
刪除Cookie;
- 不設定有效期,關閉瀏覽器,自動失效;
- 設定有效期時間為0;
編碼解碼:
1 URLEncoder.encode("王劉","utf-8")
2 URLDecoder.decode(cookie.getValue(),"utf-8")
7.4、Session(重點)
什麼是Session:
- 伺服器會給每一個使用者(瀏覽器)建立一個Session物件;
- 一個Session獨佔一個瀏覽器,只要瀏覽器沒有關閉,這個Session就存在;
- 使用者登入之後,整個網站它都可以訪問! -->儲存使用者的資訊;儲存購物車的資訊......
Session和Cookie的區別:
- Cookie是把使用者的資料寫給使用者瀏覽器,瀏覽器儲存
- Session把使用者的資料寫到使用者獨佔Session中,伺服器端儲存(儲存重要的資訊,減少伺服器資源的浪費)
- Session對由伺服器建立;
使用場景
- 儲存一個登入使用者的資訊;
- 購物車資訊;
- 在整個網站中經常會使用的資料,我們將它儲存在Session中;
使用Session
1 package com.kuang.servlet; 2 3 import com.kuang.pojo.Person; 4 5 import javax.servlet.ServletException; 6 import javax.servlet.http.*; 7 import java.io.IOException; 8 9 public class SessionDemo01 extends HttpServlet { 10 @Override 11 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 12 13 //解決亂碼問題 14 req.setCharacterEncoding("utf-8"); 15 resp.setCharacterEncoding("utf-8"); 16 resp.setContentType("text/html;charset=utf-8"); 17 18 //得到Session 19 HttpSession session = req.getSession(); 20 21 //給Session中存東西 22 session.setAttribute("name",new Person("王劉",22)); 23 24 //獲取Session的ID 25 String sessionId = session.getId(); 26 27 //判斷Session是不是新建立的 28 if (session.isNew()) { 29 resp.getWriter().write("session建立成功,ID:"+sessionId); 30 }else { 31 resp.getWriter().write("session已經在伺服器中存在了,ID:"+sessionId); 32 } 33 34 //Session建立的時候做了什麼事情; 35 // Cookie cookie = new Cookie("JSESSIONID", sessionId); 36 // resp.addCookie(cookie); 37 38 } 39 40 @Override 41 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 42 doGet(req, resp); 43 } 44 }
1 package com.kuang.servlet; 2 3 import com.kuang.pojo.Person; 4 5 import javax.servlet.ServletException; 6 import javax.servlet.http.HttpServlet; 7 import javax.servlet.http.HttpServletRequest; 8 import javax.servlet.http.HttpServletResponse; 9 import javax.servlet.http.HttpSession; 10 import java.io.IOException; 11 12 public class SessionDemo02 extends HttpServlet { 13 @Override 14 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 15 16 //解決亂碼問題 17 req.setCharacterEncoding("utf-8"); 18 resp.setCharacterEncoding("utf-8"); 19 resp.setContentType("text/html;charset=utf-8"); 20 21 //得到Session 22 HttpSession session = req.getSession(); 23 24 Person person = (Person) session.getAttribute("name"); 25 26 System.out.println(person.toString()); 27 28 } 29 30 @Override 31 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 32 doGet(req, resp); 33 } 34 }
package com.kuang.servlet; 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 SessionDemo03 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { HttpSession session = req.getSession(); session.removeAttribute("name");
//手動登出Session session.invalidate(); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
會話自動過期:
<!--設定Session預設的失效時間--> <session-config> <!--15分鐘後Session自動失效,以分鐘為單位--> <session-timeout>15</session-timeout> </session-config>