Cookie與Session詳解


7、Cookie、Session

7.1、會話

會話:用戶打開一個瀏覽器,點擊了很多超鏈接,訪問多個web資源,關閉瀏覽器,這個過程可以稱之為會話

有狀態會話:一個同學來過教室,下次再來教室,我們會知道這個同學,曾經來過,稱之為有狀態會話;

你能怎么證明你是西開的學生?

你 西開

  1. 發票 西開給你發票
  2. 學校登記 西開標記你來過了

一個網站,怎么證明你來過?

客戶端 服務端

  1. 服務端給客戶端一個信件,客戶端下次訪問服務端帶上信件就可以了;cookie
  2. 服務器登記你來過了,下次你來的時候我來匹配你;session

7.2、保存會話的兩種技術

cookie

  • 客戶端技術 (響應,請求)

session

  • 服務器技術,利用這個技術,可以保存用戶的會話信息?我們可以把信息或者數據放在session中!

常見場景:網站登錄之后,你下次不用再登錄了,第二次訪問直接就上去了!

7.3、Cookie

  1. 從請求中拿到cookie信息
  2. 服務器響應給客戶端
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的兩種實現方式

一.通過session實現

​ sessionId是通過瀏覽器的cookie工作的,當客戶端瀏覽器中禁止 Cookie,Servlet 容器無法從客戶端瀏覽器中取得作為 Cookie 的 Session ID,也就無法跟蹤客戶狀態。

​ 服務器端把cookie存放在瀏覽器端,當在發送請求到服務器端時,將瀏覽器端存儲的cookie值作為http請求頭cookie屬性的值傳送給服務器端,來維持身份。

二.通過URL重寫實現

HttpServletResponse 接口提供了重寫 URL 的方法:public java.lang.String encodeURL(java.lang.String url)
該方法的實現機制為:
● 先判斷當前的 Web 組件是否啟用 Session,如果沒有啟用 Session,直接返回參數 url。
● 再判斷客戶端瀏覽器是否支持 Cookie,如果支持 Cookie,直接返回參數 url;如果不支持 Cookie,就在參數 url 中加入 Session ID 信息,然后返回修改后的 url。

通過這種機制,url中保存了sessionId,然后點擊URL時又回傳到服務器,來維持身份。

使用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>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM