1. 程式人生 > >WEB狀態管理機制剖析(cookie、session)

WEB狀態管理機制剖析(cookie、session)

1、狀態管理

    (1)狀態管理的含義

        將瀏覽器與web伺服器之間多次互動當做一個整體來看待,並且將多次互動所涉及的資料(即狀態)儲存下來。

    (2)如何進行狀態管理

        1)將狀態儲存在客戶端
            將狀態存放到瀏覽器(cookie技術)。
        2)將狀態儲存在伺服器端
            將狀態存放到web伺服器(session技術)。

2、cookie    

     (1)什麼是cookie?

            屬於客戶端的狀態管理技術。
            瀏覽器訪問web伺服器時,伺服器會將少量的資料以set-cookie訊息頭的方式傳送給瀏覽器,瀏覽器會將這些資料儲存下來;當瀏覽器再次訪問伺服器,會將之前儲存的這些資料以cookie訊息頭的方式傳送給伺服器。

     (2)建立cookie

            (即讓伺服器傳送set-cookie訊息頭給瀏覽器)
            Cookie c = new Cookie(String name,String value);
            name:cookie的名稱
            value:cookie的值
            response.addCookie(c);

     (3)檢視cookie

            Cookie[]  request.getCookies();
            注意:
                該方法有可能返回null。
            String cookie.getName();
            String cookie.getValue();

     (4)編碼問題

            cookie只能存放合法的ascii字元,如果要儲存中文,很顯然需要將中文轉換成合法的ascii字元。
            String URLEncoder.encode(String str,"utf-8");
            String URLDecoder.decode(String str,"utf-8");

     (5)生存時間

            cookie.setMaxAge(int seconds);
            注意
                a,單位是秒
                b,seconds > 0 : 瀏覽器會將cookie儲存在硬碟上,超過指定時間,會刪除這個cookie。
                  seconds = 0:刪除cookie。
                          比如,要刪除一個名稱為user的cookie
                              Cookie c = new Cookie("user","");
                              c.setMaxAge(0);
                              response.addCookie(c);
                  seconds < 0: 預設值,瀏覽器會將cookie儲存在記憶體裡面,只有瀏覽器不關閉,cookie會一直存在。  

     (6)路徑問題

             a,什麼是路徑問題
                 瀏覽器在向伺服器發請求時,會比較cookie的路徑與請求地址是否匹配,只有匹配的cookie才會傳送給伺服器。
             b,cookie的預設路徑等於建立cookie的元件的路徑。
             比如:
                 /web06_3/sub01/addCookie.jsp,則該jsp建立的cookie的路徑等於"/web06_3/sub01"
             c,匹配規則
                 要訪問的地址必須是cookie的路徑或者其子路徑,瀏覽器才會傳送該cookie
             d,設定cookie的路徑
                 cookie.setPath(String path);
                 經常設定為
                     cookie.setPath("/appname");
                這樣,可以保證某個元件所建立的cookie可以被同一個應用內部其他的元件訪問到。

      (7)cookie的限制

             a, cookie可以被使用者禁止。
             b, cookie不安全,如果有敏感資料,最好不要以cookie方式來儲存。如果一定要儲存,一定要加密。
             c, cookie只能夠儲存少量的資料(大約4k)
             d, 瀏覽器儲存的cookie的數量也有限制,大約是300個。

             e, cookie只能儲存字串。

