像一顆晨土

          常用鏈接

          統計

          blogs

          life

          最新評論

          Spring AOP 在DWR安全上的應用

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

               實現攔截功能的類有:

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

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

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

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

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

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

          在before(Method method, Object[] params, Object target)方法里:

                  WebContext ctx = WebContextFactory.get();//唯一被DWR污染的地方
                  HttpSession session = ctx.getSession();
                  AopContext context = new AopContext();        context.setSession(session);
                  for(Iterator it = interceptors.iterator(); it.hasNext();){
                      IInterceptor interceptor = (IInterceptor) it.next();
                      interceptor.execute(context);
                  }

           IInterceptor:

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

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

          下面來看看配置文件:

           <beans>

              <!--將要暴露給DWR的Service-->
               <bean id="bookManager" class="org.springframework.aop.framework.ProxyFactoryBean">
              <property name="proxyInterfaces">
                <value>net.jf.ajax.business.BookManager</value>
              </property>
              <property name="target">
                <ref local="bookManagerImpl"/>
              </property>
              <property name="interceptorNames">
                <list>
                  <value>dwrAdvisor</value>
                </list>
              </property>
            </bean>

            <bean id="bookManagerImpl" class="net.jf.ajax.business.impl.BookManagerImpl"/>
          <!--裝配器?如果看不懂,先看看Spring的Aop吧 :P-->
            <bean id="dwrAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
              <property name="advice">
                <ref local="dwrInterceptor"/>
              </property>
              <property name="patterns">
                  <list>
                      <value>.*.*</value>
                    </list>
              </property>
            </bean>


          <!--主攔截器,給它設置子攔截器-->
            <bean id="dwrInterceptor" class="net.jf.ajax.iterceptor.MainInterceptor">
                <property name="interceptors">
                    <list>
                        <ref bean="test"/>
                    </list>
                </property>
            </bean>
            <!--其中一個子攔截器的實現-->
            <bean id="test" class="net.jf.ajax.iterceptor.TestInterceptor"/>
          </beans>

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

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

          posted on 2006-05-24 00:26 艾塵 閱讀(2263) 評論(0)  編輯  收藏 所屬分類: ajax


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 怀来县| 灵川县| 阜新| 三门县| 景德镇市| 新河县| 通河县| 肥乡县| 龙陵县| 莆田市| 资中县| 萝北县| 华宁县| 施秉县| 金平| 蒲城县| 贺州市| 日喀则市| 五原县| 若羌县| 岳普湖县| 乡宁县| 新闻| 宜兰县| 波密县| 明溪县| 苗栗县| 桓台县| 阿克苏市| 化州市| 中阳县| 田阳县| 澜沧| 柳州市| 微山县| 和静县| 客服| 文水县| 兰坪| 乌兰县| 鞍山市|