欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaWeb核心技術中Session與Cookie淺析

 更新時間:2023年02月22日 11:16:03   作者:綠仔牛奶_  
session的工作原理和cookie非常類似,在cookie中存放一個sessionID,真實的數(shù)據(jù)存放在服務器端,客戶端每次發(fā)送請求的時候帶上sessionID,服務端根據(jù)sessionID進行數(shù)據(jù)的響應

會話

會話:用戶打開瀏覽器進行的一系列操作直至關閉瀏覽器的過程看作是一次會話

HTTP協(xié)議是無狀態(tài)的,不能實現(xiàn)跟蹤對話。比如進入一個網(wǎng)站,每次操作的請求之間相互獨立,無法相互聯(lián)系。也就是說你每次請求過后得到的服務器響應或者數(shù)據(jù)無法被保存。

跟蹤會話的兩種技術:

  • 就服務端來講,采用Session技術。服務器為每一個用戶創(chuàng)建了一個唯一的Session標識用于跟蹤和管理該用戶的資源。用戶在下次提交請求時會一并提交Session標識用于服務器識別然后記錄該用戶的狀態(tài)
  • 客戶端,Cookie技術。Cookie也叫做硬盤Cookie,因為Cookie存儲在每一個客戶端的硬盤之上。用戶在第一次訪問服務器時,由服務器通過響應頭的方式將用戶cookie傳遞給瀏覽器。之后的訪問會將請求與cookie一并提交
  • 在理解上:Session可以看作是服務器對于該用戶的標記,而cookie是位于客戶端的標識,客戶提交請求時一并提交cookie,服務器將會根據(jù)客戶的cookie找到對應的session標識從而實現(xiàn)跟蹤會話

當用戶關閉瀏覽器后,對應的Cookie標識也會隨即銷毀,但此時服務器端session并未失效,只是由于cookie銷毀后無法繼續(xù)跟蹤用戶會話

Cookie

曲奇餅干

理解為:用戶的信件 也可以理解為該用戶的標志 由用戶攜帶

用戶向服務器發(fā)送的請求當中會包含該cookie

而瀏覽器也會根據(jù)該cookie判斷該用戶是否訪問過本網(wǎng)站從而得知該用戶的數(shù)據(jù)是否已經(jīng)存在

使用過的cookie會保存在本地的用戶目錄下

cookieAPI

// 上面提到過用戶的請求會攜帶cookie  所以要從客戶端獲取到cookie
Cookie[] cookies = req.getCookies();// --返回Cookie數(shù)組
// 創(chuàng)建cookie  兩個參數(shù)  鍵name   --   值value
Cookie cookie = new Cookie("LoginTimes",System.currentTimeMillis()+"");
// 獲取鍵
cookie.getName()
// 獲取值
cookie.getValue()
// 設置Cookie有效期  --> 24*60*60表示24小時*60分鐘*60秒
cookie.setMaxAge(24*60*60);
// 響應給客戶端一個Cookie(信件)
resp.addCookie(cookie);

cookie示例–> 瀏覽器顯示用戶上次的訪問時間

// 參考下方的doGet方法體
{
        // -- 顯示上次訪問的時間
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
 resp.setHeader("contenttype","text/html;charset=UTF-8");
System.out.println("resp編碼:"+resp.getCharacterEncoding());
        System.out.println("req編碼:"+req.getCharacterEncoding());
        PrintWriter out = resp.getWriter();
        // 從客戶端獲取Cookie
        Cookie[] cookies = req.getCookies();// --返回Cookie數(shù)組
        // 判斷該用戶是否已經(jīng)存在Cookie
        if (cookies!=null){
            out.write("LastTime Login Time:");
            for (Cookie cookie : cookies) {
                // 遍歷找到訪問時間的Cookie  getName獲得cookie中的鍵
                if (cookie.getName().equals("LoginTimes")){
                    // 獲取LoginTimes-Cookie的值  -- value
                    long l = Long.parseLong(cookie.getValue());
                    Date date = new Date(l);
                    out.write(date.toLocaleString());
                }
            }
        }
        // 記錄本次訪問的時間  --> 新建Cookie
        Cookie cookie = new Cookie("LoginTimes",System.currentTimeMillis()+"");
// 設置Cookie有效期  --> 24*60*60表示24小時*60分鐘*60秒
        cookie.setMaxAge(24*60*60);
        // 響應給客戶端一個Cookie(信件)
        resp.addCookie(cookie);
    }

