Struts構架中的Session物件建立和控制

2021-04-15 14:07:28 字數 3501 閱讀 8594

首先談一下對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。

Struts構架中action的跳轉大全

1 完整的action name someform input somejsp.jsp 這樣做的效果是 execute 僅當validate 成功以後才執行 input屬性指定的是乙個uri。2 僅有form的action 首先,struts會在定義的scope搜尋someform,如果找到則重用,...

講解Struts構架中action的跳轉大全

1.完整的action name someform input somejsp.jsp 這樣做的效果是 execute 僅當validate 成功以後才執行 input屬性指定的是乙個uri。2.僅有form的action 首先,struts會在定義的scope搜尋someform,如果找到則重用,...

Struts構架中action的跳轉大全

name someform input somejsp.jsp 這樣做的效果是 execute 僅當validate 成功以後才執行 input屬性指定的是乙個uri。2.僅有form的action 首先,struts會在定義的scope搜尋someform,如果找到則重用,如果找不到則新建乙個例項...