今天遇到一個奇怪的問題,自己添加了一個session的監聽,用來監聽在線的人數。但打開瀏覽器時一直沒有走進這個監聽中來。最后百度找到了原因:
我們一直存在一個誤區,javaweb中的session什么時候創建?我一直認為是第一次與瀏覽器建立連接的時候,就自動創建一個session。其實不然!
只有在server端的代碼調用request.getSession(true)這個方法時,才互創建一個session。其中true表示,如果存在一個相同的session,則直接返回,如果不存在,則創建一個新的session;false表示,如果不存在,則返回null。而我的代碼中比較簡單,沒有用到session存儲東西,所有一直沒調用request.getSession(true)這個方法。
在攔截器中加了這句話之后,問題又來了,后面的每個請求,都會去創建一個session,這與之前的理解的一個瀏覽器對應一個session又相沖突了。猜測是因為每次請求的sessionId不同導致的,應該是在請求響應的時候沒有設置cookie導致的,HTTP請求是無狀態的,每個請求對server來說都是新的。
為了搞清內部原理,決定跟着源碼繼續看下session具體的創建和銷毀邏輯吧。