編碼問題

如下代碼所示

// setCharacterEncoding意思是在程序中將請求和響應均置為utf-8編碼 但是可能瀏覽器會無法解析
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
// 瀏覽器使用的編碼集可能與UTF-8不同  所以此處設置瀏覽器采用UTF-8編碼
        resp.setHeader("content-type","text/html;charset=UTF-8");

但是我們在想要使cookie的值為中文漢字時,建議使用URLEncoder/URLDncoder

// 編碼
URLEncoder.encode("張三","utf-8");
// 解碼
URLDecoder.decode("李四","utf-8");

刪除cookie

/*源碼解析:以秒為單位指定cookie的最大期限;如果否定,則表示未存儲cookie;如果為零,則刪除cookie
*/
resp.setMaxAge(0);

網(wǎng)頁中查看cookie

  • 首先打開瀏覽器頁面審查元素 選中網(wǎng)絡
  • 在地址欄中執(zhí)行對應操作
  • 然后在審查元素->網(wǎng)絡中會看到我們的請求數(shù)據(jù)包
  • 點擊該數(shù)據(jù)包即可查看所有信息

以上述顯示登錄時間為例 可以看到此處的Cookie 有一個LoginTime對應的值

還可以點擊應用選中cookie即可查看所有的cookie屬性

Session

會話

一個Session獨占一個瀏覽器,一個瀏覽器對應一個Session(同一用戶在不同瀏覽器登錄,使用的session是不同的),瀏覽器未關閉Session就一直存在

用戶登錄網(wǎng)站成功之后會分到一個SessionID,至此,用戶在該網(wǎng)站執(zhí)行何種操作都無需再次登錄,因為在提交請求時服務器會識別用戶session然后在此session之下響應用戶請求

Session存放在服務器,用戶實際拿到的是SessionID

SessionAPI

// Session對象
HttpSession session = req.getSession();
// session創(chuàng)建時間
out.write("創(chuàng)建時間:"+session.getCreationTime()+"\n");
// sessionID獲取
out.write("SessionID:"+session.getId()+"\n");
// session上次訪問時間
out.write("上次訪問時間:"+session.getLastAccessedTime()+"\n");
// setAttribute設置鍵值屬性  getAttribute根據(jù)鍵獲取值
// getValue 根據(jù)鍵獲取值-->從2.2開始唄getA他tribute替代
// removeAttribute(String name) 刪除name鍵綁定的對象 如果不存在則不執(zhí)行任何操作
// isNew() 判斷該Session是否為新創(chuàng)建的
//注銷Session  
session.invalidate();
//注銷Session也會注銷掉SessionID

Session使用->servlet交互數(shù)據(jù)

Session不僅可以傳輸String類型還可以傳輸對象

// Servlet 1
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 編碼問題
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        resp.setHeader("content-type","text/html;charset:utf-8");
        // 流
        PrintWriter out = resp.getWriter();
        // Session
        // -- 1.獲取Session對象
        HttpSession session = req.getSession();
        // -- 2.獲取SessionID
        String id = session.getId();
        // -- 3.判斷該ID是否存在
        if (session.isNew()) {
            out.write("SessionID已存在:"+id);
        }else {
            out.write("Session創(chuàng)建成功,ID:"+id);
        }
        out.write("<h1>數(shù)據(jù)已寫出,跳轉checkData查看</h1>");
        // -- 4.寫出數(shù)據(jù)
        session.setAttribute("name","張三");
    }
// Servlet  2
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 編碼
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        resp.setHeader("content-type","text/html;charset=UTF-8");
        // 獲取數(shù)據(jù)
        HttpSession session = req.getSession();
        String name = (String) session.getAttribute("name");
        // 寫出數(shù)據(jù)
        resp.getWriter().write("name:"+name);
    }

傳輸對象時只需將session.setAttribute("鍵", 值)中的值更改為對象即可

