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