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

          評論:
          # re: 基于SSH2框架Struts2攔截器的登錄驗證實現(xiàn) 2011-05-09 11:40 | taote
          大象好久沒有更新博客了!!!!!  回復(fù)  更多評論
            
          # re: 基于SSH2框架Struts2攔截器的登錄驗證實現(xiàn) 2011-06-03 14:04 | bryan
          水印圖案讓人看起來很不舒服,可以將字變大,少點.  回復(fù)  更多評論
            
          # re: 基于SSH2框架Struts2攔截器的登錄驗證實現(xiàn) 2011-06-03 14:16 | 菠蘿大象
          @bryan
          這已經(jīng)是很大的字號了,再大,會很丑,我試過,圖片的顯示只是幫助文章進行說明,具體的請看源代碼,另外你說看起來很不舒服?我感覺還好吧,可能是你沒習(xí)慣而已,不要太計較圖片水印,關(guān)鍵是我的東西對你有沒有用,看個開頭就知道是否要繼續(xù)看下去,如果不適合你,請立馬關(guān)掉網(wǎng)頁,不要對水印這些無關(guān)緊要的東西糾結(jié)來糾結(jié)去了,只要不影響閱讀就行,如果你實在不爽,那不看總可以吧  回復(fù)  更多評論
            
          # re: 基于SSH2框架Struts2攔截器的登錄驗證實現(xiàn) 2011-06-17 00:33 | 王德超
          很好  回復(fù)  更多評論
            
          # re: 基于SSH2框架Struts2攔截器的登錄驗證實現(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還是會被攔截呢 我把他們配置在一個struts.xml里面的。。。有個login的action。 怎么才攔截這個呢?  回復(fù)  更多評論
            
          # re: 基于SSH2框架Struts2攔截器的登錄驗證實現(xiàn) 2011-08-03 11:26 | 菠蘿大象
          @gameover
          這個excludeMethods表示不攔截welcome與login方法  回復(fù)  更多評論
            
          # re: 基于SSH2框架Struts2攔截器的登錄驗證實現(xiàn) 2011-08-03 12:56 | gameover
          @菠蘿大象
          這個意思我是明白, 我是這樣配置的


          <package name="hrms" extends="struts-default">
          <interceptors>
          <!-- 登錄驗證攔截器 -->
          <interceptor name="authority" class="com.bolo.examples.common.interceptor.AuthorityInterceptor" />
          <interceptor-stack name="boloStack">
          <!-- 將登錄驗證攔截器加入默認的攔截器棧中 -->
          <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
          我前面就沒有像你前面那些聲明
          如果我除開login.action外所有action都要被攔截器攔截 這個該怎么配置呢?
          我這樣有什么不對么
          </action>   回復(fù)  更多評論
            
          # re: 基于SSH2框架Struts2攔截器的登錄驗證實現(xiàn) 2012-06-08 13:35 | 搬個菠蘿曬太陽
          請問怎么在ssh框架中實現(xiàn)一個簡單的頁面跳轉(zhuǎn),這個需不需要攔截器?  回復(fù)  更多評論
            
          # re: 基于SSH2框架Struts2攔截器的登錄驗證實現(xiàn) 2012-06-08 13:38 | 菠蘿大象
          @搬個菠蘿曬太陽
          頁面跳轉(zhuǎn)要通過Action來執(zhí)行轉(zhuǎn)向,攔截器是需要實現(xiàn)某種功能才會用到的  回復(fù)  更多評論
            
          # re: 基于SSH2框架Struts2攔截器的登錄驗證實現(xiàn) 2013-01-17 16:20 | dohkoos
          @gameover

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

          > 如果我除開login.action外所有action都要被攔截器攔截 這個該怎么配置呢?
          如果要做到這部的話,就需要從Interceptor或AbstractInterceptor繼承,然后去除actionName做判斷。  回復(fù)  更多評論
            
          # re: 基于SSH2框架Struts2攔截器的登錄驗證實現(xiàn) 2013-04-22 15:22 | thankyou
          thankyou  回復(fù)  更多評論
            
          # re: 基于SSH2框架Struts2攔截器的登錄驗證實現(xiàn) 2016-07-17 15:20 | zombie
          感謝  回復(fù)  更多評論
            
          主站蜘蛛池模板: 兴和县| 浦城县| 平罗县| 南部县| 平利县| 攀枝花市| 盐池县| 额尔古纳市| 囊谦县| 五河县| 大关县| 渭源县| 布尔津县| 壶关县| 大埔区| 吉隆县| 遵义县| 邹城市| 孟州市| 吉首市| 江永县| 云梦县| 灌云县| 景泰县| 佛山市| 固阳县| 清新县| 乡宁县| 西昌市| 安吉县| 白朗县| 兰溪市| 自贡市| 衡南县| 城固县| 金山区| 万载县| 巴东县| 长寿区| 双峰县| 儋州市|