成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁(yè) > 知識(shí)庫(kù) > JSP和Struts解決用戶退出問題

JSP和Struts解決用戶退出問題

熱門標(biāo)簽:淮南騰訊地圖標(biāo)注 騰訊地圖標(biāo)注商戶改名注冊(cè)入駐 地圖標(biāo)注人員兼職 開封便宜外呼系統(tǒng)報(bào)價(jià) 商丘百應(yīng)電話機(jī)器人有沒有效果 漯河辦理400電話 怎樣把地圖標(biāo)注出來 電話機(jī)器人的特色和創(chuàng)新 黃石智能營(yíng)銷電銷機(jī)器人效果

  在一個(gè)有密碼保護(hù)的Web應(yīng)用中,正確處理用戶退出過程并不僅僅只需調(diào)用HttpSession的invalidate()方法。現(xiàn)在大部分瀏覽器上都有后退和前進(jìn)按鈕,允許用戶后退或前進(jìn)到一個(gè)頁(yè)面。如果在用戶在退出一個(gè)Web應(yīng)用后按了后退按鈕瀏覽器把緩存中的頁(yè)面呈現(xiàn)給用戶,這會(huì)使用戶產(chǎn)生疑惑,他們會(huì)開始擔(dān)心他們的個(gè)人數(shù)據(jù)是否安全。許多Web應(yīng)用強(qiáng)迫用戶退出時(shí)關(guān)閉整個(gè)瀏覽器,這樣,用戶就無(wú)法點(diǎn)擊后退按鈕了。還有一些使用javascript,但在某些客戶端瀏覽器這卻不一定起作用。這些解決方案都很笨拙且不能保證在任一情況下100%有效,同時(shí),它也要求用戶有一定的操作經(jīng)驗(yàn)。

  這篇文章以示例闡述了正確解決用戶退出問題的方案。作者Kevin Le首先描述了一個(gè)密碼保護(hù)Web應(yīng)用,然后以示例程序解釋問題如何產(chǎn)生并討論解決問題的方案。文章雖然是針對(duì)JSP頁(yè)面進(jìn)行闡述,但作者所闡述的概念很容易理解切能夠?yàn)槠渌鸚eb技術(shù)所采用。最后作者展示了如何用Jakarta Struts優(yōu)雅地解決這一問題。

  大部分Web應(yīng)用不會(huì)包含象銀行賬戶或信用卡資料那樣機(jī)密的信息,但一旦涉及到敏感數(shù)據(jù),我們就需要提供一類密碼保護(hù)機(jī)制。舉例來說,一個(gè)工廠中工人通過Web訪問他們的時(shí)間安排、進(jìn)入他們的訓(xùn)練課程以及查看他們的薪金等等。此時(shí)應(yīng)用SSL(Secure Socket Layer)有點(diǎn)殺雞用牛刀的感覺,但不可否認(rèn),我們又必須為這些應(yīng)用提供密碼保護(hù),否則,工人(也就是Web應(yīng)用的使用者)可以窺探到工廠中其他雇員的私人機(jī)密信息。

  與上述情形相似的還有位處圖書館、醫(yī)院等公共場(chǎng)所的計(jì)算機(jī)。在這些地方,許多用戶共同使用幾臺(tái)計(jì)算機(jī),此時(shí)保護(hù)用戶的個(gè)人數(shù)據(jù)就顯得至關(guān)重要。設(shè)計(jì)良好編寫優(yōu)秀的應(yīng)用對(duì)用戶專業(yè)知識(shí)的要求少之又少。

  我們來看一下現(xiàn)實(shí)世界中一個(gè)完美的Web應(yīng)用是如何表現(xiàn)的:一個(gè)用戶通過瀏覽器訪問一個(gè)頁(yè)面。Web應(yīng)用展現(xiàn)一個(gè)登陸頁(yè)面要求用戶輸入有效的驗(yàn)證信息。用戶輸入了用戶名和密碼。此時(shí)我們假設(shè)用戶提供的身份驗(yàn)證信息是正確的,經(jīng)過了驗(yàn)證過程,Web應(yīng)用允許用戶瀏覽他有權(quán)訪問的區(qū)域。用戶想退出時(shí),點(diǎn)擊退出按鈕,Web應(yīng)用要求用戶確認(rèn)他是否則真的需要退出,如果用戶確定退出,Session結(jié)束,Web應(yīng)用重新定位到登陸頁(yè)面。用戶可以放心的離開而不用擔(dān)心他的信息會(huì)泄露。另一個(gè)用戶坐到了同一臺(tái)電腦前,他點(diǎn)擊后退按鈕,Web應(yīng)用不應(yīng)該出現(xiàn)上一個(gè)用戶訪問過的任何一個(gè)頁(yè)面。事實(shí)上,Web應(yīng)用在第二個(gè)用戶提供正確的驗(yàn)證信息之前應(yīng)當(dāng)一直停留在登陸頁(yè)面上。
