日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

HTTP協議是無狀態協議,每次同一瀏覽器向服務器請求時,服務器都會將該請求視為新的請求,因此我們需要會話跟蹤技術來實現同一會話內數據共享.

深入理解Cookie與Session:實現用戶跟蹤和數據存儲

今日目標

掌握客戶端會話跟蹤技術Cookie

掌握服務端會話跟蹤技術Sesssion

一、會話跟蹤技術介紹

會話:用戶打開瀏覽器,訪問web服務器的資源,會話建立,直到有一方斷開連接,會話結束。一次會話中可以包含多次請求和響應。

HTTP協議是無狀態協議,每次同一瀏覽器向服務器請求時,服務器都會將該請求視為新的請求,因此我們需要會話跟蹤技術來實現同一會話內數據共享

思考:下圖建立幾個會話?

每個瀏覽器都會與服務端建立了一個會話,加起來總共是3個會話。

思考:服務器如何識別多次請求是否來自于同一瀏覽器?這就需要我們學習今天的內容,會話跟蹤技術。

會話跟蹤:一種維護瀏覽器狀態的方法,服務器需要識別多次請求是否來自于同一瀏覽器,以便在同一次會話的多次請求間共享數據

原因:HTTP協議是無狀態的,每次瀏覽器向服務器請求時,服務器都會將該請求視為新的請求,因此我們需要會話跟蹤技術來實現會話內數據共享

思考:一個會話中的多次請求為什么要共享數據呢?有了這個數據共享功能后能實現哪些功能呢?

購物車功能: 加入購物車和去購物車結算是兩次請求,但是后面這次請求要想展示前一次請求所添加的商品,就需要用到數據共享。

記住我功能:當用戶登錄成功后,勾選記住我按鈕后下次再登錄的時候,網站就會自動填充用戶名和密碼,簡化用戶的登錄操作,多次登錄就會有多次請求,他們之間也涉及到共享數據

實現方式:

  • 客戶端會話跟蹤技術:Cookie。
  • 服務端會話跟蹤技術:Session。

二、Cookie基本使用

Cookie:客戶端會話跟蹤技術,將數據保存到客戶端,以后每次請求都攜帶Cookie數據進行訪問

1、基本使用

(1)發送Cookie

  • 創建Cookie對象,設置數據。
Cookie cookie = new Cookie("key","value");
  • 發送Cookie到客戶端:使用response對象。
response.addCookie(cookie);

(2)獲取Cookie

  • 獲取客戶端攜帶的所有Cookie,使用request對象。
Cookie[] cookies = request.getCookies();
  • 遍歷數組,獲取每一個Cookie對象:for。
  • 使用Cookie對象方法獲取數據。
cookie.getName();
cookie.getValue();

2、代碼實現

  • 創建08_Cookie_Session的Maven Web項目,并添加Servlet依賴在Pom.xml中。
<dependencies>
    <dependency>
      <groupId>JAVAx.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.1</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>
 
Cookie[] cookies = request.getCookies();
  • 創建AServlet用于發送Cookie到瀏覽器。
 
package com.zbbmeta.cookie;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
/**
 * 發送Cookie
 */
@WebServlet(value = "/a")
public class Aservlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //get請求
        //1.創建cookie對象
        Cookie cookie = new Cookie("name","lisi");

        //2.發送cookie對象到瀏覽器
        response.addCookie(cookie);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //post請求
        doGet(request, response);
    }
}
  • 創建BServlet用于獲取Cookie數據。
package com.zbbmeta.cookie;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * 獲取Cookie
 */
@WebServlet(value = "/b")
public class Bservlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //get請求
        //3.獲取客戶端攜帶的所有Cookie,使用request對象
        Cookie[] cookies = request.getCookies();
        response.setContentType("text/html;charset=utf-8");
        PrintWriter writer = response.getWriter();
        if(cookies!=null){
            //4.遍歷數組,獲取每一個Cookie對象:for
            for (Cookie cookie : cookies) {
                //5.使用Cookie對象方法獲取數據
                String name = cookie.getName();
                String value = cookie.getValue();
                writer.write(name+" = "+value+"<br>");
            }
        }else {

            writer.write("cookie不存在<br>");
        }

    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //post請求
        doGet(request, response);
    }
}
  • 在瀏覽器中先訪問地址:http://localhost:8080/cookie-session/a,然后在訪問http://localhost:8080/cookie-session/b查看瀏覽器結果,如圖所示:

三、Cookie原理

Cookie的實現是基于HTTP協議的。

  • 響應頭:set-cookie。
  • 請求頭:cookie。

在瀏覽器 查看Cookie。

