java服務器何時創建Session

Session 機制:

session機制是一種服務器端的機制,
用來在無狀態的HTTP協議下越過多個請求頁面來維持狀態和識別用戶。
當程序需要爲某個客戶端的請求創建一個session的時候,
服務器首先檢查這個客戶端的請求裏是否已包含了一個session標識。

這個標識稱爲session id,
如果已包含一個session id則說明以前已經爲此客戶端創建過session,
服務器就按照session id把這個session檢索出來使用,
若沒有創建過,則創建一個新的Session。

那麼這個session是什麼時候創建的呢?
之前一直錯誤地理解爲:
當用戶向服務器發起請求時,這個session便會立刻建立起來,
但實際上卻根本不是這樣。

在Servlet中,你肯定用過下面這句話,

HttpSession session = request.getSession();

如果當前沒有session,則會立刻建立一個session;
如果有session則返回當前session。

這句話和

HttpSession session = request.getSession(true);

的效果是一樣的。

但是如果你寫成

HttpSession session = request.getSession(false);

則不會自動建立session。
若當前沒有session,你所得到的seesion只會是一個null。

我們先來測試訪問一個jsp頁面
在servlet中我們寫上

HttpSession session = request.getSession(false);
System.out.println(session==null);

這句話不會建立session,如果當前沒有seesion建立的話,控制檯輸出應該是true的。

然後我們去訪問頁面。
第一次訪問:輸出false(servlet先於jsp被執行)
通過查看請求信息我們得到如下內容

    響應頭信息         原始頭信息
Content-Length     824
Content-Type       text/html;charset=ISO-8859-1
Date	           Thu, 05 Apr 2012 14:46:16 GMT
Server	           Apache-Coyote/1.1
Set-Cookie         JSESSIONID=7397F04B2A96275E1FDD177DA62A2400; Path=/Test01/; HttpOnly

你肯定會有點好奇,明明沒有在servlet做任何創建session的操作,然而實際上cookies裏面已經有了一個JSESSIONID了。

第二次訪問:輸出true,
這表示session的確已經被建立了,所以會有JSESSIONID。

這是怎麼回事呢?

原因:
默認的情況下,用戶第一次訪問jsp頁面就會創建session,
因爲jsp中指令session默認配置爲true,

<%@ page session="true"%>

下面我簡單解釋下jsp的運行過程,
jsp運行時,先會轉換成一個java文件然後再編譯成class文件,最後輸出結果。
既然這樣,我們就可以先查看下jsp生成的java文件
打開
%TOMCAT_HOME%\work\Catalina\localhost\
然後打開所使用項目名稱的文件夾,比如我的是:
Test01\org\apache\jsp
這個jsp文件夾下面就是你對應的jsp生成的java文件代碼了,
這個目錄結構和你的WebRoot的jsp目錄結構是一樣的。
打開/test/test_jsp.java

裏面有一句

session = pageContext.getSession();

因此當這個jsp頁面執行時,這句話就會幫你創建session了。

OK,那我們現在試試<%@ page session="false"%>,然後再去訪問這個jsp頁面。
當然你需要先關閉瀏覽器再打開,否則原來的session還在那裏呢。

    響應頭信息           原始頭信息
Content-Length	     824
Content-Type         text/html;charset=ISO-8859-1
Date                 Thu, 05 Apr 2012 14:47:38 GMT
Server               Apache-Coyote/1.1

好了,這時我們發現那個JSESSIONID已經消失了,控制檯輸出的session==null結果也是true了。

總結:
session不是一打開網站就會立刻建立。
它的建立需要基於下面兩個條件中的任意一個:

1:在servlet中手動調用

HttpSession session = request.getSession();

或者

HttpSession session = request.getSession(true);

2:jsp中沒有寫<%@ page session="false"%>
(默認情況下它是<%@ page session="true"%>的)

如果兩個條件同時都不滿足,那麼你建立的只是一個無seesion的連接。

轉載網址:http://www.360doc.com/content/12/0511/12/1542811_210284774.shtml

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章