JavaWeb Session詳解

代碼地址以下:
http://www.demodashi.com/demo/12756.htmlhtml

記得把這幾點描述好咯:代碼實現過程 + 項目文件結構截圖 + ## Session的由來git

上一篇博文介紹了Cookie的相關知識,其中介紹了必須採用一種機制來惟一標識一個用戶,同時記錄該用戶的狀態。
因而就引入了第一種機制:Cookie機制;那麼第二種就是Session機制。

Session機制:採用的是在服務器端保持Http狀態信息的方案。結合兩篇博文也能夠看出兩種機制最明顯的區別就是cookie是存儲子在客戶端,
而Session是存儲在服務器端。具體二者的區別我會在下一篇博文詳細介紹。web

Session的定義即基本介紹

Session,善始善終的一系列動做/消息的意思,其實咱們舉一個小例子來講:好比咱們一次打電話,從接起電話到你掛斷電話的一系列過程能夠稱爲一個Session。
Session在Web開發環境下的語義又有了新的擴展,它的含義是指一類用來在客戶端與服務器端之間保持狀態的解決方案。
有時候Session也用來指這種解決方案的存儲結構。瀏覽器

Session存儲方式

服務器使用一種相似於散列表的結構(也可能就是使用散列表)來保存信息。tomcat

Session標識傳遞的過程

當程序須要爲某個客戶端的請求建立一個session時,服務器首先檢查這個客戶端的請求裏是否包含了一個session標識(即sessionId),
若是已經包含一個sessionId則說明之前已經爲此客戶建立過session,服務器就按照session id把這個session檢索出來使用(若是檢索不到,
可能會新建一個,這種狀況可能出如今服務端已經刪除了該用戶對應的session對象,但用戶人爲地在請求的URL後面附加上一個JSESSION的參數)。
若是客戶請求不包含sessionId,則爲此客戶建立一個session而且生成一個與此session相關聯的sessionId,這個sessionId將在本次響應中返回給客戶端保存。

下面是流程圖:

服務器

Session的幾種存儲方式

  1. 使用Cookie: 保存session id的方式能夠採用cookie,這樣在交互過程當中瀏覽器能夠自動的按照規則把這個標識發送給服務器,這種cookie稱爲session cookie。
    以下圖:
    cookie

  2. URL重寫: 因爲cookie能夠被人爲的禁用,必須有其它的機制以便在cookie被禁用時仍然可以把session id傳遞迴服務器,
    常常採用的一種技術叫作URL重寫,就是把session id附加在URL路徑的後面,附加的方式也有兩種,一種是做爲URL路徑的附加信息,
    另外一種是做爲查詢字符串附加在URL後面。網絡在整個交互過程當中始終保持狀態,就必須在每一個客戶端可能請求的路徑後面都包含這個session id。
    以下圖:

    網絡

Session的建立與刪除

  1. Session建立
    (1). 對於Jsp: 若當前頁面爲瀏覽器(客戶端)訪問web應用的第一個資源頁面且Jsp的Page指定的Session屬性的值爲true。
    (2). 對於Servlet: 若當前Servlet爲瀏覽器(客戶端)訪問web應用的第一個資源時,使用request.getSession()或request.getSession(true)建立。
  2. Session刪除
    (1). 調用session.invalidate()方法
    (2). 卸載web應用程序
    (3). 超過了HttpSession的過時時間

Session的超時管理

WEB服務器沒法判斷當前的客戶端瀏覽器是否還會繼續訪問,也沒法檢測客戶端瀏覽器是否關閉,因此,即便客戶已經離開或關閉了瀏覽器,
WEB服務器還要保留與之對應的HttpSession對象。

隨着時間的推移而不斷增長新的訪問客戶端,WEB服務器內存中將會所以積累起大量的再也不被使用的HttpSession對象,並將最終致使服務器內存耗盡。

WEB服務器採用「超時限制」的辦法來判斷客戶端是否還在繼續訪問,若是某個客戶端在必定的時間以內沒有發出後續請求,WEB服務器則認爲客戶端已經中止了活動,
結束與該客戶端的會話並將與之對應的HttpSession對象變成垃圾。