1、Cookie使用細節 3.1Cookie 存活時間

  • 默認情況下,Cookie 存儲在瀏覽器內存中,當瀏覽器關閉,內存釋放,則Cookie被銷毀。
  • setMaxAge(int seconds):設置Cookie存活時間,但是是秒 負數:默認值,Cookie在當前瀏覽器內存中,當瀏覽器關閉,則 Cookie被銷毀 正數:將 Cookie寫入瀏覽器所在電腦的硬盤,持久化存儲。到時間自動刪除。

  • 零:立即過期,步驟和結果和正數步驟一致,這里就不掩飾了 完整代碼:
  • AServlet。
package com.zbbmeta.cookie;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
/**
 * 發送Cookie
 */
@WebServlet(value = "/a")
public class Aservlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //get請求
        //1.創建cookie對象
        Cookie cookie = new Cookie("name","lisi");
        //3. setMaxAge(int seconds):設置Cookie存活時間,但是是秒
        cookie.setMaxAge(10);
//        cookie.setMaxAge(-1);
        //cookie.setMaxAge(0);
        //2.發送cookie對象到瀏覽器
        response.addCookie(cookie);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //post請求
        doGet(request, response);
    }
}
 

2、Cookie 存儲問題

  • 如需要存儲空格,則需要進行轉碼:URL編碼 會出現問題。

  • 解決方法

在發送cookie端進行URL編碼。

URLEncoder.encode(name,"UTF-8");

在獲取cookie端進行URL解碼。

value = URLDecoder.decode(name,"UTF-8");

瀏覽器顯示結果。

  • 完整代碼。
  • AServlet。
package com.zbbmeta.cookie;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.NET.URLDecoder;
import java.net.URLEncoder;

/**
 * 發送Cookie
 */
@WebServlet(value = "/a")
public class Aservlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //get請求
        //1.創建cookie對象
        String name = " lisi";
        name = URLEncoder.encode(name,"UTF-8");
        Cookie cookie = new Cookie("name",name);
        //3. setMaxAge(int seconds):設置Cookie存活時間,但是是秒
        cookie.setMaxAge(10);
//        cookie.setMaxAge(-1);
        //cookie.setMaxAge(0);
        //2.發送cookie對象到瀏覽器
        response.addCookie(cookie);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //post請求
        doGet(request, response);
    }
}
  • BServlet
 
package com.zbbmeta.cookie;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;

/**
 * 獲取Cookie
 */
@WebServlet(value = "/b")
public class Bservlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //get請求
        //3.獲取客戶端攜帶的所有Cookie,使用request對象
        Cookie[] cookies = request.getCookies();
        response.setContentType("text/html;charset=utf-8");
        PrintWriter writer = response.getWriter();
        if(cookies!=null){
            //4.遍歷數組,獲取每一個Cookie對象:for
            for (Cookie cookie : cookies) {
                //5.使用Cookie對象方法獲取數據
                String name = cookie.getName();
                String value = cookie.getValue();
                value = URLDecoder.decode(value,"UTF-8");
                writer.write(name+" = |"+value+"<br>");
            }
        }else {

            writer.write("cookie不存在<br>");
        }

    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //post請求
        doGet(request, response);
    }
}
  • Tomcat7 Cookie 不能直接存儲中文,Tomcat8 Cookie可以存儲中文,但不能存儲空格

四、Session基本使用

Session:服務端會話跟蹤技術:將數據保存到服務端

1、基本使用

(1)獲取Session

  • JavaEE 提供 HttpSession接口,來實現一次會話的多次請求間數據共享功能
  • 使用: 獲取Session對象
HttpSession session = request.getSession();

(2)Session對象功能
  • Session對象功能:
void setAttribute(String name, Object o)//存儲數據到 session 域中
   Object getAttribute(String name) //根據 key,獲取值
   void removeAttribute(String name) //根據 key,刪除該鍵值對

2、代碼實現

  • 創建CServlet用于存儲數據到Session對象。
package com.zbbmeta.session;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * 1.存儲Session數據到服務器
 */
@WebServlet(value = "/c")
public class CServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //get請求
        //1.獲取Session對象
        HttpSession session = request.getSession();
        //2.存儲數據到session
        session.setAttribute("name","session_wangwu");
        response.setContentType("text/html;charset=utf-8");
        PrintWriter writer = response.getWriter();

        writer.write("訪問了C資源"+"<br>");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //post請求
        doGet(request, response);
    }
}
  • 創建DServlet用于從Session對象獲取數據。
 
package com.zbbmeta.session;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * 2.在Session對象中獲取數據
 */
