1301:大盜阿福
阿新 • • 發佈:2021-06-20
Cookie、Session
1、會話
會話:使用者開啟一個瀏覽器,點選了很多超連結,訪問多個web資源,關閉瀏覽器,這個過程可以稱之為會話
有狀態會話:一個同學來過教室,下次再來教室,我們會知道這個同學,曾經來過,稱之為狀態會話;
一個網站,怎麼證明你來過?
客戶端 服務端
1.服務端給客戶端一個信件,客戶端下次訪問服務端帶上信件就可以了;cookie
2.伺服器登記你來過了,下次你來的時候我來匹配你;session
2、儲存會話的兩種技術
cookie
- 客戶端技術(響應,請求)
session
- 伺服器技術,利用這個技術,可以儲存使用者的會話資訊,我們可以把資訊或者資料放在session中;
3、Cookie
1.從請求中拿到cookie資訊
2.伺服器響應給客戶端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;
- 瀏覽器cookie上限為300個;
刪除cookie
-
不設定有效期,關閉瀏覽器,自動失效;
-
設定有效期時間為0;
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //建立一個cookie,名字要和刪除的名字一致 Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + ""); cookie.setMaxAge(0); resp.addCookie(cookie); }
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//伺服器,告訴你,你來的時間,把這個時間封裝成為一個信件,你下次帶來,就知道你來了
//解決中文亂碼
resp.setContentType("text/html");
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
PrintWriter out = resp.getWriter();
//Cookie,伺服器端從客戶端獲取
Cookie[] cookies = req.getCookies();
//判斷cookie是否存在
if ( cookies != null ) {
//如果存在
out.write("你上次訪問的時間是:");
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies[i];
//獲取cookie的名字
if (cookie.getName().equals("lastLoginTime")) {
//獲取cookie中的值
long lastLoginTime = Long.parseLong(cookie.getValue());
Date date = new Date(lastLoginTime);
out.write(date.toLocaleString());
}
}
} else {
//如果不存在
out.write("這是你第一次訪問本站");
}
//伺服器給客戶端響應一個cookie
Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis() + "");
//設定cookie有效期
cookie.setMaxAge(24*60*60);
resp.addCookie(cookie);
resp.setCharacterEncoding("utf-8");
}
第一次訪問:
第二次訪問:
編碼解碼
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html");
Cookie[] cookies = req.getCookies();
PrintWriter out = resp.getWriter();
if ( cookies != null ) {
out.write("你上次訪問的時間是:");
for ( int i = 0; i < cookies.length; i++ ) {
Cookie cookie = cookies[i];
if ( cookie.getName().equals("name") ) {
//解碼
out.write(URLDecoder.decode(cookie.getValue(),"utf-8"));
}
}
} else {
out.write("這是你第一次訪問");
}
//編碼
Cookie cookie = new Cookie("name", URLEncoder.encode("提莫", "utf-8"));
resp.addCookie(cookie);
}
4、Session(重點)
什麼是session:
- 伺服器會給每一個使用者(瀏覽器)建立一個session物件;
- 一個session獨佔一個瀏覽器,只要瀏覽器沒有關閉,這個session就存在;
Session和Cookie的區別
- Cookie是把使用者的資料寫給使用者的瀏覽器,瀏覽器儲存(可以儲存多個)
- Session把使用者的資料寫到使用者獨佔session中,伺服器端儲存(儲存重要的資訊,減少伺服器資源的浪費)
- Session物件由服務建立;
使用Session
@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","卡莎");
session.setAttribute("name",new Person("多多",2));
//獲取session的ID
String sessionId = session.getId();
//判斷session是不是新建立的
if ( session.isNew() ) {
resp.getWriter().write("session建立成功,id為:" + sessionId);
} else {
resp.getWriter().write("session已經在伺服器中存在了,id為:" + sessionId);
}
}
得到Session
@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
// String name = (String) session.getAttribute("name");
//System.out.println(name);
Person name = (Person) session.getAttribute("name");
System.out.println(name);
}
手動登出Session
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
session.removeAttribute("name");
//手動登出Session
session.invalidate();
}
會話自動過期:web.xml配置
<!-- 設定Session的預設登出時間 -->
<session-config>
<!-- x分鐘後session自動失效,以分鐘為單位 -->
<session-timeout>15</session-timeout>
</session-config>