JavaEE 要懂的小事:三、圖解Session(會話)

來源:互聯網
上載者:User

標籤:

Writer      :BYSocket(泥沙磚瓦漿木匠)

微         博:BYSocket

豆         瓣:BYSocket

FaceBook:BYSocket

Twitter    :BYSocket

相繼 圖解Http協議 和 圖解Cookie 之後,中間迷茫期哈,沒寫了!可是又要告訴你自己明明喜歡寫為啥不寫了!那就寫吧,學到老學到老~ 然後寫到老!本系列皆以圖為主,力求簡單易懂,娓娓道來`


一、Session由來

HTTP的無狀態,也就是說,每次請求都是獨立的線程。舉個例子吧:購物中,你選擇了A商品,加入購物車,這就是A線程。然後在選擇B商品就是B線程。可是每次線程獨立(對容器而言,A、B成了不同的使用者),線程A不知道有B,B也不知道A。如何一起付款呢?

簡答來說:怎麼儲存同個使用者多個請求工作階段狀態呢?自然HTTPS保證串連是安全的,可以使它與一個會話關聯。

問題就在於如何跟蹤同一個使用者,選擇自然很多:

1、EJB(有狀態會話bean儲存工作階段狀態) 環境苛刻需要帶EJB的J2EE伺服器,而不是Tomcat這種Web容器。

2、資料庫(這貌似萬能的。針對資料)

3、就是我們要講的HttpSeesion儲存跨一個特定使用者多個請求的工作階段狀態

4、上面說的HTTPS,條件太苛刻了。

二、Session機制

機制,什麼用詞有點高大上。其實就是把它內在的一點東西說出來。主要兩個W:What?How?

What is Session?

Session代表著伺服器用戶端一次會話的過程。直到session失效(服務端關閉),或者用戶端關閉時結束。

How does session works?

Session 是儲存服務端的,並針對每個用戶端(客戶),通過SessionID來區別不同使用者的。Session是以Cookie技術或URL重寫實現。預設以Cookie技術實現,服務端會給這次會話創造一個JSESSIONID的Cookie值。

補充

其實還有一種技術:表單隱藏欄位。它也可以實現session機制。這裡只是作為補充,伺服器響應前,會修改form表單,添加一個sessionID類似的隱藏欄位,以便傳回服務端的時候可以標示出此會話。

這技術,也可以使用在Web安全上,可以有效地控制CRSF跨站請求偽造

三、詳細介紹Seesion機制過程

圖中這是session第一次請求的詳細圖。以Cookie技術實現,我也寫了個HttpSessionByCookieServletT.java 的Servlet小demo,類比下Seesion的一生。代碼如下:

packageorg.servlet.sessionMngmt; importjava.io.IOException;importjava.io.PrintWriter; importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjavax.servlet.http.HttpSession;/* * Copyright [2015] [Jeff Lee] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *   http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * @author Jeff Lee * @since 2015-7-12 10:58:28 *  HttpSession的預設Cookie實現案例 */@WebServlet(urlPatterns = "/sessionByCookie")publicclassHttpSessionByCookieServletT extendsHttpServlet {     privatestaticfinallongserialVersionUID = 1L;     @Override    protectedvoiddoGet(HttpServletRequest req, HttpServletResponse resp)            throwsServletException, IOException {                 // 擷取session        // 如果是第一次請求的話,會建立一個HttpSeesion,等同於 req.getSession(true);        // 如果已存在session,則會擷取session。        HttpSession session = req.getSession();                 if(session.isNew()) {            // 設定session屬性值            session.setAttribute("name", "Jeff");        }        // 擷取SessionId        String sessionId = session.getId();                 PrintWriter out = resp.getWriter();        // 如果HttpSeesion是建立的話        if(session.isNew()) {            out.println("Hello,HttpSession! <br>The first response - SeesionId="                    + sessionId + " <br>");        } else{            out.println("Hello,HttpSession! <br>The second response - SeesionId="                    + sessionId + " <br>");            // 從Session擷取屬性值            out.println("The second-response - name: "                    + session.getAttribute("name"));        }             }     }


隆重打個小廣告:

泥瓦匠學習的代碼都在github上(同步osc git),歡迎大家點star,提意見,一起進步。地址:https://github.com/JeffLi1993

① 用戶端向服務端發送第一次請求

此時,用戶端想讓服務端把自己的名字設定到會話中。

② 服務端的容器產生該使用者唯一sessionID的session對象,並設定值

可以從代碼中看出通過從請求中req.getSession(),新產生了一個session對象。並設定了setAttribute(“name”, “Jeff”),key為string,value是對象皆可。

這時候,我們不用再把session通過cookie技術處理,容器幫我們處理了。

③ 容器響應 Set-Cookie:JSESSIONID= …

我們可以F12,查看此次響應。

可得到,每個Cookie的set,都有一個對應Set-Cookie的頭。HttpOnly可是此Cookie唯讀模式。只不過session唯一標識是:JSESSIONID

④ 瀏覽器解析Cookie,儲存至瀏覽器檔案。


,找到了對應的session儲存的cookie檔案。該檔案被保護不能開啟。圖解Cookie 教你怎麼找到該檔案。


第二次請求會發什麼變化呢?

下面,泥瓦匠重新訪問了這個地址:

① 再次請求

此時,請求會有Cookie值:JSESSIONID=… 該值傳給服務端

② 容器擷取SessionId
,關聯HttpSession

③ 此時響應無SetCookie

但是這次請求,我們響應出上一次請求set的值。Jeff 就列印出來了!


關於服務端擷取session,也就是從請求中擷取session對象,容器會幫你根據Cookie找到唯一的session對象。

泥瓦匠記憶小抄:Seesion機制,記住兩次請求圖即可。

四、補充

點到為止哈~ 以後詳細寫。此圖來自網路


Bad guy,就是攻擊者。跨站請求偽造,偽造使用者請求來對伺服器資料或者是使用者等造成威脅。web安全也就是從這些基礎中慢慢提升。


五、總結

1、大概地描述了session的工作機制,和一些安全相關。記住Seesion是什麼,怎麼用,在服務端用戶端之間怎麼傳輸即可。

2、泥瓦匠學習的代碼都在github上(同步osc git),歡迎大家點star,提意見,一起進步。地址:https://github.com/JeffLi1993

Writer      :BYSocket(泥沙磚瓦漿木匠)

微         博:BYSocket

豆         瓣:BYSocket

FaceBook:BYSocket

Twitter    :BYSocket

JavaEE 要懂的小事:三、圖解Session(會話)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.