大象在這里假設(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ě)法可以不用改),還有Test與TestHibernateDao中的getName()都要改為getUsername()。
修改index.jsp
將hello.action改為login!welcome.action
增加登錄類(lèi)
在web包下創(chuàng)建LoginAction類(lèi),在其中添加welcome與login方法,前者為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ì)除了welcome與login之外的所有方法進(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文件中去找name為login全局轉(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)行看看吧!
posted on 2010-08-28 14:14
菠蘿大象 閱讀(29466)
評(píng)論(12) 編輯 收藏 所屬分類(lèi):
Struts2