熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

Spring AOP在DWR安全上的應用

2022-06-13   來源: Java開源技術 
     在上一篇文章裡提到了可以讓 DWR自動往Service裡面注入一個與Servlet相關的對象作為參數只是這樣要每個Service都加上這樣的一個參數奇丑無比!想了 想決定就讓DWR污染一下Service保留原樣只是增加一個MethodBeforeAdvice(正是它讓DWR的API污染了一下來對 Service的方法進行攔截可以在Service的調用之前對操作進行所謂的身份驗證授權之類的操作完整的攔截模塊幾個類文件加個Spring配 置文件搞定

  實現攔截功能的類有

  一MainInteceptor主攔截器所以DWR的遠程調用都會被攔截當然 調用是細到方法級的可配置的該類實現了Spring AOP的MethodBeforeAdvice接口該類有一個集合成員變量成員為IInteceptor

  二IInteceptor是一個接口僅有一個execute(AopContext context)函數該接口是攔截器(與前面的主攔截器不同本接口定義的攔截器是可以由用戶去實現並且可以有多個)實現接口只需要實現方法這些 攔截器會被主攔截器回調 比如要實現一個身份驗證的攔截SecuityInteceptor在配置文件中把這個攔截器設置為主攔截器的屬性即可獲得回調

  三AopContextAop上下文在主攔截器調用IInteceptor的對象時把這個上下文對象作為參數來調用子攔截器從該上下文可獲得一系列信息如HttpSessionHttpRequest等甚至你可以自已設置屬性 

  下面看一些代碼片斷:
MainInteceptor:

  private List<IInterceptor> interceptors;//定義一系列的子攔截器

  public void setInterceptors(List<IInterceptor> interceptors) {
        thisinterceptors = interceptors;
    }

  在before(Method method Object[] params Object target)方法裡

  WebContext ctx = WebContextFactoryget();//唯一被DWR污染的地方
        HttpSession session = ctxgetSession();
        AopContext context = new AopContext();        contextsetSession(session);
        for(Iterator it = erator(); ithasNext();){
            IInterceptor interceptor = (IInterceptor) itnext();
            interceptorexecute(context);
        }

  IInterceptor

  public interface IInterceptor {
    public void execute(AopContext context);
}

  AopContext就不必貼出來了 隨自已定義些什麼屬性不過就內置了一個Map用來保存數據罷了

  下面來看看配置文件

  <beans>

  <!將要暴露給DWR的Service>
     <bean id=bookManager class=orgspringframeworkaopframeworkProxyFactoryBean>
    <property name=proxyInterfaces>
      <value>netjfajaxbusinessBookManager</value>
    </property>
    <property name=target>
      <ref local=bookManagerImpl/>
    </property>
    <property name=interceptorNames>
      <list>
        <value>dwrAdvisor</value>
      </list>
    </property>
  </bean>

  <bean id=bookManagerImpl class=netjfajaxbusinessimplBookManagerImpl/>
<!裝配器?如果看不懂先看看Spring的Aop吧 P>
  <bean id=dwrAdvisor class=orgspringframeworkaopsupportRegexpMethodPointcutAdvisor>
    <property name=advice>
      <ref local=dwrInterceptor/>
    </property>
    <property name=patterns>
        <list>
            <value>**</value>
          </list>
    </property>
  </bean>


  <!主攔截器給它設置子攔截器>
  <bean id=dwrInterceptor class=erceptorMainInterceptor>
      <property name=interceptors>
          <list>
              <ref bean=test/>
          </list>
      </property>
  </bean>
  <!其中一個子攔截器的實現>
  <bean id=test class=erceptorTestInterceptor/>
</beans>

  就 這樣在配置DWR的配置文件時配置<creator>時使用Spring的Creator就可以直接使用上面的Service了當 DWR遠程請求時在配置范圍內的方法的調用都會被主攔截器攔截並且遍歷執行所有子攔截器原有的Service不需要改動只需要多加一個 Spring的配置文件將原有的Service再加一層Aop的輕紗

  這是一種實現方法如果有別的方法讓DWR更安全有效請一定告知


From:http://tw.wingwit.com/Article/program/Java/ky/201311/28021.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.