大象在這里假設(shè)你已經(jīng)弄清楚了Struts2攔截器的基本概念,可以進入實際運用了。那么我們在之前的基礎(chǔ)上只需要做下小小的改變,就可以使用Struts2的攔截器機制實現(xiàn)登錄的驗證。
修改數(shù)據(jù)庫
在user表中增加password字段,將初始密碼都設(shè)為123,因為是示例所以采用明碼,實際開發(fā)中,當然不能這樣做,需要進行加密處理。再將name改為username,其實name字段可以不用改名,我這樣做是為了命名規(guī)范,請注意,如果字段改為username,User類中的對應(yīng)屬性也要進行相應(yīng)變化(如果你加注釋寫法可以不用改),還有Test與TestHibernateDao中的getName()都要改為getUsername()。
修改index.jsp
將hello.action改為login!welcome.action
增加登錄類
在web包下創(chuàng)建LoginAction類,在其中添加welcome與login方法,前者為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è)置。
增加攔截器配置
做好這一步之后,那么登錄驗證攔截器將會對除了welcome與login之外的所有方法進行攔截了。另外我想說下,攔截器的實現(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文件中去找name為login全局轉(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)可以登錄登出了,并且攔截器也可以正常工作,超時登出也沒問題,大家下載例子運行看看吧!
posted on 2010-08-28 14:14
菠蘿大象 閱讀(29452)
評論(12) 編輯 收藏 所屬分類:
Struts2