通過示例程序,文章向您闡述了如何在一個(gè)Web應(yīng)用中實(shí)現(xiàn)這一功能。

  JSP示例

  為了更為有效地闡述實(shí)現(xiàn)方案,本文將從展示一個(gè)示例應(yīng)用logoutSampleJSP1中碰到的問題開始。這個(gè)示例代表了許多沒有正確解決退出過程的Web應(yīng)用。logoutSampleJSP1包含了下述jsp頁(yè)面:login.jsp, home.jsp, secure1.jsp, secure2.jsp, logout.jsp, loginAction.jsp, and logoutAction.jsp。其中頁(yè)面home.jsp, secure1.jsp, secure2.jsp, 和logout.jsp是不允許未經(jīng)認(rèn)證的用戶訪問的,也就是說,這些頁(yè)面包含了重要信息,在用戶登陸之前或者退出之后都不應(yīng)該出現(xiàn)在瀏覽器中。login.jsp包含了用于用戶輸入用戶名和密碼的form。logout.jsp頁(yè)包含了要求用戶確認(rèn)是否退出的form。loginAction.jsp和logoutAction.jsp作為控制器分別包含了登陸和退出代碼。

  第二個(gè)示例應(yīng)用logoutSampleJSP2展示了如何解決示例logoutSampleJSP1中的問題。然而,第二個(gè)應(yīng)用自身也是有疑問的。在特定的情況下,退出問題還是會(huì)出現(xiàn)。

  第三個(gè)示例應(yīng)用logoutSampleJSP3在第二個(gè)示例上進(jìn)行了改進(jìn),比較完善地解決了退出問題。

  最后一個(gè)示例logoutSampleStruts展示了Struts如何優(yōu)美地解決登陸問題。

  注意:本文所附示例在最新版本的Microsoft Internet Explorer (IE), Netscape Navigator, Mozilla, FireFox和Avant瀏覽器上測(cè)試通過。

  Login action

  Brian Pontarelli的經(jīng)典文章《J2EE Security: Container Versus Custom》討論了不同的J2EE認(rèn)證途徑。文章同時(shí)指出,HTTP協(xié)議和基于form的認(rèn)證并未提供處理用戶退出的機(jī)制。因此,解決途徑便是引入自定義的安全實(shí)現(xiàn)機(jī)制。

  自定義的安全認(rèn)證機(jī)制普遍采用的方法是從form中獲得用戶輸入的認(rèn)證信息,然后到諸如LDAP (lightweight directory access protocol)或關(guān)系數(shù)據(jù)庫(kù)的安全域中進(jìn)行認(rèn)證。如果用戶提供的認(rèn)證信息是有效的,登陸動(dòng)作往HttpSession對(duì)象中注入某個(gè)對(duì)象。HttpSession存在著注入的對(duì)象則表示用戶已經(jīng)登陸。為了方便讀者理解,本文所附的示例只往HttpSession中寫入一個(gè)用戶名以表明用戶已經(jīng)登陸。清單1是從loginAction.jsp頁(yè)面中節(jié)選的一段代碼以此闡述登陸動(dòng)作:

Listing 1
//...
//initialize RequestDispatcher object; set forward to home page by default
RequestDispatcher rd = request.getRequestDispatcher("home.jsp");

//Prepare connection and statement
rs = stmt.executeQuery("select password from USER where userName = '" + userName + "'");
if (rs.next()) {
 //Query only returns 1 record in the result set; only 1
 password per userName which is also the primary key
 if (rs.getString("password").equals(password)) { //If valid password
  session.setAttribute("User", userName); //Saves username string in the session object
 }
 else { //Password does not match, i.e., invalid user password
  request.setAttribute("Error", "Invalid password.");

  rd = request.getRequestDispatcher("login.jsp");
 }
} //No record in the result set, i.e., invalid username
else {

 request.setAttribute("Error", "Invalid user name.");
 rd = request.getRequestDispatcher("login.jsp");
}
}

//As a controller, loginAction.jsp finally either forwards to "login.jsp" or "home.jsp"
rd.forward(request, response);
//...

  本文所附示例均以關(guān)系型數(shù)據(jù)庫(kù)作為安全域,但本文所闡述的觀點(diǎn)對(duì)任何類型的安全域都是適用的。

  Logout action

  退出動(dòng)作就包含了簡(jiǎn)單的刪除用戶名以及對(duì)用戶的HttpSession對(duì)象調(diào)用invalidate()方法。清單2是從loginoutAction.jsp頁(yè)面中節(jié)選的一段代碼以此闡述退出動(dòng)作:

