




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、.正確的解決用戶退出問題JSP和Struts在一個有密碼保護(hù)的Web應(yīng)用當(dāng)中,正確妥善的處理用戶退出過程并不僅僅只需要調(diào)用HttpSession對象的invalidate()方法,因為現(xiàn)在大部分瀏覽器上都有后退(Back)和前進(jìn)(Forward)按鈕,允許用戶后退或前進(jìn)到一個頁面。在用戶退出一個Web應(yīng)用之后,如果按了后退按鈕,瀏覽器把緩存中的頁面呈現(xiàn)給用戶,這會使用戶產(chǎn)生疑惑,他們會開始擔(dān)心他們的個人數(shù)據(jù)是否安全。實際上,許多Web應(yīng)用會彈出一個頁面,警告用戶退出時關(guān)閉整個瀏覽器,以此來阻止用戶點擊后退按鈕。還有一些使用JavaScript,但在某些客戶端瀏覽器中這卻不一定起作用。這些解決方
2、案大多數(shù)實現(xiàn)都很笨拙,且不能保證在任何情況下都100%有效,同時,它還要求用戶有一定的操作經(jīng)驗。這篇文章以簡單的程序示例闡述了正確解決用戶退出問題的方案。作者Kevin Le首先描述了一個理想的密碼保護(hù)Web應(yīng)用,然后以示例程序解釋問題如何產(chǎn)生并討論解決問題的方案。文章雖然是針對JSP進(jìn)行討論闡述,但作者所闡述的概念很容易理解而且能夠為其他Web技術(shù)所采用。最后最后,作者Kevin Le用Jakarta Struts更為優(yōu)雅地解決用戶退出問題。文中包含JSP和Struts的示例程序 (3,700 words; September 27, 2004)大部分Web應(yīng)用不會包含像銀行賬戶或信用卡資料
3、那樣機密的信息,但是一旦涉及到敏感數(shù)據(jù),就需要我們提供某些密碼保護(hù)機制。例如,在一個工廠當(dāng)中,工人必須通過Web應(yīng)用程序訪問他們的時間安排、進(jìn)入他們的培訓(xùn)課程以及查看他們的薪金等等。此時應(yīng)用SSL(Secure Socket Layer)就有些大材小用了(SSL頁面不會在緩存中保存,關(guān)于SSL的討論已經(jīng)超出本文的范圍)。但是這些應(yīng)用又確實需要某種密碼保護(hù)措施,否則,工人(在這種情況下,也就是Web應(yīng)用的使用者)就可以發(fā)現(xiàn)工廠中所有員工的私人機密信息。類似上面的情況還包括位于公共圖書館、醫(yī)院、網(wǎng)吧等公共場所的計算機。在這些地方,許多用戶共同使用幾臺計算機,此時保護(hù)用戶的個人數(shù)據(jù)就顯得至關(guān)重要。
4、同時應(yīng)用程序的良好設(shè)計與實現(xiàn)對用戶專業(yè)知識以及相關(guān)培訓(xùn)要求少之又少。讓我們來看一下現(xiàn)實世界中一個完美的Web應(yīng)用是怎樣工作的:1. 用戶在瀏覽器中輸入URL,訪問一個頁面。2. Web應(yīng)用顯示一個登陸頁面,要求用戶輸入有效的驗證信息。3. 用戶輸入用戶名和密碼。4. 假設(shè)用戶提供的驗證信息是正確的,經(jīng)過了驗證過程,Web應(yīng)用允許用戶瀏覽他有權(quán)訪問的區(qū)域。5. 退出時,用戶點擊頁面的退出按鈕,Web應(yīng)用顯示確認(rèn)頁面,詢問用戶是否真的需要退出。一旦用戶點擊確定按鈕,Session結(jié)束,Web應(yīng)用重新定位到登陸頁面。用戶現(xiàn)在可以放心的離開而不用擔(dān)心他的信息會被泄露。6. 另一個用戶坐到了同一臺電腦前
5、。他點擊后退按鈕,Web應(yīng)用不應(yīng)該顯示上一個用戶訪問過的任何一個頁面。事實上,Web應(yīng)用將一直停留在登陸頁面上,除非第二個用戶提供正確的驗證信息,之后才可以訪問他有權(quán)限的區(qū)域。通過示例程序,文章向您闡述了如何在一個Web應(yīng)用中實現(xiàn)上面的功能。一. JSP samples為了更為有效地向您說明這個解決方案,本文將從展示一個Web應(yīng)用logoutSampleJSP1中碰到的問題開始。這個示例代表了許多沒有正確解決退出過程的Web應(yīng)用。logoutSampleJSP1包含一下JSP頁面:login.jsp, home.jsp, secure1.jsp, secure2.jsp, logout.jsp
6、, loginAction.jsp, 和 logoutAction.jsp。其中頁面home.jsp, secure1.jsp, secure2.jsp, 和 logout.jsp是不允許未經(jīng)認(rèn)證的用戶訪問的,也就是說,這些頁面包含了重要信息,在用戶登陸之前或者退出之后都不應(yīng)該顯示在瀏覽器中。login.jsp頁面包含了用于用戶輸入用戶名和密碼的form。logout.jsp頁面包含了要求用戶確認(rèn)是否退出的form。loginAction.jsp和logoutAction.jsp作為控制器分別包含了登陸和退出動作的代碼。第二個Web示例應(yīng)用logoutSampleJSP2展示了如何糾正示例lo
7、goutSampleJSP1中的問題。但是第二個示例logoutSampleJSP2自身也是有問題的。在特定情況下,退出問題依然存在。第三個Web示例應(yīng)用logoutSampleJSP3對logoutSampleJSP2進(jìn)行了改進(jìn),比較妥善地解決了退出問題。最后一個Web示例logoutSampleStruts展示了JakartaStruts如何優(yōu)雅地解決退出問題。注意:本文所附示例在最新版本的Microsoft Internet Explorer (IE), Netscape Navigator, Mozilla, FireFox和Avant瀏覽器上測試通過。二. Login actionB
8、rian Pontarelli的經(jīng)典文章 J2EE Security: Container Versus Custom討論了不同的J2EE認(rèn)證方法。文章同時指出,HTTP協(xié)議和基于form的認(rèn)證方法并不能提供處理用戶退出問題的機制。因此,解決方法便是引入用戶自定義的安全實現(xiàn)機制,這就提供了更大的靈活性。在用戶自定義的認(rèn)證方法中,普遍采用的方法是從用戶提交的form中獲得用戶輸入的認(rèn)證信息,然后到諸如LDAP (lightweight directory access protocol)或關(guān)系數(shù)據(jù)庫(relational database management system, RDBMS)的安全
9、域中進(jìn)行認(rèn)證。如果用戶提供的認(rèn)證信息是有效的,登陸動作在HttpSession對象中保存某個對象。HttpSession存在著保存的對象則表示用戶已經(jīng)登陸到Web應(yīng)用當(dāng)中。為了方便起見,本文所附的示例只在HttpSession中保存一個用戶名以表明用戶已經(jīng)登陸。清單1是從loginAction.jsp頁面中節(jié)選的一段代碼以此講解登陸動作:Listing 1/./initialize RequestDispatcher object; set forward to home page by defaultRequestDispatcher rd = request.getRequestDispa
10、tcher( "home.jsp" );/Prepare connection and statementrs = 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 ke
11、y if (rs.getString( "password" ).equals(password) /If valid password session.setAttribute( "User" , userName); /Saves username string in the session object else /Password does not mat
12、ch, i.e., invalid user password request.setAttribute( "Error" , "Invalid password." ); rd = request.getRequestDispatcher( "login.jsp" ); /No record in the result set, i
13、.e., invalid username else request.setAttribute( "Error" , "Invalid user name." ); rd = request.getRequestDispatcher( "login.jsp" ); /As a controller
14、, loginAction.jsp finally either forwards to "login.jsp" or "home.jsp"rd.forward(request, response);/.本文當(dāng)中所附Web應(yīng)用示例均以關(guān)系型數(shù)據(jù)庫作為安全域,但本問所講述的內(nèi)容同樣適用于其他任何類型的安全域。三. Logout action退出動作包含刪除用戶名以及調(diào)用用戶的HttpSession對象的invalidate()方法。清單2是從loginoutAction.jsp中節(jié)選的一段代碼,以此說明退出動作:Listing 2/.session.rem
15、oveAttribute( "User" );session.invalidate();/.四. 阻止未經(jīng)認(rèn)證訪問受保護(hù)的JSP頁面從提交的form中獲取用戶提交的認(rèn)證信息并經(jīng)過驗證后,登陸動作僅僅在HttpSession對象中寫入一個用戶名。退出動作則剛好相反,它從HttpSession中刪除用戶名并調(diào)用 HttpSession對象的invalidate()方法。為了使登陸和退出動作真正發(fā)揮作用,所有受保護(hù)的JSP頁面必須首先驗證 HttpSession中包含的用戶名,以便確認(rèn)用戶當(dāng)前是否已經(jīng)登陸。如果HttpSession中包含了用戶名,就說明用戶已經(jīng)登陸,Web應(yīng)用會
16、將剩余的JSP頁中的動態(tài)內(nèi)容發(fā)送給瀏覽器。否則,JSP頁將跳轉(zhuǎn)到登陸頁面,login.jsp。頁面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
17、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/.在這個代碼段中,程序從HttpSession中檢索username字符串。如果username字符串為空,Web應(yīng)用
18、則自動中止執(zhí)行當(dāng)前頁面并跳轉(zhuǎn)到登陸頁,同時給出錯誤信息“Session has ended. Please log in.”;如果不為空,Web應(yīng)用繼續(xù)執(zhí)行,把剩余的頁面提供給用戶,從而使JSP頁面的動態(tài)內(nèi)容成為服務(wù)對象。五.運行l(wèi)ogoutSampleJSP1運行l(wèi)ogoutSampleJSP1將會出現(xiàn)如下幾種情形:" 如果用戶沒有登陸,Web應(yīng)用將會正確中止受保護(hù)頁面home.jsp, secure1.jsp, secure2.jsp和logout.jsp中動態(tài)內(nèi)容的執(zhí)行。也就是說,假如用戶并沒有登陸,但是在瀏覽器地址欄中直接敲入受保護(hù)JSP頁的地址試圖訪問,Web應(yīng)用將自動跳轉(zhuǎn)
19、到登陸頁面,同時顯示錯誤信息“Session has ended.Please log in.”" 同樣的,當(dāng)一個用戶已經(jīng)退出,Web應(yīng)用將會正確中止受保護(hù)頁面home.jsp, secure1.jsp, secure2.jsp和logout.jsp中動態(tài)內(nèi)容的執(zhí)行。也就是說,用戶退出以后,如果在瀏覽器地址欄中直接敲入受保護(hù)JSP頁的地址試圖訪問,Web應(yīng)用將自動跳轉(zhuǎn)到登陸頁面,同時顯示錯誤信息“Session has ended.Please log in.”" 用戶退出以后,如果點擊瀏覽器上的后退按鈕返回到先前的頁面,Web應(yīng)用將不能正確保護(hù)受保護(hù)的JSP頁面在Sess
20、ion銷毀后(用戶退出)受保護(hù)的JSP頁會重新顯示在瀏覽器中。然而,點擊該頁面上的任何鏈接,Web應(yīng)用都會跳轉(zhuǎn)到登陸頁面,同時顯示錯誤信息“Session has ended.Please log in.”六. 阻止瀏覽器緩存上述問題的根源就在于現(xiàn)代大部分瀏覽器都有一個后退按鈕。當(dāng)點擊后退按鈕時,默認(rèn)情況下瀏覽器不會從Web服務(wù)器上重新獲取頁面,而是簡單的從瀏覽器緩存中重新載入頁面。這個問題并不僅限于基于Java(JSP/servlets/Struts) 的Web應(yīng)用當(dāng)中,在基于PHP (Hypertext Preprocessor)、ASP、(Active Server Pages)、和.N
21、ET的Web應(yīng)用中也同樣存在。在用戶點擊后退按鈕之后,瀏覽器到Web服務(wù)器(一般來說)或者應(yīng)用服務(wù)器(在java的情況下)再從服務(wù)器到瀏覽器這樣通常意義上的HTTP回路并沒有建立。僅僅只是用戶,瀏覽器和緩存之間進(jìn)行了交互。所以即使受保護(hù)的JSP頁面,例如home.jsp, secure1.jsp, secure2.jsp和logout.jsp包含了清單3上的代碼,當(dāng)點擊后退按鈕時,這些代碼也永遠(yuǎn)不會執(zhí)行的。緩存的好壞,真是仁者見仁智者見智。緩存事實上的確提供了一些便利,但這些便利通常只存在于靜態(tài)的HTML頁面或基于圖形或影像的頁面。而另一方面,Web 應(yīng)用通常是面向數(shù)據(jù)的。由于Web應(yīng)用中的數(shù)
22、據(jù)頻繁變更,所以與為了節(jié)省時間從緩存中讀取并顯示過期的數(shù)據(jù)相比,提供最新的數(shù)據(jù)顯得尤為重要!幸運的是,HTTP頭信息“Expires”和“Cache-Control”為應(yīng)用程序服務(wù)器提供了一個控制瀏覽器和代理服務(wù)器上緩存的機制。HTTP頭信息Expires告訴代理服務(wù)器它的緩存頁面何時將過期。HTTP1.1規(guī)范中新定義的頭信息Cache-Control在Web應(yīng)用當(dāng)中可以通知瀏覽器不緩存任何頁面。當(dāng)點擊后退按鈕時,瀏覽器發(fā)送Http請求道應(yīng)用服務(wù)器以便獲取該頁面的最新拷貝。如下是使用Cache-Control的基本方法:" no-cache:強制緩存從服務(wù)器上獲取該頁面的最新拷貝&q
23、uot; no-store: 在任何情況下緩存不保存該頁面HTTP1.0規(guī)范中的Pragma:no-cache等同于HTTP1.1規(guī)范中的Cache-Control:no-cache,同樣可以包含在頭信息中。通過使用HTTP頭信息的cache控制,第二個示例應(yīng)用logoutSampleJSP2解決了logoutSampleJSP1的問題。logoutSampleJSP2與logoutSampleJSP1不同表現(xiàn)在如下代碼段中,這一代碼段加入進(jìn)所有受保護(hù)的頁面中:/.response.setHeader( "Cache-Control" , "no-cache&qu
24、ot; );/Forces caches to obtain a new copy of the page from the origin serverresponse.setHeader( "Cache-Control" , "no-store" );/Directs caches not to store the page under any circumstanceresponse.setDateHeader( "Expires" , 0);/Causes the proxy cache to see the page as &
25、quot;stale"response.setHeader( "Pragma" , "no-cache" );/HTTP 1.0 backward compatibilityString userName = (String) session.getAttribute( "User" );if (null = userName) request.setAttribute( "Error" , "Session has ended. Please login.
26、" ); RequestDispatcher rd = request.getRequestDispatcher( "login.jsp" ); rd.forward(request, response);/.通過設(shè)置頭信息和檢查HttpSession對象中的用戶名來確保瀏覽器不會緩存JSP頁面。同時,如果用戶未登陸,JSP頁面的動態(tài)內(nèi)容不會發(fā)送到瀏覽器,取而代之的將是登陸頁面login.jsp。七. 運行l(wèi)ogoutSampleJSP2運行Web示例應(yīng)用logoutSampleJSP2后將會
27、看到如下結(jié)果:" 當(dāng)用戶退出后試圖點擊后退按鈕,瀏覽器不會重新顯示受保護(hù)的頁面,它只會顯示登陸頁login.jsp同時給出提示信息Session has ended. Please log in. " 然而,當(dāng)按了后退按鈕返回的頁是處理用戶提交數(shù)據(jù)的頁面時,IE和Avant瀏覽器將彈出如下信息提示:警告:頁面已過期The page you requested was created using information you submitted in a form. This page is no longer available. As a security divcau
28、tion, Internet Explorer does not automatically resubmit your information for you.Mozilla和FireFox瀏覽器將會顯示一個對話框,提示信息如下:The page you are trying to view contains POSTDATA that has expired from cache. If you resend the data, any action from the form carried out (such as a search or online purchase) will b
29、e repeated. To resend the data, click OK. Otherwise, click Cancel.在IE和Avant瀏覽器中選擇刷新或者在 Mozilla和FireFox瀏覽器中選擇重新發(fā)送數(shù)據(jù)后,前一個JSP頁面將重新顯示在瀏覽器中。顯然的,這病不是我們所想看到的因為它違背了 logout動作的目的。發(fā)生這一現(xiàn)象時,很可能是一個惡意用戶在嘗試獲取其他用戶的數(shù)據(jù)。然而,這個問題僅僅出現(xiàn)在點擊后退按鈕后,瀏覽器返回到一個處理POST請求的頁面。八. 記錄最后登陸時間上述問題的發(fā)生是因為瀏覽器重新提交了其緩存中的數(shù)據(jù)。這本文的例子中,數(shù)據(jù)包含了用戶名和密碼。盡管I
30、E瀏覽器給出了安全警告信息,但事實上瀏覽器此時起到了負(fù)面作用。為了解決logoutSampleJSP2中出現(xiàn)的問題,logoutSampleJSP3的login.jsp除了包含username和password的之外,還增加了一個稱作lastLogon的隱藏表單域,此表單域?qū)討B(tài)的被初始化為一個long型值。這個long型值是通過調(diào)用System.currentTimeMillis()獲取到的自1970年1月1日以來的毫秒數(shù)。當(dāng)login.jsp中的form提交時,loginAction.jsp首先將隱藏域中的值與用戶數(shù)據(jù)庫中的lastLogon值進(jìn)行比較。只有當(dāng)lastLogon表單域中的
31、值大于數(shù)據(jù)庫中的值時Web應(yīng)用才認(rèn)為這是個有效的登陸。為了驗證登陸,數(shù)據(jù)庫中l(wèi)astLogon字段必須用表單中的lastLogon值進(jìn)行更新。上例中,當(dāng)瀏覽器重復(fù)提交緩存中的數(shù)據(jù)時,表單中的lastLogon值不比數(shù)據(jù)庫中的lastLogon值大,因此,loginAction將跳轉(zhuǎn)到login.jsp頁面,并顯示如下錯誤信息“Session has ended.Please log in.”清單5是loginAction中節(jié)選的代碼段:清單5/.RequestDispatcher rd = request.getRequestDispatcher( "home.jsp" )
32、;/Forward to homepage by default/.if (rs.getString( "password" ).equals(password) /If valid password long lastLogonDB = rs.getLong( "lastLogon" ); if (lastLogonForm > lastLogonDB) session.setAttribu
33、te( "User" , userName); /Saves username string in the session object stmt.executeUpdate( "update USER set lastLogon= " + lastLogonForm + "where userName = '" + userName + "'" );
34、160; else request.setAttribute( "Error" , "Session has ended. Please login." ); rd = request.getRequestDispatcher( "login.jsp" ); else /Password does not match,
35、 i.e., invalid user password request.setAttribute( "Error" , "Invalid password." ); rd = request.getRequestDispatcher( "login.jsp" );/.rd.forward(request, response);/.為了實現(xiàn)上述方法,你必須記錄每個用戶的最后登陸時間。對于采用關(guān)系型數(shù)據(jù)庫安全域來說,這點可以可以通過在某個表中加上lastLogin字
36、段輕松實現(xiàn)。雖然對LDAP以及其他的安全域來說需要稍微動下腦筋,但最后登陸方法很顯然是可以實現(xiàn)的。表示最后登陸時間的方法有很多。示例logoutSampleJSP3利用了自1970年1月1日以來的毫秒數(shù)。這個方法即使在許多人在不同瀏覽器中用一個用戶賬號登陸時也是可行的。九. 運行l(wèi)ogoutSampleJSP3運行示例logoutSampleJSP3將展示如何正確處理退出問題。一旦用戶退出,點擊瀏覽器上的后退按鈕在任何情況下都不會在瀏覽器中顯示受保護(hù)的JSP頁面。這個示例展示了如何正確處理退出問題而不需要對用戶進(jìn)行額外的培訓(xùn)。為了使代碼更簡練有效,一些冗余的代碼可以剔除。一種途徑就是把清單4中
37、的代碼寫到一個單獨的JSP頁中,其他JSP頁面可以通過標(biāo)簽 進(jìn)行使用 。十. Struts框架下的退出實現(xiàn)與直接使用JSP或JSP/servlets進(jìn)行Web應(yīng)用開發(fā)相比,另一個更好的可選方案是使用Struts。對于一個基于Struts的Web應(yīng)用來說,添加一個處理退出問題的框架可以優(yōu)雅地不費氣力的實現(xiàn)。這歸功于Struts是采用MVC設(shè)計模式的,因此可以將模型和視圖代碼清晰的分離。另外, Java是一個面向?qū)ο蟮恼Z言,支持繼承,可以比JSP中的腳本更為容易地實現(xiàn)代碼重用。對于Struts來說,清單4中的代碼可以從JSP頁面中移植到Action類的execute()方法中。此外,我們還可以定義
38、一個繼承Struts Action類的Action基類,其execute()方法中包含了類似清單4中的代碼。通過繼承,其他Action類可以繼承基本類中的通用邏輯來設(shè)置HTTP頭信息以及檢索HttpSession對象中的username字符串。這個Action基類是一個抽象類并定義了一個抽象方法executeAction()。所有繼承自Action基類的子類都必須實現(xiàn)exectuteAction()方法而不是覆蓋它。通過繼承這一機制,所有繼承自Action基類的子類都不必再擔(dān)心退出代碼接口。(plumbing實在不知道怎么翻譯了,+,高手幫幫忙啊!原文:With this inheritanc
39、e hierarchy in place, all of the base Action's subclasses no longer need to worry about any plumbing logout code.)。他們將只包含正常的業(yè)務(wù)邏輯代碼。清單6是基類的部分代碼:清單6publicabstractclass BaseAction extends Action public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletReques
40、t 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 serverresponse.setHeader( "Cache-Control" , "no-store" );/Directs ca
41、ches not to store the page under any circumstanceresponse.setDateHeader( "Expires" , 0);/Causes the proxy cache to see the page as "stale"response.setHeader( "Pragma" , "no-cache" );/HTTP 1.0 backward compatibilityif (!this.userIsLoggedIn(request)
42、 ActionErrors errors = new ActionErrors(); errors.add( "error" , new ActionError( "logon.sessionEnded" ); this.saveErrors(request, errors); return mapping.findForward( "sessionEnded" );return executeAction(mapp
43、ing, form, request, response);protectedabstract ActionForward executeAction(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throws IOException, ServletException;privateboolean userIsLoggedIn(HttpServletRequest request) if (request.getSession().ge
44、tAttribute( "User" ) = null) return false;return true;清單6中的代碼與清單4中的很相像,唯一區(qū)別是用ActionMapping findForward替代了RequestDispatcher forward。清單6中,如果在HttpSession中未找到username字符串,ActionMapping對象將找到名為 sessionEnded的forward元素并跳轉(zhuǎn)到對應(yīng)的path。如果找到了,子類通過實現(xiàn)executeAction()方法,將執(zhí)行他們自己的業(yè)務(wù)邏輯。因此,在str
45、uts-web.xml配置文件中為所有繼承自Action基類的子類聲明個一名為sessionEnded的forward元素并將其指向login.jsp是至關(guān)重要的。清單7以secure1 action闡明了這樣一個聲明:清單7<action path= "/secure1"type= ".kevinhle.logoutSampleStruts.Secure1Action"scope= "request" ><forward name= "success" path= "/WEB-INF/
46、jsps/secure1.jsp" /><forward name= "sessionEnded" path= "/login.jsp" /></action>繼承自BaseAction類的子類Secure1Action實現(xiàn)了executeAction()方法而不是覆蓋它。Secure1Action類不需要執(zhí)行任何退出代碼,如清單8:清單8publicclass Secure1Action extends BaseAction public ActionForward executeAction(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throws IOException, ServletException
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年藝術(shù)心理學(xué)研究生入學(xué)考試試卷及答案
- 2025年職業(yè)道德與法律專業(yè)本科畢業(yè)考試試卷及答案
- 2025年現(xiàn)代農(nóng)業(yè)與農(nóng)村發(fā)展新模式能力測評試題及答案
- 2025年人因工程師專業(yè)考試試題及答案
- 2025年人工智能應(yīng)用工程師資格考試試卷及答案
- 2025年金融及保險法專業(yè)考試試卷及答案
- 2025年老年服務(wù)與管理職業(yè)資格考試試卷及答案
- 2025年國防教育與安全意識的能力考核考試卷及答案
- 2025年初中生語文能力測評試卷及答案
- 電商的下半年工作計劃
- 2025春期國家開放大學(xué)《工程地質(zhì)》階段測驗1-4答案
- 2019草晶華營銷傳播創(chuàng)意方案
- 《醫(yī)學(xué)檢驗實驗室》課件
- 2025年國藥控股湖南有限公司招聘筆試參考題庫含答案解析
- 產(chǎn)品圖紙知識培訓(xùn)課件
- 老舊小區(qū)改造項目施工組織設(shè)計方案
- 上海交通大學(xué)《環(huán)境儀器分析》2023-2024學(xué)年第一學(xué)期期末試卷
- 辦公室主任崗位職責(zé)
- 家電維修工勞動合同三篇
- 頂管施工安全要點
- 《品質(zhì)管控》課件
評論
0/150
提交評論