在WEB開發中,服務器能夠爲每一個用戶瀏覽器建立一個會話對象(session對象),注意:一個瀏覽器獨佔一個session對象(默認狀況下)。所以,在須要保存用戶數據時,服務器程序能夠把用戶數據寫到用戶瀏覽器獨佔的session中,當用戶使用瀏覽器訪問其它程序時,其它程序能夠從用戶的session中取出該用戶的數據,爲用戶服務。php
瀏覽器和服務器採用http無狀態的通信,爲了保持客戶端的狀態,使用session來達到這個目的。在session機制中,也採用了這樣的一個惟一的session_id來標示不一樣的用戶,不一樣的是:瀏覽器每次請求都會帶上由服務器爲它生成的session_id。html
簡單介紹一下流程:當客戶端訪問服務器時,服務器根據需求設置session,將會話信息保存在服務器上,同時將標示session的session_id傳遞給客戶端瀏覽器,瀏覽器將這個session_id保存在內存中(還有其餘的存儲方式,例如寫在url中),咱們稱之爲無過時時間的cookie。瀏覽器關閉後,這個cookie就清掉了,它不會存在用戶的cookie臨時文件。java
之後瀏覽器每次請求都會額外加上這個參數值,再服務器根據這個session_id,就能取得客戶端的數據狀態。
若是客戶端瀏覽器意外關閉,服務器保存的session數據不是當即釋放,此時數據還會存在,只要咱們知道那個session_id,就能夠繼續經過請求得到此session的信息;可是這個時候後臺的session還存在,可是session的保存有一個過時時間,一旦超過規定時間沒有客戶端請求時,他就會清除這個session。web
下面介紹一下session的存儲機制,默認的session是保存在files中,即以文件的方式保存session數據。在php中主要根據php.ini的配置session.save_handler來選擇保存session的方式。瀏覽器
這裏順便說明一下,若是要作服務器的lvs,即多臺server的話,咱們通常使用memcached的方式session,不然會致使一些請求找不到session。緩存
一個簡單的memcache配置:服務器
session.save_handler = memcache
session.save_path = "tcp://10.28.41.84:10001"
固然若是必定要使用files文件緩存,咱們能夠將文件做nfs,將全部的保存session文件定位到一個地方。
剛纔講返回給用戶的session-id最終保存在內存中,這裏咱們也能夠設置參數將其保存在用戶的url中。cookie
問題:用戶開一個瀏覽器訪問一個網站,服務器是否是針對此次會話建立一個session?
答:不是的。session的建立時機是在程序中第一次去執行request.getSession();這個代碼,服務器纔會爲你建立session。
問題:關閉瀏覽器,會話結束,session是否是就銷燬了呢?
答:不是的。session是30分鐘沒人用了纔會死,服務器會自動摧毀session。session
在web.xml文件中能夠手工配置session的失效時間。例如:app
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <display-name>day07</display-name> <!-- 設置Session的有效時間:以分鐘爲單位--> <session-config> <session-timeout>10</session-timeout> </session-config> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> </web-app>
HttpSession session = request.getSession(); // 手工調用session.invalidate方法,摧毀session session.invalidate();
總結:開一個瀏覽器訪問服務器,第一次去執行request.getSession();那個代碼,服務器爲你建立session。而後故意不關閉瀏覽器,跑去玩了1個小時,session也沒了,即便會話沒結束,服務器發現session沒人用也會將其摧毀掉。
session對象的建立時機:在程序中第一次調用request.getSession()方法時就會建立一個新的Session,能夠用isNew()方法來判斷Session是否是新建立的。
session對象的銷燬時機:session對象默認30分鐘沒有使用,則服務器會自動銷燬session,在web.xml文件中能夠手工配置session的失效時間。
參照於文章:https://www.cnblogs.com/xdp-gacl/p/3855702.html