Listing 2
//...
session.removeAttribute("User");
session.invalidate();
//...

  阻止未經(jīng)認(rèn)證訪問受保護(hù)的JSP頁(yè)面

  從form中獲取用戶提交的認(rèn)證信息并經(jīng)過驗(yàn)證后,登陸動(dòng)作簡(jiǎn)單地往 HttpSession對(duì)象中寫入一個(gè)用戶名,退出動(dòng)作則做相反的工作,它從用戶的HttpSession對(duì)象中刪除用戶名并調(diào)用invalidate()方法銷毀HttpSession。為了使登陸和退出動(dòng)作真正發(fā)揮作用,所有受保護(hù)的JSP頁(yè)面都應(yīng)該首先驗(yàn)證HttpSession中是否包含了用戶名以確認(rèn)當(dāng)前用戶是否已經(jīng)登陸。如果HttpSession中包含了用戶名,也就是說用戶已經(jīng)登陸,Web應(yīng)用則將剩余的JSP頁(yè)發(fā)送給瀏覽器,否則,JSP頁(yè)將跳轉(zhuǎn)到登陸頁(yè)login.jsp。頁(yè)面home.jsp, secure1.jsp, secure2.jsp和logout.jsp均包含清單3中的代碼段:

Listing 3
//...
String userName = (String) session.getAttribute("User");
if (null == userName) {
 request.setAttribute("Error", "Session has ended. Please login.");
 RequestDispatcher rd = request.getRequestDispatcher("login.jsp");
 rd.forward(request, response);
}
//...
//Allow the rest of the dynamic content in this JSP to be served to the browser
//...

  在這個(gè)代碼段中,程序從HttpSession中減縮username字符串。如果字符串為空,Web應(yīng)用則自動(dòng)中止執(zhí)行當(dāng)前頁(yè)面并跳轉(zhuǎn)到登陸頁(yè),同時(shí)給出Session has ended. Please log in.的提示;如果不為空,Web應(yīng)用則繼續(xù)執(zhí)行,也就是把剩余的頁(yè)面提供給用戶。

  運(yùn)行l(wèi)ogoutSampleJSP1

  運(yùn)行l(wèi)ogoutSampleJSP1將會(huì)出現(xiàn)如下幾種情形:

  1) 如果用戶沒有登陸,Web應(yīng)用將會(huì)正確中止受保護(hù)頁(yè)面home.jsp, secure1.jsp, secure2.jsp和logout.jsp的執(zhí)行,也就是說,假如用戶在瀏覽器地址欄中直接敲入受保護(hù)JSP頁(yè)的地址試圖訪問,Web應(yīng)用將自動(dòng)跳轉(zhuǎn)到登陸頁(yè)并提示Session has ended.Please log in.

  2) 同樣的,當(dāng)一個(gè)用戶已經(jīng)退出,Web應(yīng)用也會(huì)正確中止受保護(hù)頁(yè)面home.jsp, secure1.jsp, secure2.jsp和logout.jsp的執(zhí)行

  3) 用戶退出后,如果點(diǎn)擊瀏覽器上的后退按鈕,Web應(yīng)用將不能正確保護(hù)受保護(hù)的頁(yè)面——在Session銷毀后(用戶退出)受保護(hù)的JSP頁(yè)重新在瀏覽器中顯示出來。然而,如果用戶點(diǎn)擊返回頁(yè)面上的任何鏈接,Web應(yīng)用將會(huì)跳轉(zhuǎn)到登陸頁(yè)面并提示Session has ended.Please log in.

  阻止瀏覽器緩存

  上述問題的根源在于大部分瀏覽器都有一個(gè)后退按鈕。當(dāng)點(diǎn)擊后退按鈕時(shí),默認(rèn)情況下瀏覽器不是從Web服務(wù)器上重新獲取頁(yè)面,而是從瀏覽器緩存中載入頁(yè)面?;贘ava的Web應(yīng)用并未限制這一功能,在基于PHP、ASP和.NET的Web應(yīng)用中也同樣存在這一問題。

  在用戶點(diǎn)擊后退按鈕后,瀏覽器到服務(wù)器再?gòu)姆?wù)器到瀏覽器這樣通常意思上的HTTP回路并沒有建立,僅僅只是用戶,瀏覽器和緩存進(jìn)行了交互。所以,即使包含了清單3上的代碼來保護(hù)JSP頁(yè)面,當(dāng)點(diǎn)擊后退按鈕時(shí),這些代碼是不會(huì)執(zhí)行的。

  緩存的好壞,真是仁者見仁智者見智。緩存的確提供了一些便利,但通常只在使用靜態(tài)的HTML頁(yè)面或基于圖形或影響的頁(yè)面你才能感受到。而另一方面,Web應(yīng)用通常是基于數(shù)據(jù)的,數(shù)據(jù)通常是頻繁更改的。與從緩存中讀取并顯示過期的數(shù)據(jù)相比,提供最新的數(shù)據(jù)才是更重要的!

  幸運(yùn)的是,HTTP頭信息“Expires”和“Cache-Control”為應(yīng)用程序服務(wù)器提供了一個(gè)控制瀏覽器和代理服務(wù)器上緩存的機(jī)制。HTTP頭信息Expires告訴代理服務(wù)器它的緩存頁(yè)面何時(shí)將過期。HTTP1.1規(guī)范中新定義的頭信息Cache-Control可以通知瀏覽器不緩存任何頁(yè)面。當(dāng)點(diǎn)擊后退按鈕時(shí),瀏覽器重新訪問服務(wù)器已獲取頁(yè)面。如下是使用Cache-Control的基本方法:

  1) no-cache:強(qiáng)制緩存從服務(wù)器上獲取新的頁(yè)面

  2) no-store: 在任何環(huán)境下緩存不保存任何頁(yè)面

  HTTP1.0規(guī)范中的Pragma:no-cache等同于HTTP1.1規(guī)范中的Cache-Control:no-cache,同樣可以包含在頭信息中。

  通過使用HTTP頭信息的cache控制,第二個(gè)示例應(yīng)用logoutSampleJSP2解決了logoutSampleJSP1的問題。logoutSampleJSP2與logoutSampleJSP1不同表現(xiàn)在如下代碼段中,這一代碼段加入進(jìn)所有受保護(hù)的頁(yè)面中:

