1. 程式人生 > 實用技巧 >7、Cookie、Session

7、Cookie、Session

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>