隨筆-67  評(píng)論-522  文章-0  trackbacks-0
              通過(guò)之前的Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解實(shí)例詳解系列文章,我們已經(jīng)成功將這三種框架整合到了一起,這次大象將在此基礎(chǔ)上用一個(gè)小實(shí)例來(lái)說(shuō)明,怎么利用Struts2的攔截器特性實(shí)現(xiàn)登錄驗(yàn)證,以及超時(shí)后的跳轉(zhuǎn)問(wèn)題。
              大象在這里假設(shè)你已經(jīng)弄清楚了Struts2攔截器的基本概念,可以進(jìn)入實(shí)際運(yùn)用了。那么我們?cè)谥暗幕A(chǔ)上只需要做下小小的改變,就可以使用Struts2的攔截器機(jī)制實(shí)現(xiàn)登錄的驗(yàn)證。
              修改數(shù)據(jù)庫(kù)
              user表中增加password字段,將初始密碼都設(shè)為123,因?yàn)槭鞘纠圆捎妹鞔a,實(shí)際開(kāi)發(fā)中,當(dāng)然不能這樣做,需要進(jìn)行加密處理。再將name改為username,其實(shí)name字段可以不用改名,我這樣做是為了命名規(guī)范,請(qǐng)注意,如果字段改為username,User類(lèi)中的對(duì)應(yīng)屬性也要進(jìn)行相應(yīng)變化(如果你加注釋寫(xiě)法可以不用改),還有TestTestHibernateDao中的getName()都要改為getUsername()。
              修改index.jsp
              hello.action改為login!welcome.action
              增加登錄類(lèi)
              web包下創(chuàng)建LoginAction類(lèi),在其中添加welcomelogin方法,前者為index.jsp的跳轉(zhuǎn)方法,它將轉(zhuǎn)向到login.jsp頁(yè)面。而后者則用來(lái)處理登錄事件,如果成功將進(jìn)入到主頁(yè)面,失敗則返回到登錄頁(yè)面。最后面有源碼下載,這里省略。
              增加攔截器
              要實(shí)現(xiàn)登錄攔截的功能,最關(guān)鍵的就是要實(shí)現(xiàn)攔截類(lèi)了,在common包下面再增加一個(gè)interceptor包,創(chuàng)建AuthorityInterceptor類(lèi),并繼承MethodFilterInterceptor,為什么繼承它呢?因?yàn)樗菍?duì)方法進(jìn)行攔截,而在這個(gè)應(yīng)用中,我們是對(duì)絕大部分的方法進(jìn)行攔截,而對(duì)個(gè)別例外的方法排除。
              
              session中取得當(dāng)前登錄用戶,如果存在,就繼續(xù)執(zhí)行后面的攔截器;否則,就跳轉(zhuǎn)到登錄頁(yè)面。所以這樣實(shí)現(xiàn)了代碼后,還要在struts.xml中進(jìn)行相應(yīng)的設(shè)置。
              增加攔截器配置
             
              做好這一步之后,那么登錄驗(yàn)證攔截器將會(huì)對(duì)除了welcomelogin之外的所有方法進(jìn)行攔截了。另外我想說(shuō)下,攔截器的實(shí)現(xiàn)還有一種注解的方式,它不需要實(shí)現(xiàn)攔截器類(lèi),只需要指定一個(gè)注解類(lèi)型和一個(gè)攔截方法就可以了,具體的請(qǐng)自己去查相關(guān)資料。這里我沒(méi)采取注解方式是因?yàn)樗荒軕?yīng)用到方法級(jí)別,不能進(jìn)行代碼復(fù)用,如果有多個(gè)Action都需要執(zhí)行攔截操作,那么就得把同樣的注解方法復(fù)制到不同的Action中,這無(wú)疑是很糟糕的。而使用攔截器類(lèi)就簡(jiǎn)單多了,只需要在配置文件中指定它,并引用它,就可以在任意的Action中生效,也沒(méi)有侵入式代碼,這就是常說(shuō)的AOP切面,struts2的攔截器就是AOP的一個(gè)具體實(shí)現(xiàn)。
              增加全局轉(zhuǎn)向配置
             
              還記得攔截器里面的return Action.LOGIN 這句吧,當(dāng)程序執(zhí)行完這一行后,就會(huì)到struts.xml文件中去找namelogin全局轉(zhuǎn)向配置,因此這里我設(shè)置為一個(gè)jsp頁(yè)面,而沒(méi)有定義成/login!welcome.action就是因?yàn)槿绻催@樣做了,那么轉(zhuǎn)向后,登錄頁(yè)面將顯示在iframe框架中,這肯定不是我們希望看到的。解決這個(gè)問(wèn)題,網(wǎng)上有很多方法,我查了一下,再結(jié)合實(shí)際,其實(shí)沒(méi)那么復(fù)雜,一句話就可以搞定。如果使用frameset這種做法也有效,大象同樣測(cè)試過(guò),只不過(guò)例子中的代碼沒(méi)有這樣寫(xiě)而已。
              增加jump.jsp
             
              增加login.jsp
              登錄頁(yè)面,輸入用戶名與密碼,因?yàn)槭抢?,所以我沒(méi)加驗(yàn)證碼,在正式開(kāi)發(fā)中應(yīng)該加上。
             
              增加login-index.jsp
              這是登錄成功后轉(zhuǎn)向的頁(yè)面,在這里,我用iframe框架來(lái)顯示內(nèi)容。
             
              到這里,所有工作都已經(jīng)完成,已經(jīng)可以登錄登出了,并且攔截器也可以正常工作,超時(shí)登出也沒(méi)問(wèn)題,大家下載例子運(yùn)行看看吧!
              源碼下載: ssh2-interceptor
              本文為菠蘿大象原創(chuàng),如要轉(zhuǎn)載請(qǐng)注明出處。http://bolo.blogjava.net/
          posted on 2010-08-28 14:14 菠蘿大象 閱讀(29466) 評(píng)論(12)  編輯  收藏 所屬分類(lèi): Struts2

          評(píng)論:
          # re: 基于SSH2框架Struts2攔截器的登錄驗(yàn)證實(shí)現(xiàn) 2011-05-09 11:40 | taote
          大象好久沒(méi)有更新博客了?。。。。?nbsp; 回復(fù)  更多評(píng)論
            
          # re: 基于SSH2框架Struts2攔截器的登錄驗(yàn)證實(shí)現(xiàn) 2011-06-03 14:04 | bryan
          水印圖案讓人看起來(lái)很不舒服,可以將字變大,少點(diǎn).  回復(fù)  更多評(píng)論
            
          # re: 基于SSH2框架Struts2攔截器的登錄驗(yàn)證實(shí)現(xiàn) 2011-06-03 14:16 | 菠蘿大象
          @bryan
          這已經(jīng)是很大的字號(hào)了,再大,會(huì)很丑,我試過(guò),圖片的顯示只是幫助文章進(jìn)行說(shuō)明,具體的請(qǐng)看源代碼,另外你說(shuō)看起來(lái)很不舒服?我感覺(jué)還好吧,可能是你沒(méi)習(xí)慣而已,不要太計(jì)較圖片水印,關(guān)鍵是我的東西對(duì)你有沒(méi)有用,看個(gè)開(kāi)頭就知道是否要繼續(xù)看下去,如果不適合你,請(qǐng)立馬關(guān)掉網(wǎng)頁(yè),不要對(duì)水印這些無(wú)關(guān)緊要的東西糾結(jié)來(lái)糾結(jié)去了,只要不影響閱讀就行,如果你實(shí)在不爽,那不看總可以吧  回復(fù)  更多評(píng)論
            
          # re: 基于SSH2框架Struts2攔截器的登錄驗(yàn)證實(shí)現(xiàn) 2011-06-17 00:33 | 王德超
          # re: 基于SSH2框架Struts2攔截器的登錄驗(yàn)證實(shí)現(xiàn) 2011-08-03 10:58 | gameover
          <interceptor-ref name="authority">
          <param name="excludeMethods">welcome,login</param>
          </interceptor-ref>

          為什么我執(zhí)行l(wèi)ongin這樣的action還是會(huì)被攔截呢 我把他們配置在一個(gè)struts.xml里面的。。。有個(gè)login的action。 怎么才攔截這個(gè)呢?  回復(fù)  更多評(píng)論
            
          # re: 基于SSH2框架Struts2攔截器的登錄驗(yàn)證實(shí)現(xiàn) 2011-08-03 11:26 | 菠蘿大象
          @gameover
          這個(gè)excludeMethods表示不攔截welcome與login方法  回復(fù)  更多評(píng)論
            
          # re: 基于SSH2框架Struts2攔截器的登錄驗(yàn)證實(shí)現(xiàn) 2011-08-03 12:56 | gameover
          @菠蘿大象
          這個(gè)意思我是明白, 我是這樣配置的


          <package name="hrms" extends="struts-default">
          <interceptors>
          <!-- 登錄驗(yàn)證攔截器 -->
          <interceptor name="authority" class="com.bolo.examples.common.interceptor.AuthorityInterceptor" />
          <interceptor-stack name="boloStack">
          <!-- 將登錄驗(yàn)證攔截器加入默認(rèn)的攔截器棧中 -->
          <interceptor-ref name="authority">
          <param name="excludeMethods">welcome,login</param>
          </interceptor-ref>
          <interceptor-ref name="paramsPrepareParamsStack" />
          </interceptor-stack>
          </interceptors>
          <default-interceptor-ref name="boloStack" />
          <global-results>
          <result name="login">/jump.jsp</result>
          </global-results>
          <action name="login" class="com.qieryee.ssi.struts.action.login">
          <result name="success">/index.jsp</result>
          <result name="input">/login.jsp</result>
          </action>
          <action name="loginout" class="com.qieryee.ssi.struts.action.login"
          method="loginout">
          <result name="success">/index.jsp</result>
          <result name="input">/login.jsp</result>

          我不知道所謂的方法是"method" 還是action 如login.action
          我前面就沒(méi)有像你前面那些聲明
          如果我除開(kāi)login.action外所有action都要被攔截器攔截 這個(gè)該怎么配置呢?
          我這樣有什么不對(duì)么
          </action>   回復(fù)  更多評(píng)論
            
          # re: 基于SSH2框架Struts2攔截器的登錄驗(yàn)證實(shí)現(xiàn) 2012-06-08 13:35 | 搬個(gè)菠蘿曬太陽(yáng)
          請(qǐng)問(wèn)怎么在ssh框架中實(shí)現(xiàn)一個(gè)簡(jiǎn)單的頁(yè)面跳轉(zhuǎn),這個(gè)需不需要攔截器?  回復(fù)  更多評(píng)論
            
          # re: 基于SSH2框架Struts2攔截器的登錄驗(yàn)證實(shí)現(xiàn) 2012-06-08 13:38 | 菠蘿大象
          @搬個(gè)菠蘿曬太陽(yáng)
          頁(yè)面跳轉(zhuǎn)要通過(guò)Action來(lái)執(zhí)行轉(zhuǎn)向,攔截器是需要實(shí)現(xiàn)某種功能才會(huì)用到的  回復(fù)  更多評(píng)論
            
          # re: 基于SSH2框架Struts2攔截器的登錄驗(yàn)證實(shí)現(xiàn) 2013-01-17 16:20 | dohkoos
          @gameover

          例如:welcome!login.action
          這里的excludeMethods里的method指的是login,而不是welcome。

          > 如果我除開(kāi)login.action外所有action都要被攔截器攔截 這個(gè)該怎么配置呢?
          如果要做到這部的話,就需要從Interceptor或AbstractInterceptor繼承,然后去除actionName做判斷。  回復(fù)  更多評(píng)論
            
          # re: 基于SSH2框架Struts2攔截器的登錄驗(yàn)證實(shí)現(xiàn) 2013-04-22 15:22 | thankyou
          thankyou  回復(fù)  更多評(píng)論
            
          # re: 基于SSH2框架Struts2攔截器的登錄驗(yàn)證實(shí)現(xiàn) 2016-07-17 15:20 | zombie

          <2010年8月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          隨筆分類(lèi)(67)

          隨筆檔案(67)

          搜索

          •  

          積分與排名

          • 積分 - 782021
          • 排名 - 55

          最新隨筆

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 宁河县| 德清县| 孝义市| 江华| 成安县| 重庆市| 张北县| 辽阳市| 息烽县| 房产| 横山县| 临潭县| 仁怀市| 沙坪坝区| 呈贡县| 汨罗市| 阳新县| 长海县| 宿州市| 辽中县| 山阳县| 双牌县| 长丰县| 华阴市| 怀远县| 荥经县| 通化县| 桑植县| 铜川市| 铁岭市| 周宁县| 田东县| 阜康市| 根河市| 嘉善县| 新沂市| 武夷山市| 古田县| 镇江市| 白城市| 石景山区|