3、session(會話)

       (1)session是什麼?

        一種伺服器端的狀態管理技術(將狀態儲存在伺服器上)
        當瀏覽器訪問web伺服器時,伺服器會建立一個session物件(該物件有一個唯一的id屬性值,類似於一個人的身份證號碼一樣,一般稱之為sessionId),接下來伺服器在預設情況下,會將sessionId以set-cookie訊息頭的方式傳送給瀏覽器;
        當瀏覽器再次訪問伺服器時,會將sessionId以cookie訊息頭的方式傳送過來,伺服器依據sessionId就可以找到之前建立的session物件。
        注意:如果使用者禁止cookie,可以使用其它的方式來發送sessionId。

      (2)如何獲得session物件(session建立和使用流程剖析)

        方式一
            HttpSession session =  request.getSession(boolean flag);
            當flag為true時
                伺服器會先檢視請求當中有沒有sessionId,如果沒有,伺服器會建立一個session物件;如果有,伺服器會依據sessionId查詢對應的session物件,如果找到了,則返回,找不到,建立一個新的session物件。
            當flag為false時
                伺服器會先檢視請求當中有沒有sessionId,如果沒有,返回null;如果有,伺服器會依據sessionId查詢對應的session物件,如果找到了,則返回,找不到,返回null。

               伺服器建立和使用session物件的流程如下:

       

          1-2.瀏覽器請求Web伺服器,伺服器生成某個servlet。
          3.伺服器建立某個session物件,該物件可以在servlet中通過request.getSession(boolean flag);獲取。
          4.伺服器以cookie的方式傳送sessionId。
          5.瀏覽器將sessionId儲存在瀏覽器記憶體中。
          6.瀏覽器再次訪問伺服器時會攜帶sessionId(瀏覽器不能關閉,否則session失效)。
          7.session物件存在的情況下,伺服器會依據sessionId查詢到session物件。如果找不到且flag為true,則生成新session物件
。 

        方式二
            HttpSession session = request.getSession();
            等價於request.getSession(true)。

       (3)常用的方法

        String getId();
        setAttribute(String name,Object obj);
        //如果依據綁訂名找不到綁訂值,返回null。
        Object getAttribute(String name);
        //解除繫結
        removeAttribute(String name);

      (4)session的超時

        1).什麼是session超時?
            伺服器會將空閒時間過長的session物件刪除掉。
        (因為session物件會佔用伺服器的記憶體空間,伺服器有可能會有大量的session物件需要維護,為了節省記憶體空間的佔用,經常需要刪除一些不太活躍的session物件)。
        2)伺服器預設的超時限制
            大部分伺服器預設的超時限制是30分鐘。
        3)修改伺服器預設的超時限制
            比如,要修改tomcat的超時限制
            tomcat_home/conf/web.xml檔案
        <session-config>
        <session-timeout>30</session-timeout>
        </session-config>
         也可以將上述配置放到某個應用對應的web.xml檔案當中,此時,該配置只針對某個應用起作用。
         4) setMaxInactiveInterval(int seconds);
             設定超時限制,單位是秒。
         5)立即刪除session物件
            invalidate();

      (5)使用者禁止cookie以後,如何繼續使用session?

        1)可以使用url重寫來解決這個問題
        2)什麼是url重寫?
                 瀏覽器向伺服器發請求時,要使用這樣的地址(在原有的地址後面新增sessionId)。這樣一來,瀏覽器每次向伺服器發請求時,伺服器就可以依據sessionId找到之前的session物件了。
       3)如何進行url重寫?
        a,連結地址、表單提交
            response.encodeURL(String url);
        比如:
            <a href="<%=response.encodeURL("some")%>">
            </a>
            <form action="<%=response.encodeURL("add.do")%>">
            </form>
        b,重定向    
            response.encodeRedirectURL(String url);
        比如:
            response.sendRedirect(
            response.encodeRedirectURL("abc.jsp"));
        c,轉發不用考慮。因為轉發是伺服器內部一個元件通過容器呼叫另外一個元件,與session無關。

