1. 程式人生 > >Session是通過利用設定在Cookie中的id來區分訪問的使用者

Session是通過利用設定在Cookie中的id來區分訪問的使用者

面試的時候被問到 了Session是通過什麼區分每一個使用者的,當時有點緊張,支支吾吾半天,現參照了網上內容整合並做了部分修改做一個詳細的解讀,再次感謝所有大神,一起成長

1、當使用下面這句建立session的時候,

HttpSession session = request.getSession(true);//或者使用request.getSession();意思一樣

伺服器每建立一個session都會有一個相對應的sessionId(SessionID的本質見此貼:
http://www.cnblogs.com/japanbbq/archive/2011/09/01/2161650.html),並且伺服器會把這個sessionId,會以Cookie的形式回寫給客戶端(瀏覽器),下次同一個使用者訪問的時候會帶這個sessionId屬性。有時候就會出現一個問題,如果不小心關閉了客戶端(瀏覽器),那麼Cookie就不存在了。
例如常見的購物車功能,在購物的時候,不小心關閉了瀏覽器,該使用者下次再來訪問的時候,上次的記錄就不存在了,所以當session建立的時候,可以把對應建立的sessionId存到一個設定有效期的的Cookie當中,那麼在你關閉瀏覽器的時候,在較短時間內,再次開啟瀏覽器,上次的瀏覽記錄依然還是在的。

可以通過以下程式碼可以去實現:

HttpSession session = request.getSession(true);
session.setAttribute("key", "value");
String sessionId = session.getId();   
Cookie setSessionId = new Cookie("mySessionId",sessionId);//sessionId預設是存放在一個name為mySessionId裡面的
setSessionId.setPath("上次路徑");
setSessionId.setMaxAge(30 * 60);// 以秒為單位,所以為30分鐘
response.addCookie(setSessionId);

說到這先討論一個新的問題:

有些網站使用Session ID來記錄使用者,每個使用者訪問網站時都會生成獨特唯一的Session ID,加在URL中。網路爬蟲的每一次訪問也會被當成一個新的使用者,URL中會加上一個不同的Session ID,這樣網路爬蟲每次訪問時所得到的同一個頁面的URL,後面會帶著一個不一樣的Session ID。這也是最常見的爬蟲陷阱之一。 搜尋引擎遇到這種常常的Session ID,會嘗試判斷字串是Session ID還是正常引數,成功判斷出Session ID就可以去掉Session ID,收錄正常URL。但也經常判斷不出來,要麼不願意收錄,要麼收錄多個帶有不同Session ID的URL,內容卻完全一樣,形成大量複製內容,這兩種情況對網站優化都不利。


2、回到正題,為什麼我上面這段程式碼設定了Cookie的生命週期,再次開啟瀏覽器的時候,這個Cookie還在呢;而當你建立session並且預設以Cookie的形式回寫給客戶端的時候,不小心關閉了瀏覽器,再次開啟的時候Cookie卻不存在了?
下面是關於Cookie生命週期的介紹:
Cookie如果不設定過期時間(使用setMaxAge()方法),則表示這個cookie生命週期為瀏覽器會話期間,只要關閉瀏覽器視窗,cookie就消失了。這種生命期為瀏覽會話期的cookie被稱為會話cookie。會話cookie一般不儲存在硬碟上而是儲存在記憶體裡。
如果設定了過期時間,瀏覽器就會把cookie儲存到硬碟上,關閉後再次開啟瀏覽器,這些cookie依然有效直到超過設定的過期時間。儲存在硬碟上的cookie可以在不同的瀏覽器程序間共享,比如兩個IE視窗。而對於儲存在記憶體的cookie,不同的瀏覽器還有不同的處理方式。

老鐵,如果有錯請指出,學無止境,不學習在那弄啥嘞?!!