国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

JAVAWeb10-Web 開發(fā)會話技術(shù)-Session-02

這篇具有很好參考價值的文章主要介紹了JAVAWeb10-Web 開發(fā)會話技術(shù)-Session-02。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1. session 有什么用

● 思考兩個問題—拋磚引玉

  1. 不同的用戶登錄網(wǎng)站后,不管該用戶瀏覽該網(wǎng)站的哪個頁面,都可顯示登錄人的名字,還可以隨時去查看自己的購物車中的商品, 是如何實現(xiàn)的?
  2. 也就是說,一個用戶在瀏覽網(wǎng)站不同頁面時,服務(wù)器是如何知道是張三在瀏覽這個頁面,還是李四在瀏覽這個頁面?
    JAVAWeb10-Web 開發(fā)會話技術(shù)-Session-02
  3. 同學(xué)們想想,如果讓你來實現(xiàn)這個功能,你會如何完成?
    JAVAWeb10-Web 開發(fā)會話技術(shù)-Session-02
  • 解決之道—session 技術(shù), 簡單說
  1. Session 是服務(wù)器端技術(shù),服務(wù)器在運行時為每一個用戶的瀏覽器創(chuàng)建一個其獨享的session 對象/集合
    JAVAWeb10-Web 開發(fā)會話技術(shù)-Session-02

  2. 由于 session 為各個用戶瀏覽器獨享,所以用戶在訪問服務(wù)器的不同頁面時,可以從各自的 session 中讀取/添加數(shù)據(jù), 從而完成相應(yīng)任務(wù)

2. session 基本原理

2.1 Sesson 原理示意圖

JAVAWeb10-Web 開發(fā)會話技術(shù)-Session-02

  1. 當(dāng)用戶打開瀏覽器,訪問某個網(wǎng)站, 操作 session 時,服務(wù)器就會在內(nèi)存(在服務(wù)端)為該瀏覽器分配一個 session 對象,該 session 對象被這個瀏覽器獨占, 如圖
  2. 這個 session 對象也可看做是一個容器/集合,session 對象默認(rèn)存在時間為 30min(這是在tomcat/conf/web.xml),也可修改
    JAVAWeb10-Web 開發(fā)會話技術(shù)-Session-02

2.2 Session 可以做什么

  1. 網(wǎng)上商城中的購物車
  2. 保存登錄用戶的信息
  3. 將數(shù)據(jù)放入到 Session 中,供用戶在訪問不同頁面時,實現(xiàn)跨頁面訪問數(shù)據(jù)
  4. 防止用戶非法登錄到某個頁面

2.3 如何理解 Session

  1. session 存儲結(jié)構(gòu)示意圖
    JAVAWeb10-Web 開發(fā)會話技術(shù)-Session-02
  2. 你可以把 session 看作是一容器類似 HashMap,有兩列(K-V),每一行就是 session 的一個屬性。
  3. 每個屬性包含有兩個部分,一個是該屬性的名字(String),另外一個是它的值(Object)

3. session 常用方法

3.1 文檔

java_ee_api_中英文對照版.chm

3.2 Session 的基本使用

JAVAWeb10-Web 開發(fā)會話技術(shù)-Session-02

  1. 創(chuàng)建和獲取 Session,API 一樣
    HttpSession hs=request.getSession();
    第 1 次調(diào)用是創(chuàng)建 Session 會話, 之后調(diào)用是獲取創(chuàng)建好的 Session 對象

  2. 向 session 添加屬性
    hs.setAttribute(String name,Object val);

  3. 從 session 得到某個屬性
    Object obj=hs.getAttribute(String name);

  4. 從 session 刪除調(diào)某個屬性:
    hs.removeAttribute(String name);

  5. isNew(); 判斷是不是剛創(chuàng)建出來的 Session

  6. 每個 Session 都有 1 個唯一標(biāo)識 Id 值。通過 getId() 得到 Session 的會話 id 值

4. session 底層實現(xiàn)機制

4.1 原理分析圖(一圖勝千言)

session 底層實現(xiàn)機制圖解(重要)
JAVAWeb10-Web 開發(fā)會話技術(shù)-Session-02
JAVAWeb10-Web 開發(fā)會話技術(shù)-Session-02

