HttpSession詳解


HttpSession 服務端的技術
服務器會為每一個用戶 創建一個獨立的HttpSession

HttpSession原理
當用戶第一次訪問Servlet時,服務器端會給用戶創建一個獨立的Session
並且生成一個SessionID,這個SessionID在響應瀏覽器的時候會被裝進cookie中,從而被保存到瀏覽器中
當用戶再一次訪問Servlet時,請求中會攜帶着cookie中的SessionID去訪問
服務器會根據這個SessionID去查看是否有對應的Session對象
有就拿出來使用;沒有就創建一個Session(相當於用戶第一次訪問)

域的范圍:
    Context域 > Session域 > Request域
    Session域 只要會話不結束就會存在 但是Session有默認的存活時間(30分鍾)

  需要注意的是,一個Session的概念需要包括特定的客戶端,特定的服務器端以及不中斷的操作時間。A用戶和C服務器建立連接時所處的Session同B用戶和C服務器建立連接時所處的Session是兩個不同的Session。

 

session進行身份驗證的原理:

  當客戶端第一次訪問服務器的時候,此時客戶端的請求中不攜帶任何標識給服務器,所以此時服務器無法找到與之對應的session,所以會新建session對象,當服務器進行響應的時候,服務器會將session標識放到響應頭的Set-Cookie中,會以key-value的形式返回給客戶端,例:JSESSIONID=7F149950097E7B5B41B390436497CD21;其中JSESSIONID是固定的,而后面的value值對應的則是給該客戶端新創建的session的ID,之后瀏覽器再次進行服務器訪問的時候,客戶端會將此key-value放到cookie中一並請求服務器,服務器就會根據此ID尋找對應的session對象了;(當瀏覽器關閉后,會話結束,由於cookie消失所以對應的session對象標識消失,而對應的session依然存在,但已經成為報廢數據等待GC回收了)對應session的ID可以利用此方法得到:session.getId();

1.client-server connection

先上一張圖,如下

          

               圖1

對圖1的說明:

  • client與server建立一個連接,這種連接是底層的
  • client發送request到server,等待server的answer
  • server處理request,將處理結果返還給client,這個結果包括status code、其它data

在HTTP/1.1中,在步驟3執行完成后,connection不再被關閉,在connection有效的前提細,后面client不再需要執行步驟1,直接執行步驟2、3就可以。

為了進一步深入,如下圖2,圖2是我從國外的網上截下來的,建議讀者閱讀原文

            

                    圖2 HttpSession生成后會有個sessionID

  • Client第一次發送請求,web container生成唯一的session ID(生成session ID的源碼,如有興趣,可以看下tomcat源碼, 隨機數+時間+jvmid),並將其返回給client(在web container返回給client的response中),web container上的這個HttpSession是臨時的。
  • 后面Client在每次發送請求給服務器時,都將session ID發送給web container,這樣web container就很容易區分出是哪個client.
  • Web container使用這個session ID,找到對應的HttpSession,並將此次request與這個HttpSession聯系起來。  

 

HttpSession生命周期:

1. 什么時候創建HttpSession

1).對於JSP:
  是否瀏覽器訪問服務端的任何一個JSP或Servlet,服務器都會立即創建一個HttpSession對象呢? 不一定。
  ①.若當前的JSP或(Servlet)是客戶端訪問的當前WEB應用的第一個資源,且JSP的page指定的session屬性為false,則服務器就不會為JSP創建一個HttpSession對象;
  ②.若當前JSP不是客戶端訪問的當前WEB應用的第一個資源,且其他頁面已經創建一個HttpSession對象,則服務器也不會為當前JSP創建一個新的HttpSession對象,而會把和當前會話關聯的那個HttpSession對象返回給當前的JSP頁面。


2).page指令的session="false"到底表示什么意思:當前JSP頁面禁用session隱含變量!但可以使用其他的顯式的對象


3).對於Servlet而言:
  若Servlet是客戶端訪問的第一個WEB應用的資源,則只有調用了request.getSession()或request.getSession(true) 才會創建HttpSession對象


4). 在Servlet中如何獲取HttpSession對象?
  request.getSession(boolean create):create為false,若沒有和當前JSP頁面關聯的HttpSession對象,則返回null;
  若有返回true create為true一定返回一個HTTPSession對象。若沒有和昂前JSP頁面關聯的HttpSession對象,則服務器創建一個新的HttpSession對象返回,若有,則直接返回關聯。
  request.getSession()等同於request.getSession(true)

2. 什么時候銷毀HttpSession對象:

1).直接調用HttpSession的invalidate()方法:使HttpSession失效
2).服務器卸載了當前Web應用。
3).超出HttpSession的過期時間。

 

設置HttpSession的過期時間:單位為S

session.setMaxInactiveInterval(5);
out.print(session.getMaxInactiveInterval());
<!--在web.xml文件中設置HttpSession過期時間。 -->
    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>
<!--系統默認30分鍾 -->

  由於會有越來越多的用戶訪問服務器,因此Session也會越來越多。為防止內存溢出,服務器會把長時間內沒有活躍的Session從內存刪除。這個時間就是Session的超時時間。如果超過了超時時間沒訪問過服務器,Session就自動失效了。

Session具有以下特點:
(1)Session中的數據保存在服務器端;
(2)Session中可以保存任意類型的數據;
(3)Session默認的生命周期是30分鍾,可以手動設置更長或更短的時間。

 

1:session進行身份驗證的原理:

當客戶端第一次訪問服務器的時候,此時客戶端的請求中不攜帶任何標識給服務器,所以此時服務器無法找到與之對應的

session,所以會新建session對象,當服務器進行響應的時候,服務器會將session標識放到響應頭的Set-Cookie中,會以

key-value的形式返回給客戶端,例:JSESSIONID=7F149950097E7B5B41B390436497CD21;其中JSESSIONID是固定的,

而后面的value值對應的則是給該客戶端新創建的session的ID,之后瀏覽器再次進行服務器訪問的時候,客戶端會將此key-value

放到cookie中一並請求服務器,服務器就會根據此ID尋找對應的session對象了;(當瀏覽器關閉后,會話結束,由於cookie消

失所以對應的session對象標識消失,而對應的session依然存在,但已經成為報廢數據等待GC回收了)

對應session的ID可以利用此方法得到:session.getId();


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM