在Struts中基於Spring的AOP MethodInterceptor(攔截器)的權限驗證


aop應用.說實話,aop在spring應該算是個難點,它主是起到了"代理"的作 用,aop會爲你調用的方法的對象生成代理,這個代理是繼承調用 MethodInterceptor這個攔截器的對象的,所以,具備原有對象的所有方法與特性.AOP不神祕,它就是EJB的進化,只是EJB需要顯式的實現接 口,而AOP不用,它會自動幫你生成代理,來做很多事情,AOP,我覺得它在處理事務 的時候用的比較多所謂聲明式的事務就是由此而來.
   系統管理員進行後臺管理或考生前臺進行考試時,提交的請求都交給系統的控制器處理.例如在struts- config.xml文件中並未配置Action的實現類,僅僅配置了每個Action的url以及對應的局部forward映射.
   有的Action都交給Spring容器進行管理,用戶請求發送到ActionServlet 後,ActionServlet將請求轉發到Spring容器裏的控制器.Spring的AOP 魔法發生在這個地方,當ActionServlet將請求發送到控制器時,並不是轉給程序員實現的控制器,而是轉給了控制器代理 -------------控制器代理會先執行權限檢查,如果用戶已經登錄,回調程序員實現的控制器,否則直接進入登錄頁面.
    部分源代碼如下

public class AuthorityInterceptor implements MethodInterceptor
{
    public Object invoke(MethodInvocation invocation) throws Throwable
 {
        HttpServletRequest request = null;
        ActionMapping mapping = null;
        Object[] args = invocation.getArguments();
        for (int i = 0 ; i < args.length ; i++ )
        {
            if (args[i] instanceof HttpServletRequest) request = (HttpServletRequest)args[i];
            if (args[i] instanceof ActionMapping) mapping = (ActionMapping)args[i];
        }
  Object admin = request.getSession().getAttribute("admin");
        if ( admin != null && ((String)admin).equals("admin"))
        {
            return invocation.proceed();
        }
        else
        {
     request.setAttribute("msg" , "您還沒有登錄,請先登錄");
            return mapping.findForward("admin");
        }
    }
}


 

     該應用是在*.xml中來調用的..(用struts的mvc,然後託管給spring的ioc容器來管理的,配置也是由spring來處理的)

 

<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
     <property name="beanNames">
            <list>
                <value>/processAddStudent</value>
                <value>/listStudent</value>
                <value>/delStudent</value>
                <value>/processAddTest</value>
                <value>/addQuestion</value>
                <value>/delQuestion</value>    
                <value>/processAddQuestion</value>
            </list>
     </property>
        <property name="interceptorNames">
            <list>
                <value>authorityInterceptor</value>
            </list>
        </property>
    </bean>

 <bean id="authorityInterceptor" class="org.yeeku.action.authority.AuthorityInterceptor"/>



 

 

//解釋後的代碼

 

 

public class AuthorityInterceptor implements MethodInterceptor
{
    public Object invoke(MethodInvocation invocation) throws Throwable
 {
        HttpServletRequest request = null;
        ActionMapping mapping = null;
 -----------註解1開始
       通過invocation.getArguments()可以獲取代理對象的參數
        代理的參數是ActionMapping, ActionForm ,HttpServletRequest , HttpServletResponse 四個
        只不過,這裏根據實際情況,我們只需要使用HttpServletRequest,ActionMapping罷了
        因爲這裏你要通過request獲取session和通過mapping跳轉頁面
        因爲 Object[] args = invocation.getArguments(); 規定,返回的必須是一個數組
        所以,沒辦法,只能迭代把要用的找出來
       而我們在XML配置的對象都是Struts Action
      每一個Struts Action方法都形如這樣,
       public ActionForward addBlog(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response)
    所以,通過
      for (int i = 0 ; i < args.length ; i++ )
        {
            if (args[i] instanceof HttpServletRequest) request = (HttpServletRequest)args [i];
            if (args[i] instanceof ActionMapping) mapping = (ActionMapping)args[i];
        }

      可以從那裏迭代出來
     你既然都有調用 Struts 了, mapping, form, request, response 肯定都已經注入了,咱們運行Struts, 是在 mapping, form, request,

     response 都具備的情況下,使用的
    所以, Object[] args = invocation.getArguments();
   得到應該對象的所有參數是完全可以的
   --------註解1結束

 

        Object[] args = invocation.getArguments();


       ---------加這兩句是因爲要通過request獲取session 並且在判斷沒有權限的時候要通過mapping跳轉頁面

        for (int i = 0 ; i < args.length ; i++ )
        {
            if (args[i] instanceof HttpServletRequest) request = (HttpServletRequest)args[i];
            if (args[i] instanceof ActionMapping) mapping = (ActionMapping)args[i];
        }
  Object admin = request.getSession().getAttribute("admin");
 ----------
              如果權限有問題,
              那麼invocation.procceed() 就不會執行,意味着你的那個 Action 對象**方法也不會執行, 但此時
              mapping 是存在的, 來一下findForward("admin");
        ----------
        if ( admin != null && ((String)admin).equals("admin"))
        {
            return invocation.proceed();
        }
        else
        {
     request.setAttribute("msg" , "您還沒有登錄,請先登錄");
            return mapping.findForward("admin");
        }
    }
}


發佈了15 篇原創文章 · 獲贊 20 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章