4.2 實例分析

  1. 需求:演示 Session 底層實現(xiàn)機制-創(chuàng)建和讀取 Session
  2. (回顧之前手寫Tomcat的項目)
    添加容器:sessionMapping
public class HspTomcatV3 {

    //1. 存放容器 servletMapping
    // -ConcurrentHashMap
    // -HashMap
    // key            - value
    // ServletName    對應(yīng)的實例

    public static final ConcurrentHashMap<String, HspHttpServlet>
            servletMapping = new ConcurrentHashMap<>();


    //2容器 servletUrlMapping
    // -ConcurrentHashMap
    // -HashMap
    // key                    - value
    // url-pattern       ServletName

    public static final ConcurrentHashMap<String, String>
            servletUrlMapping = new ConcurrentHashMap<>();


    //你可以這里理解session, tomcat還維護一個容器
    public static final ConcurrentHashMap<String, HttpSession>
            sessionMapping = new ConcurrentHashMap<>();

	。。。。。。。
}
  1. 創(chuàng) 建 CreateSession.java
public class CreateSession extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //System.out.println("CreateSession 被調(diào)用...");

        //1. 獲取session, 同時也可能創(chuàng)建session
        HttpSession session = request.getSession();

        //2. 給session獲取id
        System.out.println("CreateSession 當(dāng)前sessionid= " + session.getId());
        //3. 給session存放數(shù)據(jù)
        session.setAttribute("email", "zs@qq.com");

        //4. 給瀏覽器發(fā)送一個回復(fù)
        response.setContentType("text/html;charset=utf-8");
        PrintWriter writer = response.getWriter();
        writer.println("<h1>創(chuàng)建/操作session成功...</h1>");
        writer.flush();
        writer.close();

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

測試 Session 創(chuàng)建的機制, 注意抓包分析:
(按照分析圖3種情況測試分析請求、響應(yīng)的信息)
JAVAWeb10-Web 開發(fā)會話技術(shù)-Session-02

補充說明:
當(dāng)瀏覽器第一次訪問Tomcat服務(wù)器時,Tomcat會為該會話創(chuàng)建一個唯一的標(biāo)識符JsessionId。這是因為JsessionId是用于跟蹤用戶會話的關(guān)鍵參數(shù),可以確保在同一個會話期間用戶的多次請求都被映射到同一個會話上下文中處理。在后續(xù)的請求中,瀏覽器將JsessionId作為cookie或URL參數(shù)發(fā)送給服務(wù)器,以便服務(wù)器能夠識別并恢復(fù)與該特定會話相關(guān)聯(lián)的所有狀態(tài)和信息。
補充:
啟動Tomcat默認(rèn)會訪問一個jsp文件,此時會生成返回一個JsessionId,但是沒有為該id生成對象

  1. 創(chuàng) 建 測試讀取
    ReadSession.java
public class ReadSession extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //System.out.println("ReadSession 被調(diào)用...");
        // 演示讀取session
        //1. 獲取session, 如果沒有sesion, 也會創(chuàng)建
        HttpSession session = request.getSession();
        //輸出sessionId
        System.out.println("ReadSession sessionid= " + session.getId());
        //2. 讀取屬性
        Object email = session.getAttribute("email");
        if (email != null) {
            System.out.println("session屬性 email= " + (String) email);
        } else {
            System.out.println("session中沒有 email屬性 ");
        }
        //給瀏覽器回復(fù)一下
        response.setContentType("text/html;charset=utf-8");
        PrintWriter writer = response.getWriter();
        writer.println("<h1>讀取session成功...</h1>");
        writer.flush();
        writer.close();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

測試 Session 讀取的機制, 注意抓包分析
JAVAWeb10-Web 開發(fā)會話技術(shù)-Session-02

  1. 有了代碼支撐,我們在回頭看 Session 的原理圖,就有更深刻的理解

4.3 Session 實現(xiàn)原理動畫

● 服務(wù)器是如何實現(xiàn)一個 session 為一個用戶瀏覽器服務(wù)的
JAVAWeb10-Web 開發(fā)會話技術(shù)-Session-02

5. session 生命周期

