一、 Web中的Session指的就是用戶在瀏覽某個網站時,從進入網站到瀏覽器關閉所通過的這段時間,也就是用戶瀏覽這個網站所花費的時間。所以從上述的定義中咱們能夠看到,Session其實是一個特定的時間概念。php
須要注意的是,一個Session的概念須要包括特定的客戶端,特定的服務器端以及不中斷的操做時間。A用戶和C服務器創建鏈接時所處的Session同B用戶和C服務器創建鏈接時所處的Session是兩個不一樣的Session。html
session的工做原理java
(1)當一個session第一次被啓用時,一個惟一的標識被存儲於本地的cookie中。瀏覽器
(2)首先使用session_start()函數,PHP從session倉庫中加載已經存儲的session變量。服務器
(3)當執行PHP腳本時,經過使用session_register()函數註冊session變量。cookie
(4)當PHP腳本執行結束時,未被銷燬的session變量會被自動保存在本地必定路徑下的session庫中,這個路徑能夠經過php.ini文件中的session.save_path指定,下次瀏覽網頁時能夠加載使用。session
二、HttpSession session = request.getSession();函數
根據狀況當這句代碼須要建立session的時候,服務器每建立一個session都會有一個想對應的session_id,而且服務器會把這個session_id號,會以Cookie的形式回寫給客戶端(瀏覽器),下次同一個用戶訪問的時候會帶這個session_id號過來的。優化
這樣有時候就會出現一個問題,當你把客戶端(瀏覽器)關閉的時候,若是不當心關閉了瀏覽器,那麼Cookie就不存在了。網站
例如常見的購物車功能,在購物的時候,不當心關閉了瀏覽器,該用戶下次再來訪問的時候,上次的記錄就不存在了,
因此當session建立的時候,能夠把對應建立的session_id存到一個設置有效期的的Cookie當中,那麼在你關閉瀏覽器的時候,在較短期內,再次打開瀏覽器,上次的瀏覽記錄依然仍是在的:
經過如下代碼能夠去實現:
1
2
3
4
5
6
7
|
HttpSession session = request.getSession();
session.setAttribute(
"String1"
,
"Object1"
);
String session_id = session.getId();
Cookie cookie =
new
Cookie(
"JSESSIONID"
, session_id);
//session_id默認是存放在一個name爲JSESSIOINID裏面的
cookie.setPath(
"上次路徑"
);
cookie.setMaxAge(
30
*
60
);
// 30 分鐘
response.addCookie(cookie);
www.169it.com
|
三、這裏又有了另一個問題,爲何我上面這段代碼設置了Cookie的生命週期,再次打開瀏覽器的時候,這個Cookie還在呢;而當你建立session而且默認以Cookie的形式回寫給客戶端的時候,不當心關閉了瀏覽器,再次打開的時候Cookie卻不存在了?
關於Cookie的一個生命週期的問題:
Cookie若是不設置過時時間,則表示這個cookie生命週期爲瀏覽器會話期間,只要關閉瀏覽器窗口,cookie就消失了。這種生命期爲瀏覽會話期的cookie被稱爲會話cookie。會話cookie通常不保存在硬盤上而是保存在內存裏。
若是設置了過時時間,瀏覽器就會把cookie保存到硬盤上,關閉後再次打開瀏覽器,這些cookie依然有效直到超過設定的過時時間。存儲在硬盤上的cookie能夠在不一樣的瀏覽器進程間共享,好比兩個IE窗口。而對於保存在內存的cookie,不一樣的瀏覽器還有不一樣的處理方式。
四、有些網站使用Session ID(會話ID)跟蹤用戶訪問,每一個用戶訪問網站時都會生成獨特惟一的Session ID,加在URL中。搜索引擎蜘蛛的每一次訪問也會被當成一個新的用戶,URL中會加上一個不一樣的Session ID,這樣搜索引擎蜘蛛每次來訪問時所獲得的同一個頁面的URL將不同,後面帶着一個不同的Session ID。這也是最多見的蜘蛛陷阱之一。 搜索引擎遇到這種經常的Session ID,會嘗試判斷字符串是Session ID仍是正常參數,成功判斷出Session ID就能夠去掉Session ID,收錄正常URL。但也常常判斷不出來,要麼不肯意收錄,要麼收錄多個帶有不一樣Session ID的URL,內容卻徹底同樣,造成大量複製內容,這兩種狀況對網站優化都不利。