//...
response.setHeader("Cache-Control","no-cache"); //Forces caches to obtain a new copy of the page from the origin server
response.setHeader("Cache-Control","no-store"); //Directs caches not to store the page under any circumstance
response.setDateHeader("Expires", 0); //Causes the proxy cache to see the page as "stale"
response.setHeader("Pragma","no-cache"); //HTTP 1.0 backward compatibility
String userName = (String) session.getAttribute("User");
if (null == userName) {
 request.setAttribute("Error", "Session has ended. Please login.");
 RequestDispatcher rd = request.getRequestDispatcher("login.jsp");
 rd.forward(request, response);
}
//...

  通過設(shè)置頭信息和檢查HttpSession中的用戶名確保了瀏覽器不緩存頁(yè)面,同時(shí),如果用戶未登陸,受保護(hù)的JSP頁(yè)面將不會(huì)發(fā)送到瀏覽器,取而代之的將是登陸頁(yè)面login.jsp。

  運(yùn)行l(wèi)ogoutSampleJSP2

  運(yùn)行l(wèi)ogoutSampleJSP2后將回看到如下結(jié)果:

  1) 當(dāng)用戶退出后試圖點(diǎn)擊后退按鈕,瀏覽器并不會(huì)顯示受保護(hù)的頁(yè)面,它只會(huì)現(xiàn)實(shí)登陸頁(yè)login.jsp同時(shí)給出提示信息Session has ended. Please log in.

  2) 然而,當(dāng)按了后退按鈕返回的頁(yè)是處理用戶提交數(shù)據(jù)的頁(yè)面時(shí),IE和Avant瀏覽器將彈出如下信息提示:

  警告:頁(yè)面已過期……(你肯定見過)

  選擇刷新后前一個(gè)JSP頁(yè)面將重新顯示在瀏覽器中。很顯然,這不是我們所想看到的因?yàn)樗`背了logout動(dòng)作的目的。發(fā)生這一現(xiàn)象時(shí),很可能是一個(gè)惡意用戶在嘗試獲取其他用戶的數(shù)據(jù)。然而,這個(gè)問題僅僅出現(xiàn)在后退按鈕對(duì)應(yīng)的是一個(gè)處理POST請(qǐng)求的頁(yè)面。

  記錄最后登陸時(shí)間

  上述問題之所以出現(xiàn)是因?yàn)闉g覽器將其緩存中的數(shù)據(jù)重新提交了。這本文的例子中,數(shù)據(jù)包含了用戶名和密碼。無(wú)論是否給出安全警告信息,瀏覽器此時(shí)起到了負(fù)面作用。

  為了解決logoutSampleJSP2中出現(xiàn)的問題,logoutSampleJSP3的login.jsp在包含username和password的基礎(chǔ)上還包含了一個(gè)稱作lastLogon的隱藏表單域,此表單域動(dòng)態(tài)的用一個(gè)long型值初始化。這個(gè)long型值是調(diào)用System.currentTimeMillis()獲取到的自1970年1月1日以來的毫秒數(shù)。當(dāng)login.jsp中的form提交時(shí),loginAction.jsp首先將隱藏域中的值與用戶數(shù)據(jù)庫(kù)中的值進(jìn)行比較。只有當(dāng)lastLogon表單域中的值大于數(shù)據(jù)庫(kù)中的值時(shí)Web應(yīng)用才認(rèn)為這是個(gè)有效的登陸。

  為了驗(yàn)證登陸,數(shù)據(jù)庫(kù)中l(wèi)astLogon字段必須以表單中的lastLogon值進(jìn)行更新。上例中,當(dāng)瀏覽器重復(fù)提交數(shù)據(jù)時(shí),表單中的lastLogon值不比數(shù)據(jù)庫(kù)中的lastLogon值大,因此,loginAction轉(zhuǎn)到login.jsp頁(yè)面,并提示Session has ended.Please log in.清單5是loginAction中節(jié)選的代碼段:

  清單5

//...
RequestDispatcher rd = request.getRequestDispatcher("home.jsp"); //Forward to homepage by default
//...
if (rs.getString("password").equals(password)) {
 //If valid password
 long lastLogonDB = rs.getLong("lastLogon");
 if (lastLogonForm > lastLogonDB) {
  session.setAttribute("User", userName); //Saves username string in the session object
  stmt.executeUpdate("update USER set lastLogon= " + lastLogonForm + " where userName = '" + userName + "'");
 }
 else {
  request.setAttribute("Error", "Session has ended. Please login.");
  rd = request.getRequestDispatcher("login.jsp"); }
 }
 else { //Password does not match, i.e., invalid user password
  request.setAttribute("Error", "Invalid password.");
  rd = request.getRequestDispatcher("login.jsp");
 }
 //...
 rd.forward(request, response);
//...

  為了實(shí)現(xiàn)上述方法,你必須記錄每個(gè)用戶的最后登陸時(shí)間。對(duì)于采用關(guān)系型數(shù)據(jù)庫(kù)安全域來說,這點(diǎn)可以可以通過在某個(gè)表中加上lastLogin字段輕松實(shí)現(xiàn)。LDAP以及其他的安全域需要稍微動(dòng)下腦筋,但很顯然是可以實(shí)現(xiàn)的。

  表示最后登陸時(shí)間的方法有很多。示例logoutSampleJSP3利用了自1970年1月1日以來的毫秒數(shù)。這個(gè)方法在許多人在不同瀏覽器中用一個(gè)用戶賬號(hào)登陸時(shí)也是可行的。

  運(yùn)行l(wèi)ogoutSampleJSP3

  運(yùn)行示例logoutSampleJSP3將展示如何正確處理退出問題。一旦用戶退出,點(diǎn)擊瀏覽器上的后退按鈕在任何情況下都不會(huì)是受保護(hù)的頁(yè)面在瀏覽器上顯示出來。這個(gè)示例展示了如何正確處理退出問題而不需要額外的培訓(xùn)。

  為了使代碼更簡(jiǎn)練有效,一些冗余的代碼可以剔除掉。一種途徑就是把清單4中的代碼寫到一個(gè)單獨(dú)的JSP頁(yè)中,通過標(biāo)簽<jsp:include>其他頁(yè)面也可以引用。

  Struts框架下的退出實(shí)現(xiàn)

  與直接使用JSP或JSP/servlets相比,另一個(gè)可選的方案是使用Struts。為一個(gè)基于Struts的Web應(yīng)用添加一個(gè)處理退出問題的框架可以優(yōu)雅地不費(fèi)氣力的實(shí)現(xiàn)。這部分歸功于Struts是采用MVC設(shè)計(jì)模式的因此將模型和視圖清晰的分開。另外,Java是一個(gè)面向?qū)ο蟮恼Z(yǔ)言,其支持繼承,可以比JSP中的腳本更為容易地實(shí)現(xiàn)代碼重用。在Struts中,清單4中的代碼可以從JSP頁(yè)面中移植到Action類的execute()方法中。
此外,我們還可以定義一個(gè)繼承Struts Action類的基本類,其execute()方法中包含了清單4中的代碼。通過使用類繼承機(jī)制,其他類可以繼承基本類中的通用邏輯來設(shè)置HTTP頭信息以及檢索HttpSession對(duì)象中的username字符串。這個(gè)基本類是一個(gè)抽象類并定義了一個(gè)抽象方法executeAction()。所有繼承自基類的子類都應(yīng)實(shí)現(xiàn)exectuteAction()方法而不是覆蓋它。清單6是基類的部分代碼:

  清單6

public abstract class BaseAction extends Action {
 public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)
 throws IOException, ServletException {
  response.setHeader("Cache-Control","no-cache");
  //Forces caches to obtain a new copy of the page from the origin server
  response.setHeader("Cache-Control","no-store");
  //Directs caches not to store the page under any circumstance
  response.setDateHeader("Expires", 0); //Causes the proxy cache to see the page as "stale"
  response.setHeader("Pragma","no-cache"); //HTTP 1.0 backward compatibility

  if (!this.userIsLoggedIn(request)) {
   ActionErrors errors = new ActionErrors();
   errors.add("error", new ActionError("logon.sessionEnded"));
   this.saveErrors(request, errors);
   return mapping.findForward("sessionEnded");
  }
  return executeAction(mapping, form, request, response);
 }

 protected abstract ActionForward executeAction(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
 throws IOException, ServletException;

 private boolean userIsLoggedIn(HttpServletRequest request) {
  if (request.getSession().getAttribute("User") == null) {
   return false;
  }

  return true;
 }
}

  清單6中的代碼與清單4中的很相像,僅僅只是用ActionMapping findForward替代了RequestDispatcher forward。清單6中,如果在HttpSession中未找到username字符串,ActionMapping對(duì)象將找到名為sessionEnded的forward元素并跳轉(zhuǎn)到對(duì)應(yīng)的path。如果找到了,子類將執(zhí)行其實(shí)現(xiàn)了executeAction()方法的業(yè)務(wù)邏輯。因此,在配置文件struts-web.xml中為所有子類聲明個(gè)一名為sessionEnded的forward元素是必須的。清單7以secure1 action闡明了這樣一個(gè)聲明:

  清單7

<action path="/secure1"
type="com.kevinhle.logoutSampleStruts.Secure1Action"
scope="request">
<forward name="success" path="/WEB-INF/jsps/secure1.jsp"/>
<forward name="sessionEnded" path="/login.jsp"/>
</action>

  繼承自BaseAction類的子類Secure1Action實(shí)現(xiàn)了executeAction()方法而不是覆蓋它。Secure1Action類不執(zhí)行任何退出代碼,如清單8:

public class Secure1Action extends BaseAction {
 public ActionForward executeAction(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
 throws IOException, ServletException {

  HttpSession session = request.getSession();
  return (mapping.findForward("success"));
 }
}

  只需要定義一個(gè)基類而不需要額外的代碼工作,上述解決方案是優(yōu)雅而有效的。不管怎樣,將通用的行為方法寫成一個(gè)繼承StrutsAction的基類是許多Struts項(xiàng)目的共同經(jīng)驗(yàn),值得推薦。

  結(jié)論

  本文闡述了解決退出問題的方案,盡管方案簡(jiǎn)單的令人驚訝,但卻在所有情況下都能有效地工作。無(wú)論是對(duì)JSP還是Struts,所要做的不過是寫一段不超過50行的代碼以及一個(gè)記錄用戶最后登陸時(shí)間的方法。在Web應(yīng)用中混合使用這些方案能夠使擁護(hù)的私人數(shù)據(jù)不致泄露,同時(shí),也能增加用戶的經(jīng)驗(yàn)。

您可能感興趣的文章:
  • JSP struts2 url傳參中文亂碼解決辦法
  • JSP 開發(fā)之Struts2內(nèi)建自定義攔截器
  • java+jsp+struts2實(shí)現(xiàn)發(fā)送郵件功能
  • struts2+jsp+jquery+Jcrop實(shí)現(xiàn)圖片裁剪并上傳實(shí)例
  • jsp、struts、spring、mybatis實(shí)現(xiàn)前端頁(yè)面功能模塊化拆分的方案
  • struts2+jsp實(shí)現(xiàn)文件上傳的方法
  • STRUTS+AJAX+JSP 請(qǐng)求到后臺(tái)亂碼問題解決方法
  • jsp struts1 標(biāo)簽實(shí)例詳解
  • JSP Struts過濾xss攻擊的解決辦法

標(biāo)簽:武威 拉薩 馬鞍山 鄭州 岳陽(yáng) 亳州 紅河 大興安嶺

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《JSP和Struts解決用戶退出問題》,本文關(guān)鍵詞  JSP,和,Struts,解決,用戶,退,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《JSP和Struts解決用戶退出問題》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于JSP和Struts解決用戶退出問題的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    99re成人精品视频| 日韩av在线资源| 91极品视觉盛宴| 国产一起色一起爱| 亚洲一区在线观看免费观看电影高清| av一本在线| 噜噜噜天天躁狠狠躁夜夜精品| 亚洲国产日日夜夜| 日韩国产一级片| 欧美91福利在线观看| 欧美激情啪啪| 日韩小视频在线观看| 超碰97在线资源站| 97精品一区二区视频在线观看| 一区二区三区午夜| 97精品资源在线观看| 在线视频欧美日韩| 国产亚洲精品av| 国产成人短视频在线观看| 欧美成ee人免费视频| 国产高清一区二区三区视频| 99视频有精品高清视频| 奇米777在线视频| 欧美男男激情videos| 九一九一国产精品| 免费一级黄色录像| 91精品国产综合久久久久久丝袜| 久久99精品久久久久久琪琪| 欧美人体视频| 日本亚洲欧美天堂免费| www.日本在线视频| 深夜福利在线看| 精品福利视频导航| 亚洲午夜av| 蜜臀国产一区二区三区在线播放| 成人午夜电影免费在线观看| 天堂视频免费看| 99久久伊人网影院| 99a精品视频在线观看| 成人激情动漫在线观看| 国产综合色一区二区三区| 国产精品揄拍500视频| 久久精品视频在线| 波多野结衣喷潮| 嫩模一区二区三区| 日韩精品资源二区在线| 羞羞视频网页| 欧美性受xxxx黑人猛交| 欧美精选一区| 精品视频一区二区三区四区五区| 欧美精品日韩综合在线| 久久免费一区| 一级日韩一区在线观看| 欧美一区二区色| 亚洲国产一区二区精品视频| 国模精品娜娜一二三区| 疯狂做受xxxⅹ高潮视频免费| 国产精彩视频一区二区| 中文字幕亚洲乱码| 91av视频在线免费观看| 久久久精品电影| 日韩人妻精品无码一区二区三区| 四虎亚洲精品| 国产日产精品一区二区三区的介绍| 日本三级电影网站| 久久福利视频一区二区| 久久成人精品一区二区三区| 国产福利免费观看| 日韩av图片| 欧美tickling网站挠脚心| 成人亲热视频网站| 免费免费啪视频在线观播放| 午夜精品亚洲一区二区三区嫩草| 麻豆精品久久精品色综合| 亚洲性受xxx喷奶水| 国产精品日产欧美久久久久| 精品一区二区在线播放| 一区二区欧美在线观看| 日韩成人一区二区三区| 日本五十肥熟交尾| 亚洲精品97久久中文字幕无码| 亚洲性生活视频| 狠狠做深爱婷婷久久综合一区| 最新eeuss影院在线观看| 久久久久久久久久亚洲| 很黄很污的视频网站| 亚洲精品第一| 欧美午夜国产| 日本wwwcom| www视频在线观看| 亚洲欧美激情另类校园| 欧美三级韩国三级日本三斤在线观看| 九色精品国产蝌蚪| 午夜成人亚洲理伦片在线观看| 精品人妻av一区二区三区| 春日野结衣av| 精品国产拍在线观看| 精品日韩视频在线观看| 亚洲黄色av网站| 成人在线二区| 欧美裸体在线版观看完整版| 国产网红女主播精品视频| 伊人伊成久久人综合网小说| 伊人网在线观看| 久久青草国产手机看片福利盒子| 黄色网址在线免费| 中文字幕欧美亚洲| 18加网站在线| 欧美韩日精品| 国产www在线观看| 日韩黄色动漫| 丰腴饱满的极品熟妇| 中文字幕中文乱码欧美一区二区| 亚洲av成人片色在线观看高潮| 欧美free嫩15| 国产小视频在线免费观看| 三上悠亚在线资源| 欧美magnet| 国产精品视频免费观看| 一区二区三区亚洲变态调教大结局| 香蕉国产精品偷在线观看不卡| 日日夜夜免费精品视频| 国产91免费在线观看| 狠狠躁狠狠躁视频专区| 亚洲黄色影院| 亚洲国产欧美视频| 精品久久久亚洲| 18禁裸男晨勃露j毛免费观看| 日韩精品日韩在线观看| 女人在下体塞跳蛋在线观看| 久久国产乱子精品免费女| 日韩欧美国产一二三区| 国产日韩欧美在线视频观看| 国产午夜福利视频在线观看| 欧美久久久久中文字幕| 国模吧一区二区| 九一精品在线观看| 日本精品在线视频| 91欧洲在线视精品在亚洲| 亚洲香蕉成人av网站在线观看| 欧美欧美黄在线二区| 麻豆网站免费在线观看| 欧美自拍偷拍一区| 蜜桃视频成人| 久久国产亚洲精品无码| 99视频在线视频| 国产精品16p| 久久精品国产亚洲av麻豆色欲| 国产8mav视频| 99热在线观看精品| 国产亚洲日本欧美韩国| 免费影视观看网站入口| 美女又爽又黄免费| 日本sm极度另类视频| 成年女人在线看片| 91沈先生在线观看| 久久国产精品免费视频| 久久精品观看| 丝袜美腿诱惑一区二区三区| 热re99久久精品国99热蜜月| 婷婷成人av| 亚洲国产精品系列| 波多野结衣中文字幕在线| 人与人69性欧美三人交| 波多野结衣午夜| av福利导福航大全在线| 免费日韩精品中文字幕视频在线| 樱花草涩涩www在线播放| 国内精品久久久久| www.男人的天堂| 欧美另类老女人| 免费网站黄在线观看| 99中文字幕一区| 成年人视频在线免费| 激情小说网站亚洲综合网| 717影院理论午夜伦不卡久久| 欧美撒尿777hd撒尿| 国产一区二区三区| 久久久夜色精品亚洲| 神马午夜在线视频| 日av中文字幕| 欧美日韩情趣电影| 国产美女精彩久久| 2019天天操夜夜操| 欧美激情1区2区3区| 久久精品aⅴ无码中文字字幕重口| 正在播放日韩精品| 国产欧美精品日韩区二区麻豆天美| 欧美性猛交内射兽交老熟妇| 麻豆9191精品国产| 涩爱av色老久久精品偷偷鲁| 成人免费av电影| 成年人黄色片视频| 欧美日韩一区二区视频在线观看| 亚洲伦理一区| 国产精品av久久久久久麻豆网| 亚洲精品国产suv一区88| 国产美女精品写真福利视频| 香蕉视频网站在线播放| 91.com视频| 欧美爱爱网站| 男女激烈动态图| 中文字幕日韩高清| 日韩欧美精品三级| 国产欧美久久一区二区三区| 久久国产热视频| 丰满熟妇人妻中文字幕| 国产精品一区一区三区| 韩国av电影在线观看| 亚洲国产欧美一区二区丝袜黑人| 麻豆一区二区三区四区精品蜜桃| 免费电影一区| 美女av在线免费看| 国产午夜精品一区二区三区欧美| 香港三级经典全部种子下载| 波多野结衣一区二区三区在线观看| 精品国产av一区二区| 国产欧美啪啪| 人妻夜夜添夜夜无码av| 波多野结衣在线观看一区二区| 国产精品国产三级国产aⅴ中文| 国产精品久久成人免费观看| 国产乱码精品一区二区三区忘忧草| 91九色porny在线| 中文字幕乱码人妻二区三区| 欧美视频专区一二在线观看| 很污的网站在线观看| 蜜桃视频涩涩| 麻豆视频在线| 男人的天堂av社区在线| 一个人看的www片免费高清视频| 色噜噜国产精品视频一区二区| 自拍网站在线观看| 亚洲免费视频一区二区三区| 亚洲国产你懂的| 亚洲一级一级97网| www.久久ai| 国产免费拔擦拔擦8x高清在线人| 国产大学生av| 美女精品视频一区| 91av资源在线| 催眠调教后宫乱淫校园| 九色porny在线| 富二代精品短视频| 狠狠久久综合婷婷不卡| 欧美成ee人免费视频| 亚洲色图图片区| 激情校园亚洲图片| 丁香资源影视免费观看| 久久久久久久9999| 亚洲免费黄色网址| 国产在线视频你懂| 亚洲最大成人网站| 国产精品色婷婷| 国产免费999| 午夜精品福利一区二区三区蜜桃| 韩国女同性做爰三级| av首页在线观看| 欧美色手机在线观看| 中文字幕三级电影| 一级黄色录像免费看| 激情五月宗合网| 国产色视频在线播放| av磁力番号网| 日韩欧美专区在线| 国产精品理论片在线观看| 美媛馆国产精品一区二区| 国产免费一区二区三区免费视频| 亚洲欧洲一二三| 欧美人交a欧美精品| 亚洲妇熟xx妇色黄| 免费精品国产的网站免费观看| www久久99| 国产色视频在线播放| 视频一区二区免费| 2020天天操| 午夜精品免费在线| 亚洲视频视频在线| 欧美亚洲另类小说| 久久国产精品影院| jizz在亚洲| 久久免费的精品国产v∧| 国产精品免费91| 日韩精品视频一区二区三区| 精品伦理精品一区| 偷拍一区二区| 亚洲777理论| 成人免费网站www网站高清| 国产午夜精品全部视频播放| 国产精品无av码在线观看| h精品动漫在线观看| 午夜免费看毛片| 妖精视频成人观看www| 性欧美videosex高清少妇| 美女又黄又免费的视频| 国产呻吟对白刺激无套视频在线| 日韩护士脚交太爽了| 狠狠人妻久久久久久| 亚洲黄色av片| 在线免费观看www| 一本一本久久a久久综合精品| 日本在线视频www| 特黄特色欧美大片| 亚洲视频一区二区免费在线观看| 97超级碰碰碰久久久| 特黄特色欧美大片| 国产精品污网站| 岛国av在线一区| 欧美高清不卡在线| 亚洲精品久久久久久| 26uuu亚洲综合色| 欧美一区二区三区视频在线| 精品人妻一区二区三区潮喷在线| 91九色视频在线| 初高中福利视频网站| 日本成人黄色片| 中文字幕乱码人妻无码久久| 极品蜜桃臀肥臀-x88av| 免费成人在线电影| 欧美成人日本| 永久免费网站视频在线观看| 日韩在线观看电影完整版高清免费悬疑悬疑| 先锋影音av资源站| wwwwwxxxx日本| 国产欧美日韩综合| 日本黄色入口| 在线观看视频免费一区二区三区| 香蕉视频在线看|