天天看點

Struts2 利用攔截器 interceptor 控制登陸和通路權限

最近學習了Struts2的登入和權限控制用到的是攔截器,需要在struts.xml中配置,每個action都預設的繼承defaultStack,如果你用了别的攔截器,還需要手動引入defaultStack。因為登入和通路權限攔截是全局的,攔截傳回的結果有些也是全局的,是以我定義了自己的package以便引用。我是這樣寫的:

==================================================================================================

< package name="struts-my" extends="struts-default">

      < interceptors>

       < !--判斷是否登入 和 是否有通路權限  -->

       < interceptor name="auth" class="athenticationInterceptor" />     

       < interceptor-stack name="myStack">

            < interceptor-ref name="auth">< /interceptor-ref>

            < interceptor-ref name="defaultStack">< /interceptor-ref>         

        < /interceptor-stack>         

      < /interceptors>

      < default-interceptor-ref name="myStack">< /default-interceptor-ref>     

      < !--  全局結果 -->

      < global-results>

       < !-- 攔截沒登入傳回結果 -->

            < result name="noLogin" type="redirect">/jsp/no_login.jsp< /result>

            < !-- 攔截沒有權限傳回結果 -->

            < result name="noPower" type="redirect">/jsp/no_power.jsp< /result>

      < /global-results> 

     < /package>

 < package name="default" extends="struts-my">

         < !--登入登出不需要攔截 讓它們已入 defaultStack-->

      < action name="login" class="loginAction" method="login">

       < result name="input">/jsp/login.jsp< /result>

       < result name="success" type="redirect">/jsp/index.jsp< /result>

       < interceptor-ref name="defaultStack">< /interceptor-ref>

      < /action>

      < action name="logout" class="loginAction" method="logout">

       < result name="success">/jsp/login.jsp< /result>

       < interceptor-ref name="defaultStack">< /interceptor-ref>

      < /action>

。。。。。。。。。

==================================================================================================

    需要說明的是,登入和登出是不需要攔截的(或者其它不需要攔截的),我們讓它們的攔截器繼承defaultStack。局部權限高于全局定義的,它們的攔截器棧就是預設的,不是自定義的。

    還有一點要說明的是我,我攔截器的名字auth引用的類是在Spring裡面配置的一個bean,我用的是SSH,在類裡面我用到了一些資料庫的東西,我需要在Spring裡注入。如果不需要可以直接寫用到的類(要寫路徑)。

    在登陸成功後,我把“user”放到了session中,我還有一張權限表,裡面存的是權限組id和通路的權限。使用者表裡存放權限組id,這樣就可以知道使用者有什麼權限了。我實作攔截的類是這樣寫的。

==================================================================================================

public class AuthenticationInterceptor extends AbstractInterceptor {

//這個是需要用到的自定義的方法。

private GroupPowerService groupPowerService;

public String intercept(ActionInvocation invocation) throws Exception {

  Map map= invocation.getInvocationContext().getSession();

        if (map.get("user")==null)

        {

            return  "noLogin";

        }

        else

        {

         //得到使用者的權限id 和 通路的類名

         int id = ((User)map.get("user")).getGroupId();

         //攔截的action的名字

         String action = invocation.getInvocationContext().getName();

         //通過使用者id 和攔截的action名判斷使用者是否有這個權限         

         if(this.groupPowerService.hasPower(id,action))

          //繼續執行 不攔截

          return invocation.invoke();

         return "noPower";

        }

 }

public GroupPowerService getGroupPowerService() {

  return groupPowerService;

 }

==================================================================================================

還有兩個jsp頁面和一個在Spring的配置檔案裡的一句話(這裡攔截器和action一樣,用到什麼sevice用注入什麼)就沒什麼可說的了。

form: http://blog.sina.com.cn/s/blog_7d0c4ede0100tfdv.html

關注公衆号,分享幹貨,讨論技術

Struts2 利用攔截器 interceptor 控制登陸和通路權限

繼續閱讀