若是客戶端瀏覽器超時後再次發出訪問請求,WEB服務器則認爲這是一個新的會話的開始,將爲之建立新的HttpSession對象和分配新的會話標識號。

會話的超時間隔能夠在web.xml(Tomcat服務器或者web應用程序)文件中設置,其默認值由Servlet容器定義。
session

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

具體實現

登陸頁面代碼實現app

SessionId: <%= session.getId() %>
    <br/><br/>
    
    isCreateNew:<%= session.isNew() %>
    <br/><br/>
    
    maxInActiveInterval:<%= session.getMaxInactiveInterval() %>
    <br/><br/>
    
    CreatedTime:<%= session.getCreationTime() %>
    <br/><br/>
    
    lastAccessedTime: <%= session.getLastAccessedTime() %>
    <br/><br/>
    
    <%
        Object username = session.getAttribute("username");
        if(username == null){
            username = "";
        }
    %>
    <form action="<%= response.encodeURL("loginSuccess.jsp") %>" method="post">
        username: <input type="text" name="username" value="<%= username%>"/><br/>
        <input type="submit" value="登陸"/>
    </form>

登陸成功頁面代碼實現

SessionId: <%= session.getId() %>
    <br/><br/>
    
    isCreateNew:<%= session.isNew() %>
    <br/><br/>
    
    maxInActiveInterval:<%= session.getMaxInactiveInterval() %>
    <br/><br/>
    
    CreatedTime:<%= session.getCreationTime() %>
    <br/><br/>
    
    lastAccessedTime: <%= session.getLastAccessedTime() %>
    <br/><br/>
    
    Hello: <%= request.getParameter("username") %>
    <br/><br/>
    
    <%
        //將username存儲於session之中,便於在整個會話過程當中記住當前user;
        // 固然服務器端能夠找到session仍是經過cookie(URL重寫)在客戶端和服務器端傳遞JSESSIONID
        session.setAttribute("username", request.getParameter("username"));
    %>
    

        <!-- 
        
            cookie被禁用的狀況下使用url重寫的方式傳遞JSSESSIONID;
            重寫使用:response.encodeURL或response.encodeRedirectURL()都行
        -->
        

    <a href="<%= response.encodeURL("login.jsp") %>">從新登陸</a>
    <a href="<%= response.encodeURL("loginOut.jsp") %>">註銷</a>

註銷頁面實現

SessionId: <%= session.getId() %>
    <br/><br/>
    
    isCreateNew:<%= session.isNew() %>
    <br/><br/>
    
    maxInActiveInterval:<%= session.getMaxInactiveInterval() %>
    <br/><br/>
    
    CreatedTime:<%= session.getCreationTime() %>
    <br/><br/>
    
    lastAccessedTime: <%= session.getLastAccessedTime() %>
    <br/><br/>
    
    ByeBye: <%= session.getAttribute("username") %>
    <br/><br/>
    
    <%
        //註銷session
        session.invalidate();
    %>
    
    <a href="login.jsp">從新登陸</a>

How to run code

  1. 將代碼clone到本地,使用eclipse導入代碼,導入的時候項目的類型選擇"git project"。
  2. 右鍵項目 run on Server。

法二: 將項目中WebContent中的內容拷入你的Tomccat服務器下的webapps目錄下你建的站點名,
而後啓動tomcat服務器,
在瀏覽器中輸入: http://localhost:8080/站點名,便可訪問

站點頁面展現

login頁面

loginSuccess頁面

loginOut頁面

項目文件結構截圖

疑問聯繫

我的博客:http://blog.tommyyang.cn
我的郵箱:tingzai.yang@gmail.comJavaWeb Session詳解

代碼地址以下:
http://www.demodashi.com/demo/12756.html

注:本文著做權歸做者,由demo大師代發,拒絕轉載,轉載須要做者受權

相關文章
相關標籤/搜索