4、session相關的案例

     (1)session驗證

       1),登入模組
           step1,建表
           create table t_user(
               id int primary key auto_increment,
               username varchar(50) unique,
               pwd varchar(30),
               name varchar(255),
               gender char(1)
           )type=innodb;
           insert into t_user(username,pwd,name,gender)
           values('kitty','test','hello kitty','m');
           unique : 唯一性約束。
           step2,建立一個web工程 web07_login
           step3,實體類 User
           step4, UserDAO
                   public User findByUsername(String username)
           step5,login.jsp
           step6,ActionServlet

      2),session驗證

          step1,登入成功以後,在session物件上綁訂一些資料。比如
              session.setAttribute("user",user);
          step2,對於需要保護的資源(登入成功以後才能訪問的地址,比如main.jsp),新增session驗證程式碼。比如
              Object obj = session.getAttribute("user");
              if(obj == null){
                  //沒有登入,跳轉到登入頁面
                  response.sendRedirect("login.jsp");
              }

            如,使用者在未登入情況下訪問需要登入的介面,伺服器處理過程如下圖所示:

          

            1-2.瀏覽器請求Web伺服器,伺服器生成某個servlet。
          3.伺服器建立某個session物件,該物件可以在servlet中通過request.getSession(boolean flag);獲取。
          4.伺服器以cookie的方式傳送sessionId。
          5.瀏覽器將sessionId儲存在瀏覽器記憶體中。

          6.Servlet物件獲取session中的屬性“user”,判斷使用者是否登入過。
          7.jsp中判斷,若從session中取不到user物件,表示未登入過,則通過伺服器傳送重定向請求(302狀態碼)。
          8.瀏覽器重新訪問重定向的地址,即登入介面。
             ......

5、比較session和cookie

     相對於cookie,session的優點:
        a,安全
        b,能夠儲存更豐富的資料型別
     缺點:
        session是將狀態儲存在伺服器端,會佔用大量的伺服器的記憶體空間(伺服器可以將狀態臨時儲存到檔案或者資料庫)。

轉載請註明出處:

http://blog.csdn.net/daijin888888/article/details/51133155

相關推薦

WEB狀態管理機制剖析cookiesession

1、狀態管理     (1)狀態管理的含義         將瀏覽器與web伺服器之間多次互動當做一個整體來看待,並且將多次互動所涉及的資料(即狀態)儲存下來。     (2)如何進行狀態管理   

javaweb:會話管理和儲存會話資料的兩種技術CookieSession

會話: 什麼是會話? •會話可簡單理解為:使用者開一個瀏覽器,點選多個超連結,訪問伺服器多個web資源,然後關閉瀏覽器,整個過程稱之為一個會話。 會話過程中要解決的一些問題? •每個使用者與伺服器進行互動的過程中,各自會有一些資料,程式要想辦法儲存每個使用者的

Docker的web管理平臺對比DockerUI ShipyardPortainerDaocloud

前言 最近,為了方便對命令列過敏的測試或開發人員,我決定部署一個視覺化的管理平臺來管理docker,在我重灌十幾次系統(當然,只是虛擬機器映象克隆),對比之後,終於選擇了一款心儀的管理平臺。 部署docker環境 安裝/升級你的Docker環境,建議使

HTTP 無狀態協議介紹以及CookieSession

之前一直聽過這個,但是具體含義讓表述又表述不好,所以這次打算整理下。 1.基礎瞭解 HTTP無狀態協議,是指協議對於事務處理沒有記憶能力。缺少狀態意味著如果後續處理需要前面的資訊,則它必須重傳,這樣可能導致每次連線傳送的資料量增大。另一方面,在伺服器

java記憶體管理機制剖析

最近利用工作之餘學習研究了一下java的記憶體管理機制,在這裡記錄總結一下。 1-1、java記憶體區域 當java程式執行時,java虛擬機器會將記憶體劃分為若干個不同的資料區域,這些記憶體區域建立和銷燬的時間各不相同,所承擔的功能也不相同,他們各司其職,各盡所責。這些區域的劃分如下圖 執行時資料區主

基於Python的使用者管理系統實現註冊登入

基於Python的使用者管理小系統,包含檔案讀寫操作,實現了使用者資訊註冊和登入的簡單功能。 class userLogReg: """ Created on 2018.11 @author: tox33 """ def __init__(self):

Android 日曆管理 Calendars的日程提醒增刪改查

package com.szwistar.emistar.calendar; import java.util.ArrayList; import java.util.Calendar; import java.util.HashMap; import java.util

JavaScript高級編程———數據存儲cookieWebStorage

