乱世王者8天150万 | 財經 | 資源 | 理財 | 考研 | 職場 | 論文 | 資格 | 股票學院 |

股票學院: 股票入門 - 股票知識 - 股票術語 - 炒股技巧 - 選股技巧 - 跟莊技巧 - 炒股經驗 - 投資策略 - K線圖 - 均線 - 分時圖 - 成交量 - 波浪理論 - 基本面分析 - 心理分析 - 漲停研究 - 趨勢線 - 江恩理論 - MACD - KDJ - 技術指標 - 財經股票書籍在線閱讀 - 金融類書籍下載 - 銀行學院 - 保險學院 - 外匯學院 - 債券學院 - 股票學院 - 基金學院 - 港股學院 - 黃金學院

當前位置:乱世王者8天150万 > 金融云 > 文章正文

乱世王者作弊器:Tomcat 中的 Session 和 Cookie的愛恨情仇

時間:2019-05-15 16:40:58來源:頓悟源碼作者:佚名

    乱世王者8天150万 www.bubvk.icu HTTP 是一種無狀態通信協議,每個請求之間相互獨立,服務器不能識別曾經來過的請求。而對于 Web 應用,它的活動都是依賴某個狀態的,比如用戶登錄,此時使用 HTTP 就需要它在一次登錄請求后,有為后續請求提供已登錄信息的能力。

    Tomcat 中的 Session 和 Cookie的愛恨情仇

    解決辦法就是使用 Cookie,它由服務器返回給瀏覽器,瀏覽器緩存并在每次請求時將 cookie 數據提交到服務器。Cookies 在請求中以明文傳輸,且大小限制 4KB,顯然把所有狀態數據保存在瀏覽器是不靠譜的,主流做法是:

    • 瀏覽器發出第一個請求時,服務器為用戶分配一個唯一標識符,返回并存入瀏覽器的 Cookies 中
    • 服務器內部維護一個全局的請求狀態庫,并使用生成的唯一標識符關聯每個請求的狀態信息
    • 瀏覽器后續發出的請求,都將唯一標識符提交給服務器,以便獲取之前請求的狀態信息

    為了方便管理,服務器把整個過程稱為會話,并抽象成一個 Session 類,用于識別和存儲有關該用戶的信息或狀態。

    接下來,將通過會話標識符的解析和生成,Session 的創建、銷毀和持久化等問題,分析 Tomcat 的源碼實現,版本使用的是 6.0.53。

    1. 解析會話標識符

    Cookie 作為最常用的會話跟蹤機制,所有的 Servlet 容器都支持,Tomcat 也不例外,在 Tomcat 中,表示存儲會話標識符的 cookie 的標準名字是 JSESSIONID。

    如果如果瀏覽器不支持 Cookie,也可以使用以下辦法,記錄標識符:

    • URL 重寫: 作為路徑參數包含到 url 中,如 /path;JSESSIONID=xxx
    • URL 請求參數: 將會話唯一標識作為查詢參數添加到頁面所有鏈接中,如 /path?JSESSIONID=xxx
    • FORM 隱藏字段: 表單中使用一個隱藏字段存儲唯一值,隨表單提交到服務器

    Tomcat 就實現了從 URL 重寫路徑和 Cookie 中提取 JSESSIONID。在分析源碼之前,首先看下設置 Cookie 的響應和帶 Cookie 的請求它們頭域的關鍵信息:

    1. // 設置 Cookie 
    2. HTTP/1.1 200 OK 
    3. Server: Apache-Coyote/1.1 
    4. Set-Cookie: JSESSIONID=56AE5B92C272EA4F5E0FBFEFE6936C91; Path=/examples 
    5. Date: Sun, 12 May 2019 01:40:35 GMT 
    6.  
    7. // 提交 Cookie 
    8. GET /examples/servlets/servlet/SessionExample HTTP/1.1 
    9. Host: localhost:8080 
    10. Cookie: JSESSIONID=56AE5B92C272EA4F5E0FBFEFE6936C91 

    1.1 從 URL 重寫路徑

    一個包含會話 ID 路徑參數的 URL 如下:

    1. //localhost:8080/examples/SessionExample;JSESSIONID=1234;n=v/?x=x 

    簡單來看就是查找匹配分號和最后一個斜線之間的 JSESSIONID,事實也是如此,只不過 Tomcat 操作的是字節,核心代碼在 CoyoteAdapter.parsePathParameters() 方法,這里不在貼出。

    1.2 從 Cookie 頭域

    觸發 Cookie 解析的方法調用如下:

    1. CoyoteAdapter.service(Request, Response) 
    2. └─CoyoteAdapter.postParseRequest(Request, Request, Response, Response) 
    3.  └─CoyoteAdapter.parseSessionCookiesId(Request, Request) 
    4.   └─Cookies.getCookieCount() 
    5.    └─Cookies.processCookies(MimeHeaders) 
    6.     └─Cookies.processCookieHeader(byte[], int, int) 

    這個 processCookieHeader 操作的是字節,解析看起來不直觀,在 Tomcat 內部還有一個被標記廢棄的使用字符串解析的方法,有助于理解,代碼如下:

    1. private void processCookieHeader(  String cookieString ){ 
    2.   // 多個 cookie 值以逗號分割 
    3.   StringTokenizer tok = new StringTokenizer(cookieString, ";", false); 
    4.   while (tok.hasMoreTokens()) { 
    5.     String token = tok.nextToken(); 
    6.     // 獲取等號的位置 
    7.     int i = token.indexOf("="); 
    8.     if (i > -1) { 
    9.       // 獲取name 和 value 并去除空格 
    10.       String name = token.substring(0, i).trim(); 
    11.       String value = token.substring(i+1, token.length()).trim(); 
    12.       // RFC 2109 and bug 去除兩頭的雙引號 " 
    13.       value=stripQuote( value ); 
    14.       // 從內部 cookie 緩存池中獲取一個 ServerCookie 對象 
    15.       ServerCookie cookie = addCookie(); 
    16.       // 設置 name 和 value 
    17.       cookie.getName().setString(name); 
    18.       cookie.getValue().setString(value); 
    19.     } else { 
    20.       // we have a bad cookie.... just let it go 
    21.     } 
    22.   } 

    解析完畢,接下來就是在 parseSessionCookiesId 方法遍歷并嘗試匹配名稱為 JSESSIONID 的 Cookie,如果存在,則將其值設為 Request 的 requestedSessionId,與內部的一個 Session 對象關聯。

    2. 生成會話 Cookie

    相關閱讀

    焦點圖文

    關于我們 | 廣告服務 | 商務合作 | 網站地圖

    版權所有 Copyright(C)2018-2020 蘇州騏云躍網絡科技有限公司,未經授權禁止復制或建立鏡像,否則將依法追究法律責任!
    聲明:我們不做任何形式的代客理財及投資指導,凡是以天下金融網名義做股票推薦的行為均屬違法!
    廣告商的言論與行為均與天下金融網無關!股市有風險,投資需謹慎。
    蘇公網安備 32050502000166號
    蘇ICP備14018528號
    商務合作:乱世王者8天150万

    天下金融網版權所有