5.1 Session 生命周期-說明

  1. public void setMaxInactiveInterval(int interval) 設(shè)置 Session 的超時時間(以秒為單位),超過指定的時長,Session 就會被銷毀。

  2. 值為正數(shù)的時候,設(shè)定 Session 的超時時長。

  3. 負(fù)數(shù)表示永不超時

  4. public int getMaxInactiveInterval()獲取 Session 的超時時間

  5. public void invalidate() 讓當(dāng)前 Session 會話立即無效

  6. 如果沒有調(diào)用 setMaxInactiveInterval() 來指定 Session 的生命時長,Tomcat 會以 Session默認(rèn)時長為準(zhǔn),Session 默認(rèn)的超時為 30 分鐘, 可以在 tomcat 的 web.xml 設(shè)置
    JAVAWeb10-Web 開發(fā)會話技術(shù)-Session-02

  7. Session 的生命周期指的是 :客戶端/瀏覽器兩次請求最大間隔時長,而不是累積時長。即當(dāng)客戶端訪問了自己的 session,session 的生命周期將從 0 開始重新計算。(解讀: 指的是同一個會話兩次請求之間的間隔時間)
    JAVAWeb10-Web 開發(fā)會話技術(shù)-Session-02

  8. 底層: Tomcat 用一個線程來輪詢會話狀態(tài),如果某個會話的空閑時間超過設(shè)定的最大值,則將該會話銷毀
    JAVAWeb10-Web 開發(fā)會話技術(shù)-Session-02

5.2 Session 生命周期-應(yīng)用實例

● 需求:代碼演示說明 Session 的生命周期
● 代碼實現(xiàn)

  1. 創(chuàng) 建 CreateSession2.java
public class CreateSession2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("CreateSession2 被調(diào)用");
        //創(chuàng)建session
        HttpSession session = request.getSession();
        System.out.println("CreateSession2 sid= " + session.getId());
        //設(shè)置生命周期為 60s
        session.setMaxInactiveInterval(60);
        session.setAttribute("u", "jack");

        //回復(fù)一下瀏覽器
        response.setContentType("text/html;charset=utf-8");
        PrintWriter writer = response.getWriter();
        writer.println("<h1>創(chuàng)建session成功, 設(shè)置生命周期60s</h1>");
        writer.flush();
        writer.close();

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}
  1. 創(chuàng) 建 ReadSession2.java
