Struts2下的用戶(hù)權(quán)限驗(yàn)證問(wèn)題解決方法
Posted on 2007-06-06 15:17 Yemoo'S Java Blog 閱讀(4982) 評(píng)論(6) 編輯 收藏 所屬分類(lèi): Struts相關(guān)技術(shù)前段時(shí)間作了一個(gè)簡(jiǎn)單的系統(tǒng),其中涉及到后臺(tái)管理,當(dāng)然也就遇到了權(quán)限驗(yàn)證的問(wèn)題,由于初次做J2EE項(xiàng)目,所有這些東西懂我來(lái)說(shuō)都是個(gè)開(kāi)始。
對(duì)于權(quán)限驗(yàn)證,如果程序由目錄劃分,如管理員訪(fǎng)問(wèn)的頁(yè)面都放在admin下,這樣我們可以寫(xiě)一個(gè)權(quán)限驗(yàn)證的過(guò)濾器,然后配置admin目錄都要經(jīng)過(guò)這個(gè)過(guò)濾器即可。這樣對(duì)于jsp頁(yè)面的權(quán)限驗(yàn)證比較容易。但對(duì)于action(控制器類(lèi))就不好控制了,因?yàn)閍ction是沒(méi)有目錄概念的,如我們?cè)L問(wèn)action的地址為:http://xxx/sample/ac1.action,同時(shí)如果使用http://xxx/sample/xx/xx/ac1.action同樣可以訪(fǎng)問(wèn),這是因?yàn)橹灰谶@個(gè)項(xiàng)目目錄下,訪(fǎng)問(wèn)的頁(yè)面如果為action則struts就會(huì)去查詢(xún)這個(gè)action名字對(duì)應(yīng)的類(lèi),而不管前面的目錄結(jié)構(gòu)。因此我們不能再用過(guò)濾器對(duì)管理員部分的action進(jìn)行驗(yàn)證。經(jīng)過(guò)查看struts2的相關(guān)資料發(fā)現(xiàn)了攔截器這個(gè)有用的東西。通過(guò)struts2的配置文件的包管理功能和攔截器可以輕松的對(duì)指定的action做管理(攔截),如
===================================================
<package name="user" extends="struts-default">
??<!-- 前臺(tái)用戶(hù)操作部分 -->
??<!-- 框架頁(yè),顯示分類(lèi) -->
??<action name="queryCateForwardUI"
???class="com.topsoft.bookmanage.web.action.QueryCateForwardActionUI">
???<result>/mainPage.jsp</result>
??</action>
??? 。。。。。
</package>
<!-- 管理員操作部分 -->
?<package name="manager" extends="struts-default">
??<!-- 攔截器 -->
??<interceptors>
???<interceptor name="auth" class="com.topsoft.common.LogonInterceptor" />
???<interceptor-stack name="authStack">?
??????????????? <interceptor-ref name="auth"/>?
??????????????? <interceptor-ref name="paramsPrepareParamsStack"/>?
??????????? </interceptor-stack>?
??</interceptors>
??<!-- 默認(rèn)執(zhí)行的攔截器 -->
??<default-interceptor-ref name="authStack"/>
??<!-- 全局Action映射 -->
??<global-results>
???<result name="login" type="redirect">/managerLoginUI.action</result>
??</global-results>
??
??<!-- 后臺(tái)管理首頁(yè)面UI -->
??<action name="managerIndexUI"
???class="com.topsoft.bookmanage.web.action.ManagerIndexActionUI">
???<result>/admin/index.jsp</result>
??</action>
?。。。。。。
</package>
=================================================
通過(guò)使用攔截器+過(guò)濾器可以完美解決權(quán)限驗(yàn)證的問(wèn)題。
對(duì)于權(quán)限驗(yàn)證,如果程序由目錄劃分,如管理員訪(fǎng)問(wèn)的頁(yè)面都放在admin下,這樣我們可以寫(xiě)一個(gè)權(quán)限驗(yàn)證的過(guò)濾器,然后配置admin目錄都要經(jīng)過(guò)這個(gè)過(guò)濾器即可。這樣對(duì)于jsp頁(yè)面的權(quán)限驗(yàn)證比較容易。但對(duì)于action(控制器類(lèi))就不好控制了,因?yàn)閍ction是沒(méi)有目錄概念的,如我們?cè)L問(wèn)action的地址為:http://xxx/sample/ac1.action,同時(shí)如果使用http://xxx/sample/xx/xx/ac1.action同樣可以訪(fǎng)問(wèn),這是因?yàn)橹灰谶@個(gè)項(xiàng)目目錄下,訪(fǎng)問(wèn)的頁(yè)面如果為action則struts就會(huì)去查詢(xún)這個(gè)action名字對(duì)應(yīng)的類(lèi),而不管前面的目錄結(jié)構(gòu)。因此我們不能再用過(guò)濾器對(duì)管理員部分的action進(jìn)行驗(yàn)證。經(jīng)過(guò)查看struts2的相關(guān)資料發(fā)現(xiàn)了攔截器這個(gè)有用的東西。通過(guò)struts2的配置文件的包管理功能和攔截器可以輕松的對(duì)指定的action做管理(攔截),如
===================================================
<package name="user" extends="struts-default">
??<!-- 前臺(tái)用戶(hù)操作部分 -->
??<!-- 框架頁(yè),顯示分類(lèi) -->
??<action name="queryCateForwardUI"
???class="com.topsoft.bookmanage.web.action.QueryCateForwardActionUI">
???<result>/mainPage.jsp</result>
??</action>
??? 。。。。。
</package>
<!-- 管理員操作部分 -->
?<package name="manager" extends="struts-default">
??<!-- 攔截器 -->
??<interceptors>
???<interceptor name="auth" class="com.topsoft.common.LogonInterceptor" />
???<interceptor-stack name="authStack">?
??????????????? <interceptor-ref name="auth"/>?
??????????????? <interceptor-ref name="paramsPrepareParamsStack"/>?
??????????? </interceptor-stack>?
??</interceptors>
??<!-- 默認(rèn)執(zhí)行的攔截器 -->
??<default-interceptor-ref name="authStack"/>
??<!-- 全局Action映射 -->
??<global-results>
???<result name="login" type="redirect">/managerLoginUI.action</result>
??</global-results>
??
??<!-- 后臺(tái)管理首頁(yè)面UI -->
??<action name="managerIndexUI"
???class="com.topsoft.bookmanage.web.action.ManagerIndexActionUI">
???<result>/admin/index.jsp</result>
??</action>
?。。。。。。
</package>
=================================================
通過(guò)使用攔截器+過(guò)濾器可以完美解決權(quán)限驗(yàn)證的問(wèn)題。