@WebServlet(value = "/d")
public class DServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //get請求
        //1.獲取Session對象
        HttpSession session = request.getSession();
        //2.存儲數據到session
        Object name = session.getAttribute("name");
        response.setContentType("text/html;charset=utf-8");
        PrintWriter writer = response.getWriter();
        writer.write("訪問了D資源"+"<br>");
        if(name!=null){
            writer.write(name.toString()+"<br>");
        }else {
            writer.write("Session數據不存在"+"<br>");
        }
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //post請求
        doGet(request, response);
    }
}
  • 在瀏覽器中先訪問地址:http://localhost:8080/cookie-session/c,然后在訪問http://localhost:8080/cookie-session/d查看瀏覽器結果,如圖所示:

五、Session原理

Session基于Cookie實現

思考:如果新開一個瀏覽器,還是同一個session對象么?

答案:上圖顯示的獲取的Session對象不是一個,每一個瀏覽器都會獲取一個新的Session對象。

  • 判斷Session對象是否是新對象代碼 CServlet。
package com.zbbmeta.session;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * 1.存儲Session數據到服務器
 */
@WebServlet(value = "/c")
public class CServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //get請求
        response.setContentType("text/html;charset=utf-8");

        PrintWriter writer = response.getWriter();
        //1.獲取Session對象
        HttpSession session = request.getSession();

        //3.判斷Session是否是新對象
        boolean aNew = session.isNew();
        //4.獲取SessionID
        String id = session.getId();
        writer.write("session 是新的= "+aNew+" session id : "+id+"<br>");

        //2.存儲數據到session
        session.setAttribute("name","session_wangwu");


        writer.write("訪問了C資源"+"<br>");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //post請求
        doGet(request, response);
    }
}
  • DServlet
 
package com.zbbmeta.session;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * 2.在Session對象中獲取數據
 */
@WebServlet(value = "/d")
public class DServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //get請求
        response.setContentType("text/html;charset=utf-8");
        PrintWriter writer = response.getWriter();
        //1.獲取Session對象
        HttpSession session = request.getSession();
        //3.判斷Session是否是新對象
        boolean aNew = session.isNew();
        //4.獲取SessionID
        String id = session.getId();
        writer.write("session 是新的= "+aNew+" session id : "+id+"<br>");

        //2.存儲數據到session
        Object name = session.getAttribute("name");

        writer.write("訪問了D資源"+"<br>");
        if(name!=null){
            writer.write(name.toString()+"<br>");
        }else {
            writer.write("Session數據不存在"+"<br>");
        }
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //post請求
        doGet(request, response);
    }
}
  • 瀏覽器結果

六、Session使用細節

1、Session 鈍化、活化

  • Session 鈍化、活化: 服務器重啟后,Session中的數據是否還在? 鈍化:在服務器正常關閉后, Tomcat自動將 Session數據寫入硬盤的文件中活化:再次啟動服務器后,從文件中加載數據到Session中。

在IDEA中配置鈍化

查看鈍化數據

查看鈍化數據的前臺條件是,我們已經有Session對象存儲數據。

  • 我們現在的08_Cookie_Session項目啟動的,并且訪問了c資源。
  • 關閉項目。
  • 根據路徑查看session數據。
  • 發現有后綴為.ser的文件。
  • 重新啟動.ser文件就不存在了(步驟五就是活化)。

2、Seesion 銷毀

(1)默認情況下,無操作,30分鐘自動銷毀

  • 獲取存活時間方式。
//5.獲取存活時間
        int maxInactiveInterval = session.getMaxInactiveInterval();
  • 訪問c,瀏覽器結果。

  • 停留10s,訪問d,瀏覽器結果。

思考:為什么停留10s后,session對象的存活時間還是1800s?

存活時間表示的是沒有訪問資源的情況下,如果訪問了,則存活時間重新變為1800s.

(2)web.xml配置存活時間

可以通過web.xml進行配置,單位為分鐘。

<?xml versinotallow="1.0" encoding="UTF-8"?>
<web-App xmlns="http://xmlns.jcp.org/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
 version="4.0">

 <session-config>
<!--  單位是分鐘-->
  <session-timeout>2</session-timeout>
 </session-config>
</web-app>

  • 調用 Session對象的 invalidate()方法。

注意:最好關閉瀏覽器再打開。

3、Cookie和Session的對比

  • 相同點: Cookie 和 Session 都是來完成一次會話內多次請求間數據共享的。
  • 區別 鍵值對數量:Cookie 存一個鍵和一個值,Session 存n個鍵和值存儲位置:Cookie 是將數據存儲在客戶端,Session 將數據存儲在服務端安全性:Cookie 不安全,Session 安全數據大小:Cookie 最大4KB,Session 無大小限制存儲時間:Cookie默認瀏覽器關閉,Session 默認30分鐘服務器性能:Cookie 不占服務器資源,Session 占用服務器資源。

分享到:
標簽:Cookie
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定