npr this www one 指定 arr nco throw 訪問 JavaScript高級編程———數據存儲(cookie、WebStorage) <script> /*Cookie 讀寫刪

爬蟲原理與會話保持cookiessession詳解--python實現

一、爬蟲原理     我們知道網際網路是由大量計算機和網路構成的複雜系統,我們可以將其形象的比喻成一張蜘蛛網。網路的節點是計算機,計算機中儲存著大量的資料。爬蟲程式就是通過網路去採集指定計算機中資料的工具。一般來說,我們採集的資料大多是網頁上的資料,

Flask上下文管理機制流程原始碼剖析

Flask請求上下文管理 1 偏函式 partial 使用該方式可以生成一個新函式 from functools import partial def mod( n, m ): return n % m mod_by_100 = partial( mod, 100 ) # 100傳給n prin

筆記:XML-解析文檔-流機制解析器SAXStAX

輸入 tex 字符數 表示 getname 重要 樹形 puts ron DOM 解析器完整的讀入XML文檔,然後將其轉換成一個樹型的數據結構,對於大多數應用,DOM 都運行很好,但是,如果文檔很大,並且處理算法又非常簡單,可以在運行時解析節點,而不必看到完整的樹形

cookiesession的認識僅作記錄

含義 生命 jsp getattr 愛好 bound 打開 表單提交 dos 一、cookie機制和session機制的區別   具體來說cookie機制采用的是在客戶端保持狀態的方案,而session機制采用的是在服務器端保持狀態的方案。  同時我們也看到,由於在服務器端

記錄一些有關web安全以及cookiesession的文章

span 時間 token 內容 acs 服務器 prot 方案 存儲型xss session和cookie的區別和聯系:http://www.cnblogs.com/endlessdream/p/4699273.html HTTP是無狀態的協議,那麽客戶端與服務端的數據

VS2013 MVC Web項目使用內置的IISExpress支持局域網內部機器手機PC訪問調試

toc server user 機器 項目 這一 運行 vs2013 情況下 VS2013內置了IISExpress。做asp.net MVC的web項目開發時,Ctrl+F5和F5啟動項目運行(後者是調試模式)的同時都會打開IISExpress,事實上本機對該web項目走

任務計劃crontab服務管理chkconfigsystemd

-c sco fun 格式 包含 1-1 amp factor inux 任務計劃 crontab計劃任務文件任務計劃文件路徑/var/spool/cron/ cat /etc/crontab [root@shu-test ~]# cat /etc/crontab SHEL

web本地存儲localStoragesessionStorage

dex import bsp fill tle 類型 工具 臨時 而且 web 本地存儲 (localStorage、sessionStorage) 說明 對瀏覽器來說,使用 Web Storage 存儲鍵值對比存儲 Cookie 方式更直觀,而且容量更大,它包含兩種:l

TornadocookieXSRF用戶驗證

edi AD 構造 通過 dpf eth 客戶端瀏覽器 tor rec --------------------Cookie操作--------------------1、設置Cookie1、set_cookie(name,value,domain=None,expires

Django框架——狀態保持(cookiesession)

目錄 1.cookie 2.session 1.cookie 設定: HttpResponse.set_cookie(cookie名, value=cookie值, max_age=cookie有效期)(max_

Spring Boot + Spring Cloud 實現許可權管理系統 後端篇十九:服務消費RibbonFeign

技術背景 上一篇教程中,我們利用Consul註冊中心,實現了服務的註冊和發現功能,這一篇我們來聊聊服務的呼叫。單體應用中,程式碼可以直接依賴,在程式碼中直接呼叫即可,但在微服務架構是分散式架構,服務都執行在各自的程序之中,甚至部署在不同的主機和不同的地區。這個時候就需要相關的遠端呼叫技術了。 Spring

Spring Boot + Spring Cloud 實現許可權管理系統 後端篇二十:服務熔斷HystrixTurbine

線上演示 演示地址:http://139.196.87.48:9002/kitty 使用者名稱:admin 密碼:admin 雪崩效應 在微服務架構中,由於服務眾多,通常會涉及多個服務層級的呼叫,而一旦基礎服務發生故障,很可能會導致級聯故障,進而造成整個系統不可用,這種現象被稱為服務雪崩效應。服務雪崩