前段時間作了一個簡單的系統,其中涉及到后臺管理,當然也就遇到了權限驗證的問題,由于初次做J2EE項目,所有這些東西懂我來說都是個開始。
對于權限驗證,如果程序由目錄劃分,如管理員訪問的頁面都放在admin下,這樣我們可以寫一個權限驗證的過濾器,然后配置admin目錄都要經過這個過濾器即可。這樣對于jsp頁面的權限驗證比較容易。但對于action(控制器類)就不好控制了,因為action是沒有目錄概念的,如我們訪問action的地址為:
http://xxx/sample/ac1.action,同時如果使用
http://xxx/sample/xx/xx/ac1.action同樣可以訪問,這是因為只要在這個項目目錄下,訪問的頁面如果為action則struts就會去查詢這個action名字對應的類,而不管前面的目錄結構。因此我們不能再用過濾器對管理員部分的action進行驗證。經過查看struts2的相關資料發現了攔截器這個有用的東西。通過struts2的配置文件的包管理功能和攔截器可以輕松的對指定的action做管理(攔截),如
===================================================
<package name="user" extends="struts-default">
??<!-- 前臺用戶操作部分 -->
??<!-- 框架頁,顯示分類 -->
??<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>
??<!-- 默認執行的攔截器 -->
??<default-interceptor-ref name="authStack"/>
??<!-- 全局Action映射 -->
??<global-results>
???<result name="login" type="redirect">/managerLoginUI.action</result>
??</global-results>
??
??<!-- 后臺管理首頁面UI -->
??<action name="managerIndexUI"
???class="com.topsoft.bookmanage.web.action.ManagerIndexActionUI">
???<result>/admin/index.jsp</result>
??</action>
?。。。。。。
</package>
=================================================
通過使用攔截器+過濾器可以完美解決權限驗證的問題。