通過抓包發(fā)現(xiàn),在用戶第一次請求時會由服務器創(chuàng)建Session并存儲為cookie的形式(JSESSIONID=你的SessionID),那么當用戶提交請求時(我們已經(jīng)知道Cookie會被一起提交),所以此時服務器也會獲取到你的Session,因此你的請求操作都將會在同一Session中執(zhí)行。等同于服務器識別到了你的Session你就擁有了某種權限

Session與Cookie

Session保存在服務器端,當用戶量過多時就可能會出現(xiàn)服務器過載現(xiàn)象。所以開發(fā)時也需要提前避免,所以通常利用Session+Cookie使用來減輕服務器壓力。重要信息保存在Session中,其他信息可以用Cookie保存

Cookie單個能保存的最大數(shù)據(jù)量為4kb,通常一個瀏覽器站點只允許存在20個cookie是把用戶數(shù)據(jù)寫到用戶瀏覽器,瀏覽器保存

Session是把用戶數(shù)據(jù)寫到用戶的獨占Session中

Session相對于cookie使用頻率更高,更加方便。cookie只能用于存儲字符串(以鍵值對的形式)并且可存放數(shù)據(jù)有限,而Session可以存儲對象

到此這篇關于JavaWeb核心技術中Session與Cookie淺析的文章就介紹到這了,更多相關JavaWeb Session Cookie內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • SpringBoot?整合Redis?數(shù)據(jù)庫的方法

    SpringBoot?整合Redis?數(shù)據(jù)庫的方法

    Redis是一個基于內存的日志型可持久化的緩存數(shù)據(jù)庫,保存形式為key-value格式,Redis完全免費開源,它使用ANSI?C語言編寫。這篇文章主要介紹了SpringBoot?整合Redis?數(shù)據(jù)庫的方法,需要的朋友可以參考下
    2018-03-03
  • 關于SpingMVC的<context:component-scan>包掃描踩坑記錄

    關于SpingMVC的<context:component-scan>包掃描踩坑記錄

    這篇文章主要介紹了關于SpingMVC的<context:component-scan>包掃描踩坑記錄,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 淺談Java多線程編程中Boolean常量的同步問題

    淺談Java多線程編程中Boolean常量的同步問題

    這篇文章主要介紹了淺談Java多線程編程中Boolean常量的同步問題,主要針對線程之間同步了不同的布爾對象的問題,需要的朋友可以參考下
    2015-10-10
  • 詳解SpringBoot中的index首頁的訪問、自定義Favicon圖標

    詳解SpringBoot中的index首頁的訪問、自定義Favicon圖標

    這篇文章主要介紹了SpringBoot中的index首頁的訪問、自定義Favicon圖標,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • Java IO流相關知識代碼解析

    Java IO流相關知識代碼解析

    這篇文章主要介紹了Java IO流相關知識代碼解析,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • Java反射中java.beans包學習總結

    Java反射中java.beans包學習總結

    本篇文章通過學習Java反射中java.beans包,吧知識點做了總結,并把相關內容做了關聯(lián),對此有需要的朋友可以學習參考下。
    2018-02-02
  • 解決java.net.SocketTimeoutException: Read timed out的問題

    解決java.net.SocketTimeoutException: Read timed out的問題

    這篇文章主要介紹了解決java.net.SocketTimeoutException: Read timed out的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Spring深入了解常用配置應用

    Spring深入了解常用配置應用

    這篇文章主要給大家介紹了關于Spring的常用配置,文中通過示例代碼介紹的非常詳細,對大家學習或者使用springboot具有一定的參考學習價值,需要的朋友可以參考下
    2022-07-07
  • @OneToMany查詢陷入循環(huán)引用的解決方案

    @OneToMany查詢陷入循環(huán)引用的解決方案

    這篇文章主要介紹了@OneToMany查詢陷入循環(huán)引用的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java中的BigDecimal原理詳解

    Java中的BigDecimal原理詳解

    這篇文章主要介紹了Java中的BigDecimal原理詳解,對于日常開發(fā)過程中出現(xiàn)小數(shù)的問題,通常都是使用float或者double類型來處理,在java中float占用四個字節(jié), double類型占用8個字節(jié),需要的朋友可以參考下
    2023-09-09

最新評論