首先談一下對session物件在web開發中的建立以及sessionid生成並返回客戶端的執行機制.
session物件當客 戶端首次訪問時,建立乙個新的session物件.並同時生成乙個sessionid,並在此次響應中將sessionid以響應報文的方式些回客戶端瀏 覽器記憶體或以重寫url方式送回客戶端,來保持整個會話,只要sever端的這個session物件沒有銷毀,以後再呼叫 request.getsession()時就直接根據客戶端的sessionid來檢索server端生成的session物件並返回,不會再次去新 建,除非根據此sessionid沒有檢索到session物件.
下面是在ie下測試,因為ie6.0的乙個bug就是ie的隱私設定即使是阻止所有cookie時,也還是會以會話cookie來儲存sessionid.所以下面都是以會話cookie來討論的,
(1)在server沒有關閉,並在session物件銷毀時間內, 當客戶端再次來請求server端的servlet或jsp時,將會將在第一次請求時生成的sessionid並附帶在請求資訊頭中並向server端發 送,server端收到sessionid後根據此sessionid會去搜尋(此過程是透明的)server對應的session物件並直接返回這個 session物件,此時不會重新去建立乙個新的session物件.
(2)當server關閉(之 前產生的session物件也就消亡了),或session物件過了其銷毀時間後,瀏覽器視窗不關,並在本瀏覽器視窗再次去請求sever端的 servlet和jsp時,此時同樣會將sessionid(server關閉或session銷毀時生成的sessionid)傳送到server端, server根據sessionid去找其對應的session物件,但此時session物件已經不存在,此時會重新生成乙個新的session物件, 並生成新的sessionid並同樣將這個新生成的sessionid以響應報文的形式送到瀏覽器記憶體中.
(3)當server沒有關閉,並session物件在其銷毀時間內,當請求乙個jsp頁面回客戶端後,關閉此瀏覽器視窗,此時其記憶體中的 sessionid也就隨之銷毀,在重新去請求sever端的servlet或jsp時,會重新生成乙個sessionid給客戶端瀏覽器,並存在瀏覽內 存中.
上面的理論在servlet中測試都是成立的,下面談一下在struts框架下進行上面的測試時的不同的地方.
先簡要說下測試程式的流程:
客戶端請求index.do--->進入server端的indexaction--->轉向login.jsp頁面----->請求login.do----->進入server端的loginaction.
首先說明:indexaction中沒有去產生session物件,login.jsp中設定.
(1)環境servlet + jsp:
在sevlet +jsp測試跟蹤時,在index.do進入indexaction後轉向login.jsp時,此時瀏覽器記憶體中是沒有會話cookie的,那麼在 login.jsp上請求login.do進入loginaction後,用request.getcookies()測試時,其值是為null的!結果 是穩合的,因為從始置終沒有產生過session.
(2)環境struts + jsp:
在struts +jsp測試跟蹤時,跟上面的流程一樣,開始想結果也應該是一樣的,但經過除錯後發現結果卻不是所想的那樣.在login.do進入 loginactoin後用,用request.getcookies()測試時,發現其值不為null,即其有name和value,開始很不理解,因 為根本就沒有建立過session物件,哪來的會話cookie值呢.但是結果有,那麼想著此時瀏覽器記憶體中也就應該有會話cookie,問題就在這裡! 從**來的?
後來經過仔細考慮後,想到struts中的特點,我們自己寫的action類是繼承struts的action的,而且之前 是經過struts的**控制器actionservlet來控制轉向的,所以我想肯定是在程式進入我自己寫的indexaction之前,struts 框架中的**肯定已經建立了session物件並已經生成了sessionid.於是就找到相關書籍檢視了actionservlet工作流程以及呼叫哪 些類,看了之後果然在其中看到了httpsession session = request.getsession();這樣一句話!於是答案也就明白了.
struts框架:requestprocess類中的processlocale()方法原型如下:
此類在struts-config.xml配置檔案中有對應的配置項: < controller locale="true">< /controller> 其預設狀態locale屬性的值為true,也就會呼叫processlocale方法,並在第一次請求時建立session物件和生成 sessionid.但改為false後,在第一次請求到達actionservlet後不會呼叫processlocale方法,也就不會生成 session物件了.
結果也就出來了,在struts應用中,*.do到達server端後經過actionservlet後轉想我們 自己寫的indexaction之前, < controller locale="true">< /controller>(預設狀態) 時,就已經產生了session物件和sessionid,這是struts框架類中生成的,即使我們在indexaction中寫上 httpsession session = request.getsession();其也是requestprocess類中的processlocale()方法生成的,此時其session 的isnew也還是true,因為還沒有返回客戶端,其是新建立的,那麼按照上面的流程,當在login.jsp上通過login.do進入 loginaction後,其request.getcookies()固然也就有值了!並且其值是requestprocess類中的 processlocale()方法產生session物件時生成的.
如果我們在struts-config.xml中加上< controller locale="false">< /controller> 時,此時如果再根據上面的流程來跟蹤程式,並在loginaction用request.getcookies()測試時,其值是為null的,當然在 indexaction寫上httpsession session = request.getsession();時其是進入indexaction時新建立的,isnew也是true.
Session的建立和銷毀
httpsession的生命週期 1 建立乙個httpsession物件 乙個常見的錯誤是以為在有客戶端訪問時就被建立 若第一次訪問某web應用的乙個jsp頁面,且該jsp頁面的page指定的session屬性為false 2 銷毀httpsession物件 注意 關閉瀏覽器只會使儲存在瀏覽器記憶體...
Session的建立和銷毀
session什麼時候被建立 乙個常見的錯誤是以為 session 在有客戶端訪問時就被建立,然而事實是直到某 server 端程式 如 servlet 呼叫 httpservletrequest.getsession true false 不會自動建立session這樣的語句時才會被建立。所以沒有...
Session 的建立和銷毀
物件導向面向君,不負 不負卿。o page 指定的 session 屬性 1 預設情況下,第一次訪問乙個 web 應用的乙個 jsp 頁面時,該頁面都必須有乙個和這個請求相關聯的 session 物件.因為 page 指定的 session 屬性預設為 true 2 若把 session 屬性改為 ...