public class ReadSession2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //System.out.println("ReadSession2 被調(diào)用...");

        //1. 獲取到session
        HttpSession session = request.getSession();
        System.out.println("ReadSession2 sid= " + session.getId());
        //2. 讀取session的屬性
        Object u = session.getAttribute("u");
        if (u != null) {
            System.out.println("讀取到session屬性 u= " + (String) u);
        } else {
            System.out.println("讀取不到session屬性 u 說明原來的session被銷毀");
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

解讀:Session 的生命周期

  1. 指的是兩次訪問 session 的最大間隔時間
  2. 如果你在 session 沒有過期的情況下,操作 session,則會重新開始計算生命周期
  3. session 是否過期,是由服務(wù)器來維護和管理
  4. 如我們調(diào)用了 invaliate() 會直接將該,session 刪除/銷毀
  5. 如果希望刪除 session 對象的某個屬性, 使用 removeAttribute(“xx”)
  1. 創(chuàng) 建 DeleteSession.java
public class DeleteSession extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("DeleteSession 被調(diào)用...");

        //演示如何刪除session
        HttpSession session = request.getSession();
        session.invalidate();

        //再多說一句, 如果你要刪除session的某個屬性
        //session.removeAttribute("xxx");

        //回復(fù)一下瀏覽器
        response.setContentType("text/html;charset=utf-8");
        PrintWriter writer = response.getWriter();
        writer.println("<h1>刪除session成功</h1>");
        writer.flush();
        writer.close();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

完成測試 , 使用前面編寫的文件來演示說明 Session 的生命周期.

6. Session 經(jīng)典案例-防止非法進入管理頁面

6.1 作業(yè)布置

  1. 需求說明: 完成防止用戶登錄管理頁面應(yīng)用案例(如圖)
    JAVAWeb10-Web 開發(fā)會話技術(shù)-Session-02
    說明:
  1. 只要密碼為 666666, 我們認(rèn)為就是登錄成功
  2. 用戶名不限制
    2.1 如果驗證成功,則進入管理頁面 ManageServelt.java
    2.2 如果驗證失敗,則進入 error.html
  1. 如果用戶直接訪問 ManageServet.java , 重定向到到 login.html

登錄界面:userLogin.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用戶登錄</title>
</head>
<body>
<h1>用戶登錄</h1>
<form action="/cs/loginCheck"
      method="post">
    用戶名:<input type="text" name="username"/><br/><br/>
    密 碼:<input type="password" name="password"><br><br/>
    <input type="submit" value="登錄"></form>
</body>
</html>

登錄失敗頁面:error.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登錄失敗</title>
</head>
<body>
<h1>登錄失敗</h1>
<!--
回顧 web工程路徑專題
1. a 標(biāo)簽是 瀏覽器解析
2. 第一 / 被解析成 http://localhost:8080/
3. 如果沒有 / 會以當(dāng)前瀏覽器地址欄 的 http://localhost:8080/工程路徑../資源 去掉資源部分作為參考路徑
4  其它的回顧請大家看 web工程路徑專題~~ , 他會貫徹 整個java后端開發(fā)
-->
<a href="/cs/userlogin.html">點擊重新登錄</a>
</body>
</html>

LoginCheckServlet.java

public class LoginCheckServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("LoginCheckServlet 被調(diào)用..");
        //功能-> 自己拆解 -> 逐步實現(xiàn) [大量練習(xí)]
        //1. 得到提交的用戶名和密碼
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        if("666666".equals(password)) {//認(rèn)為合法
            //把用戶名保存到 session
            HttpSession session = request.getSession();
            session.setAttribute("loginuser", username);

            //請求轉(zhuǎn)發(fā)到ManageServlet
            request.getRequestDispatcher("/manage").forward(request, response);
        } else {
            //請求轉(zhuǎn)發(fā)進入到 error.html
            request.getRequestDispatcher("/error.html").forward(request, response);
        }


    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

ManageServlet.java文章來源地址http://www.zghlxwxcb.cn/news/detail-428252.html

public class ManageServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //判斷該用戶是否登錄過
        HttpSession session = request.getSession();
        Object loginuser = session.getAttribute("loginuser");
        if(loginuser == null) {//說明該用戶沒有登錄
            //重新登錄-> 請求重定向
            //response.sendRedirect("/cs/userlogin.html");
            response.sendRedirect(request.getContextPath() + "/userlogin.html");
            return;
        } else {
            response.setContentType("text/html;charset=utf-8");
            PrintWriter writer = response.getWriter();
            writer.println("<h1>用戶管理頁面</h1>");
            writer.println("歡迎你, 管理員:" + loginuser.toString());
            writer.flush();
            writer.close();
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

到了這里,關(guān)于JAVAWeb10-Web 開發(fā)會話技術(shù)-Session-02的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Web會話跟蹤:Cookie與Session

    在Web應(yīng)用中,同一個瀏覽器與Web服務(wù)器的一次一系列的各種交互活動稱為 會話 。而Web應(yīng)用往往需要對用戶進行會話跟蹤,記錄用戶的狀態(tài)。下面簡單介紹一下會話跟蹤技術(shù)Cookie與Session。 Cookie ,有時也用其復(fù)數(shù)形式 Cookies,是一個保存在用戶客戶端計算機中的簡單的小型文本

    2024年02月19日
    瀏覽(17)
  • 【Python】Web學(xué)習(xí)筆記_flask(6)——會話&session對象

    【Python】Web學(xué)習(xí)筆記_flask(6)——會話&session對象

    處理利用cookie來判斷用戶登錄外,也可以使用session來判斷用戶是否登錄 html代碼和cookie對象的設(shè)置相同 ? ?

    2024年02月12日
    瀏覽(19)
  • 會話跟蹤技術(shù)學(xué)習(xí)筆記(Cookie+Session)+ HTTP學(xué)習(xí)筆記

    會話跟蹤技術(shù)學(xué)習(xí)筆記(Cookie+Session)+ HTTP學(xué)習(xí)筆記

    1.1 Cookie 1. Cookie:是一種客戶端會話技術(shù),數(shù)據(jù)會被保存在客戶端,Cookie會攜帶數(shù)據(jù)訪問服務(wù)器,用以完成一次會話內(nèi)多次請求間的數(shù)據(jù)共享 2. 過程:瀏覽器(客戶端)先向服務(wù)端發(fā)送請求,服務(wù)端會發(fā)送一個Cookie給客戶端,在此后同一次會話中,每次客戶端都會將Cookie發(fā)送

    2024年02月10日
    瀏覽(25)
  • 九、會話控制——cookie、session、token

    九、會話控制——cookie、session、token

    HTTP是一種無狀態(tài)協(xié)議,它沒有辦法區(qū)分多次的請求是否來自于同一個客戶端,無法區(qū)分用戶。而產(chǎn)品中又大量存在這樣的需求,所以我們需要通過會話控制來解決問題。 常見的會話控制有三種: (1)cookie (2)session (3)token cookie 是HTTP服務(wù)器發(fā)送到用戶瀏覽器并保存在本

    2024年02月11日
    瀏覽(27)
  • SQLAlchemy 中的會話(Session)緩存詳解

    SQLAlchemy 的會話緩存(Session Cache)是 ORM 框架的核心特性之一,對于理解和高效使用 SQLAlchemy 至關(guān)重要。這個緩存機制主要作用在會話(Session)層面,提供了對數(shù)據(jù)庫交互的中間緩存層。以下是對 SQLAlchemy 會話緩存的詳細(xì)解釋: 一級緩存:會話緩存也被稱為一級緩存。它自動

    2024年02月02日
    瀏覽(14)
  • gin會話控制篇 - Cookie和Session

    HTTP是無狀態(tài)協(xié)議,服務(wù)器不能記錄瀏覽器的訪問狀態(tài),也就是說服務(wù)器不能區(qū)分兩次請求是否由同一個客戶端發(fā)出 Cookie就是解決HTTP協(xié)議無狀態(tài)的方案之一,中文是小甜餅的意思 Cookie實際上就是服務(wù)器保存在瀏覽器上的一段信息。瀏覽器有了Cookie之后,每次向服務(wù)器發(fā)送請求

    2024年01月21日
    瀏覽(24)
  • 微信小程序獲取文件session會話無效

    微信小程序獲取圖片文件時session會話失效,可以將圖片文件地址請求修改為post請求,返回文件流以base64編碼輸出。 具體請求方式如下:

    2024年02月15日
    瀏覽(20)
  • B/S結(jié)構(gòu)系統(tǒng)的會話機制(session)

    B/S結(jié)構(gòu)系統(tǒng)的會話機制(session)

    目錄 B/S結(jié)構(gòu)系統(tǒng)的會話機制(session) 每博一文案 1. session 會話機制的概述 2. 什么是 session 的會話 3. session 的作用 4. session 的實現(xiàn)原理解釋 5. 補充: Cookie禁用了,session還能找到嗎 ? 6. 總結(jié)一下到目前位置我們所了解的域?qū)ο螅?7. oa 項目的優(yōu)化體驗:使用上 session 會話機制:

    2024年02月01日
    瀏覽(16)
  • Servlet【 ServletAPI中的會話管理Cookie與Session】

    Servlet【 ServletAPI中的會話管理Cookie與Session】

    HTTP 協(xié)議自身是屬于 “無狀態(tài)” 協(xié)議. “無狀態(tài)” 的含義指的是: 默認(rèn)情況下 HTTP 協(xié)議的客戶端和服務(wù)器之間的這次通信, 和下次通信之間沒有直接的聯(lián)系.但是實際開發(fā)中, 我們很多時候是需要知道請求之間的關(guān)聯(lián)關(guān)系的. 例如登陸網(wǎng)站成功后, 第二次訪問的時候服務(wù)器就能知

    2024年02月09日
    瀏覽(58)
  • 如何讓你的會話更安全,淺析Session與Cookie

    如何讓你的會話更安全,淺析Session與Cookie

    ????????在我們面試的時候,面試官問及 XSS 漏洞的時候,我們常常會說比如劫持 Cookie,問及防御方法的時候,又常常會說設(shè)置 httponly ,本篇文章將從代碼層面簡單的普及 Session 和 Cookie 的生成過程,及防御的方法,希望看到這篇文章后,下一次遇到面試官的時候,你能夠

    2024年02月22日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包