整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          Cookie&Session詳解

          Cookie&Session詳解

          話技術

          1. 會話:一次會話中包含多次請求和響應。
          • 一次會話:瀏覽器第一次給服務器資源發送請求,會話建立,直到有一方斷開為止
          1. 功能:在一次會話的范圍內的多次請求間,共享數據
          2. 方式:
          3. 客戶端會話技術:Cookie
          4. 服務器端會話技術:Session

          Cookie:小甜點

          1.概念:

          • 客戶端會話技術,將數據保存到客戶端

          2.快速入門:

          1. 創建Cookie對象,綁定數據
          • new Cookie(String name, String value)
          1. 發送Cookie對象
          • response.addCookie(Cookie cookie)
          1. 獲取Cookie,拿到數據
          • Cookie[] request.getCookies()

          3.實現原理

          • 基于響應頭set-cookie:name=value和請求頭cookie:name=value實現

          4.cookie的細節

          1. 一次可不可以發送多個cookie?
          • 可以
          • 可以創建多個Cookie對象,使用response調用多次addCookie方法發送cookie即可。
          1. cookie在瀏覽器中保存多長時間?
          2. 默認情況下,當瀏覽器關閉后,Cookie數據被銷毀

          3. 持久化存儲:
          • setMaxAge(int seconds)
          1. 正數:將Cookie數據寫到硬盤的文件中。持久化存儲。并指定cookie存活時間(單位為秒),時間到后,cookie文件自動失效
          2. 負數:默認值,當瀏覽器關閉后,Cookie數據被銷毀
          3. 零:刪除cookie信息
          4. cookie能不能存中文?
          • 在tomcat 8 之前 cookie中不能直接存儲中文數據。
          • 需要將中文數據轉碼---一般采用URL編碼(%E3)
          • 在tomcat 8 之后,cookie支持中文數據。特殊字符還是不支持,建議使用URL編碼存儲,URL解碼解析
          1. cookie共享問題?
          2. 假設在一個tomcat服務器中,部署了多個web項目,那么在這些web項目中cookie能不能共享?
          • 默認情況下cookie不能共享
          • setPath(String path):設置cookie的獲取范圍。默認情況下,設置的是當前的虛擬目錄
          • 如果要共享,則可以將path設置為"/"
          1. 不同的tomcat服務器間cookie共享問題?
          • setDomain(String path):如果設置一級域名相同,那么多個服務器之間cookie可以共享
          • setDomain(".baidu.com"),那么tieba.baidu.com和news.baidu.com中cookie可以共享

          5.Cookie的特點和作用

          1. cookie存儲數據在客戶端瀏覽器
          2. 瀏覽器對于單個cookie 的大小有限制(4kb) 以及 對同一個域名下的總cookie數量也有限制(20個)
          • 作用:
          1. cookie一般用于存出少量的不太敏感的數據
          2. 在不登錄的情況下,完成服務器對客戶端的身份識別

          JSP:入門學習

          1.概念:

          • Java Server Pages: java服務器端頁面
          • 可以理解為:一個特殊的頁面,其中既可以指定定義html標簽,又可以定義java代碼
          • 用于簡化書寫?。。?/li>

          2.原理

          • JSP本質上就是一個Servlet

          3.JSP的腳本:JSP定義Java代碼的方式

          1. <% 代碼 %>:定義的java代碼,在service方法中。service方法中可以定義什么,該腳本中就可以定義什么。
          2. <%! 代碼 %>:定義的java代碼,在jsp轉換后的java類的成員位置。(會引發線程安全問題)
          3. <%=代碼 %>:定義的java代碼,會輸出到頁面上。輸出語句中可以定義什么,該腳本中就可以定義什么。

          4. JSP的內置對象:

          • 在jsp頁面中不需要獲取和創建,可以直接使用的對象
          • jsp一共有9個內置對象。
          • 今天學習3個:
          • request
          • response
          • out:字符輸出流對象??梢詫祿敵龅巾撁嫔稀:蛂esponse.getWriter()類似
          • response.getWriter()和out.write()的區別:
          • 在tomcat服務器真正給客戶端做出響應之前,會先找response緩沖區數據,再找out緩沖區數據。
          • response.getWriter()數據輸出永遠在out.write()之前
          • 所以建議統一用一種方式來輸出,以免容易打亂布局,建議用out.write()

          Session:主菜

          1.概念:

          • 服務器端會話技術,在一次會話的多次請求間共享數據,將數據保存在服務器端的對象中。HttpSession

          2.快速入門:

          • 獲取HttpSession對象:
           HttpSession session=request.getSession();
          
          • 使用HttpSession對象:
           Object getAttribute(String name)
           void setAttribute(String name, Object value)
           void removeAttribute(String name)
          

          3.原理

          • Session的實現是依賴于Cookie的。

          4.細節:

          1. 當客戶端關閉后,服務器不關閉,兩次獲取session是否為同一個?
          • 默認情況下。不是。
          • 如果需要相同,則可以創建Cookie,鍵為JSESSIONID,設置最大存活時間,讓cookie持久化保存。
           Cookie c=new Cookie("JSESSIONID",session.getId());
           c.setMaxAge(60*60);
           response.addCookie(c);
          
          1. 客戶端不關閉,服務器關閉后,兩次獲取的session是同一個嗎?
          • 不是同一個,但是要讓他們為同一個。tomcat會自動完成以下工作(idea不行,idea會直接把work目錄里的SESSION.ser刪掉)
          • session的鈍化:
          • 在服務器正常關閉之前,將session對象系列化到硬盤上
          • session的活化:
          • 在服務器啟動后,將session文件轉化為內存中的session對象即可。
          1. session什么時候被銷毀?
          2. 服務器關閉

          3. session對象調用invalidate() 。

          4. session默認失效時間 30分鐘
          • 可以在 $Tomcat/conf/web.xml 選擇性配置修改

           <session-config>
           <session-timeout>30</session-timeout>
           </session-config>
          

          5.session的特點

          1. session用于存儲一次會話的多次請求的數據,存在服務器端
          2. session可以存儲任意類型,任意大小的數據
          • session與Cookie的區別:
          1. session存儲數據在服務器端,Cookie在客戶端
          2. session沒有數據大小限制,Cookie有
          3. session數據安全,Cookie相對于不安全

          在 Web 應用程序中(通俗點,可以理解成一個網站),Session 和 Cookie 是兩個非常重要的概念,主要用于實現用戶身份認證、數據傳遞等功能。今天就來講講這兩個東西。

          對于當時剛開始接觸到這兩個概念的我來說,這兩個東西是非常模糊的,當然,這樣也和我自己 Java 基礎不牢固有關,導致在學習 Java Web 的過程中,埋下了許多地雷。現如今,從新梳理下,希望能給屏幕前的你帶來收獲。

          本篇文章目標人群是學了后忘了的,學了后想要鞏固的。當然,還沒學,那就更好啦,直接看這一篇就夠了!

          Session 的概念

          Session 是 Web 應用程序中的一種會話管理機制,用于存儲和維護用戶的會話狀態。

          那問題來了,什么是「會話」?

          會話是指在用戶與服務器之間的一系列請求和響應之間的交互過程。

          當用戶訪問 Web 應用時,服務器會創建一個唯一的會話 ID,并將其存儲在用戶的瀏覽器中的 Cookie 中。在接下來的請求中,瀏覽器會將會話 ID 作為參數發送給服務器,以便服務器可以識別用戶并將其請求與之前的請求相關聯。

          為什么會有 Session?

          由于 HTTP 協議是無狀態的,當用戶在網站中進行多次請求,服務器并不能判斷這些請求是不是來自同一用戶,所以出現了一種技術,這種技術稱為「會話跟蹤技術」。

          會話跟蹤技術就能解決這個問題。與無狀態的通信相比,會話是一種有狀態的通信,這種通信至少需要一方來維護當前的狀態信息和歷史信息。

          Session 就是其中一種會話跟蹤技術,當然,后面說的 Cookie 也是。

          Session 的原理

          Session 的原理是基于服務器端的存儲和管理,因此相對來說比較安全。在用戶訪問 Web 應用程序時,服務器會為每個用戶創建一個唯一的 Session ID,服務器會將 Session ID 和對應的會話狀態存儲在內存或者數據庫中,同時也返回一份 Session ID 給瀏覽器,讓瀏覽器存儲在 Cookie 中,并在一定時間內保持有效。當用戶進行后續的請求時,服務器會根據 Session ID 來識別用戶,并獲取和維護用戶的會話狀態。最后,當用戶關閉瀏覽器或者超過一定時間沒有活動時,服務器會自動銷毀對應的 Session。

          Session 的優點是安全性相對較高,存儲容量可以存儲任意數據類型,并且可以設置失效時間。但是它也存在一些缺點:

          • 存儲在服務器端,需要占用服務器資源(比如內存資源)
          • 失效時間短,一般只有數分鐘或數小時
          • 難以跨域共享,不同域名的服務器無法共享 Session

          代碼如何寫?

          那服務器這邊是怎樣去存儲和管理的呢?代碼是怎樣寫的呢?

          在 Java Web 中,可以使用 Servlet API 中封裝好的 Session 對象(HttpSession)來進行操作。

          在Servlet API中,HttpSession 由 Servlet容器(比如 Tomcat)創建,它可以存儲任意的 Java 對象,我們可以通過 setAttribute() 方法將對象綁定到 Session 中,之后通過 getAttribute() 方法獲取綁定在 Session 中的對象。

          也就是說,可以在一次會話的多次請求間共享數據,將數據保存在服務器端的對象中。

          • 獲取 Session 對象

          我們可以通過 HttpServletRequest 的 getSession() 方法來獲取 HttpSession 對象。如果 HttpSession 對象不存在,則會創建一個新的 Session 對象。

          Session 常用方法

          以下是一些常用的 Session 對象的方法:

          • setAttribute(String name, Object value):將一個名為 name,值為 value 的對象綁定到 Session 中。
          • getAttribute(String name):獲取 Session 中綁定的名為 name 的對象。
          • removeAttribute(String name):從 Session 中刪除名為 name 的對象。
          • getId():獲取 Session 的唯一標識符。
          • getCreationTime():獲取 Session 的創建時間。
          • getLastAccessedTime():獲取 Session 的最后訪問時間。
          • setMaxInactiveInterval(int interval):設置 Session 的最大不活動時間間隔,單位為秒。
          • getMaxInactiveInterval():獲取 Session 的最大不活動時間間隔。

          示例代碼:

          SessionServlet:

          @WebServlet(name="SessionServlet", urlPatterns="/session")
          public class SessionServlet extends HttpServlet {
              @Override
              protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                  // 獲取 Session 對象
                  HttpSession session=req.getSession();
                  // 將用戶名存儲到 Session 中
                  session.setAttribute("username", req.getParameter("username"));
                  // 重定向到另一個頁面
                  resp.sendRedirect("anotherPage.jsp");
              }
          
              @Override
              protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                  super.doPost(req, resp);
              }
          }
          復制代碼

          這里使用了 @WebServlet 來配置這個 Servlet,處理的請求映射的路徑為 /session,主要進行了 Session 對象的相關操作,存儲了用戶信息,重定向到另一個頁面,通過 Session,此時在另一個頁面,就能夠獲取到存儲的信息。

          anotherPage.jsp

          <%@ page contentType="text/html;charset=UTF-8" language="java" %>
          <%@ page session="true" %>
          <html>
          <head>
              <title>這里是有Session的</title>
          </head>
          <body>
              <%
                  String username=(String) session.getAttribute("username");
              %>
              <h2>從Session中獲取的信息:<%=username%></h2>
          </body>
          </html>
          復制代碼

          生成唯一 ID 返回給瀏覽器

          @WebServlet(name="SessionIdServlet", urlPatterns="/sessionId")
          public class SessionIdServlet extends HttpServlet {
              @Override
              protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                  HttpSession session=req.getSession();
                  // 獲取 SessionID
                  String sessionId=session.getId();
                  // 創建名為JSESSIONID的 Cookie
                  Cookie cookie=new Cookie("JSESSIONID", sessionId);
                  // 設置 Cookie 效時間為30分鐘
                  cookie.setMaxAge(30 * 60);
                  // 將 Cookie 追加到響應中返回給瀏覽器
                  resp.addCookie(cookie);
              }
          
              @Override
              protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                  super.doPost(req, resp);
              }
          }
          復制代碼

          通過瀏覽器向這個路徑 /sessionId 發起請求,就會接收到服務器返回的響應,這里的響應就有我們進行處理的名為 JSESSIONID 的 Cookie

          Cookie 的概念

          Cookie 和 Session 總是會被拿來比較的。Cookie 和 Session 都是用來跟蹤瀏覽器用戶身份的會話技術,或者說一種機制。它們都可以實現在多個頁面之間共享用戶的狀態。

          Cookie 的原理

          Cookie 是一種在客戶端(瀏覽器)保存數據的機制。

          瀏覽器第一次發送請求到服務器,服務器就創建 Cookie(上面的代碼中我們寫了),該 Cookie 中包含著信息,可以是用戶的信息(用戶偏好設置、廣告偏好),然將該 Cookie 發送到瀏覽器。

          瀏覽器之后再次訪問服務器時就會攜帶服務器創建的 Cookie,這不需要我們做任何操作,不需要寫任何代碼,瀏覽器幫我們實現了在每一次的請求中都攜帶上 Cookie。服務器端通過 Cookie 中攜帶的數據區分不同的用戶。

          Cookie 的優點是可以長時間保存,并且可以在客戶端設置,但是它也存在一些缺點:

          • 安全性相對較差,容易被不法分子獲取
          • 存儲容量有限,一般只能存儲 ASCII 碼
          • 失效時間可以設置,但是客戶端可以隨時清除 Cookie

          總結

          Session 是一種服務器端的存儲機制,它將用戶狀態信息存儲在服務器上,每個用戶都有一個獨立的 Session。

          在用戶第一次訪問服務器的時候,服務器會為其創建一個 Session,并將 Session ID 放到一個名為 JSESSIONID 的 Cookie 中發送給瀏覽器。

          Cookie 是一種客戶端(瀏覽器)存儲機制,它將用戶狀態信息存儲在客戶端瀏覽器上。我們知道,用戶第一次訪問服務器的時候,服務器會將一些數據(比如 JSESSIONID)寫入 Cookie 并發送給客戶端,客戶端在后續的請求中會將 Cookie 發送給服務器。

          在存儲容量方面,Cookie 的存儲容量較小,一般只能存儲 ASCII 碼,而 Session 可以存儲任意數據類型。在安全性方面,Session 相對于 Cookie 更加安全,因為 Session 存儲在服務器,客戶端無法直接訪問。在跨域共享方面,Cookie 可以跨域共享,而 Session 只能在同一域名下共享。

          最后的最后

          由本人水平所限,難免有錯誤以及不足之處, 屏幕前的靚仔靚女們 如有發現,懇請指出!

          最后,謝謝你看到這里,謝謝你認真對待我的努力,希望這篇博客對你有所幫助!

          你輕輕地點了個贊,那將在我的心里世界增添一顆明亮而耀眼的星!

          equest和response

          request:封裝了http請求信息,通過這個對象去獲取請求信息,他是ServletRequest的子接口

          response:封裝了相應信息

          //獲取姓名的值

          //姓名:< input type=“text” name=“username” id=“username”>< br/>

          //input屬性name的值

          String name=request.getParameter(“username”); 獲取多個值getParameterValues

          System.out.println(name);

          //response.getWiter()方法,把結果相應到瀏覽器

          PrintWriter out=response.getWriter();

          out.write("<h 1 >"+name+"</ h1>");

          轉碼

          request.setCharacterEncoding(“utf-8”);

          response.setContentType(“text/html;charset=utf-8”);

          //請求轉發:把請求轉發給另一個servlet處理

          String path="/testServlet";

          request.getRequestDispatcher(path).forward(request, response);

          //請求重定向

          response.sendRedirect(“testServlet”);

          1.請求轉發和請求重定向

          本質區別:請求轉發只是發了一次請求,重定向發了兩次請求

          (1)請求轉發:地址欄還是初次請求的地址欄

          請求重定向:地址欄不是初次請求的地址欄,地址欄是最后一次相應的地址欄

          (2)請求轉發:在最終的servlet中,request對象和中轉的request對象是同一個對象

          請求重定向:最終的servlet中,request對象和中轉的request對象不是同一個對象

          (3)請求轉發:‘/’代表當前web應用的根目錄

          請求重定向:‘/’代表當前web站點的根目錄

          (4)請求轉發:只能轉到當前web資源

          請求重定向:可以重定向到外部資源

          2.表單重復提交

          (1)點擊了瀏覽器的后退按鈕,再點擊提交

          (2)在相應頁面未完成響應時,重復點擊提交按鈕

          (3)在表單請求servlet,而servlet又通過轉發的方式相應到一個servlet處理,當我刷新時,地址欄還是原來請求的那個地址欄,這樣就出現了重復提交。重定向不會出現重復提交

          /***********************************************************************/

          設置令牌

          < body>

          <%

          String uuid=UUID.randomUUID().toString().replace("-","");

          request.getSession().setAttribute(“token”, uuid);

          %>

          < form action=“work” method=“post”>

          < input type=“hidden” value="<%=uuid%>" name=“token”>

          用戶名:< input type=“text” name=“user” id=“username”>< br/>

          密碼:< input type=“text” name=“pwd” id=“pwd”>< br/>

          < input type=“submit” value=“提交”>

          < /form>

          < /body>

          瀏覽器需要對其發出的每個請求消息都進行標識

          這個標識號就稱之為會話ID(SessionID)

          獲取session

          HttpSession session=request.getSession();


          主站蜘蛛池模板: 久久久综合亚洲色一区二区三区| 日韩亚洲一区二区三区| 末成年女AV片一区二区| 国产在线观看一区二区三区| 伊人色综合视频一区二区三区| 精品一区二区三区无码免费视频 | 日本一区二区在线免费观看| 亚洲中文字幕久久久一区| 精品亚洲AV无码一区二区三区| 精品无码人妻一区二区三区品| 无码国产精品一区二区免费vr | 亚洲一区中文字幕在线观看| 日韩精品无码中文字幕一区二区 | 99久久精品午夜一区二区| 日韩精品电影一区亚洲| 无码人妻精品一区二| 亚洲一区二区三区在线视频| 久久精品国产一区二区| 日本欧洲视频一区| 在线视频一区二区三区| 91精品乱码一区二区三区| 精品国产日韩亚洲一区在线| 日韩电影在线观看第一区| 中文字幕一区二区三区在线播放 | 中文字幕一区二区三区精华液| 国精产品一区一区三区免费视频| 99精品国产高清一区二区三区| 性无码免费一区二区三区在线| 搡老熟女老女人一区二区| 无码人妻一区二区三区兔费| 国产主播一区二区三区在线观看| 成人乱码一区二区三区av| 无码精品人妻一区二区三区免费看| 亚洲国产成人久久综合一区| 四虎成人精品一区二区免费网站 | 手机看片福利一区二区三区| 国产传媒一区二区三区呀| 亚洲爽爽一区二区三区| 无码国产精品一区二区免费3p| 亚洲AV日韩AV一区二区三曲| 亚洲国产激情一区二区三区|