首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Spring BlazeDS Integration 入門:以 Spring 模型開發 Flex/Java RIA 應用

     編輯:Java 相關知識

前言

Spring BlazeDS Integration 由 Adobe 與 SpringSource 合作開發,讓開發者以 Spring 程式模型 (DI、AOP、Security) 透過 BlazeDS 將 Spring Bean 直接暴露為 Flex 遠端服務,無需額外 BlazeDS 配置檔。本文涵蓋架構優勢、伺服器端/客戶端配置、Spring Security 整合保護服務完整實戰。

架構優勢

  • 零配置暴露:在 Spring Bean 定義檔中直接宣告遠端服務,減少 remoting-config.xml 維護
  • DispatcherServlet 統一入口:取代 MessageBrokerServlet,所有 HTTP/AMF 請求經 Spring MVC 分派
  • Spring Security 無縫整合:以 Pointcut Advisor 保護 AMF 端點,支援角色基礎存取控制

伺服器端配置步驟

1. 依賴庫

下載 org.springframework.flex 相關 JAR,置於 WEB-INF/lib。

2. web.xml 註冊 DispatcherServlet

<servlet>
  <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/config/web-application-config.xml</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
  <url-pattern>/gorilla/*</url-pattern>
</servlet-mapping>

3. BlazeDS 通道配置 (services-config.xml)

<channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel">
  <endpoint url="https://{server.name}:{server.port}/{context.root}/gorilla/messagebroker/amf"
            class="flex.messaging.endpoints.AMFEndpoint"/>
</channel-definition>

4. Spring 核心配置 (web-application-config.xml)

<!-- MessageBrokerHandlerAdapter 處理 AMF 訊息 -->
<bean class="org.springframework.flex.messaging.servlet.MessageBrokerHandlerAdapter"/>

<!-- URL 映射至 Spring 管理的 MessageBroker -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
  <property name="mappings">
    <value>/*=mySpringManagedMessageBroker</value>
  </property>
</bean>

<bean id="mySpringManagedMessageBroker"
      class="org.springframework.flex.messaging.MessageBrokerFactoryBean"/>

<!-- 業務 Bean -->
<bean id="sodaBean" class="com.gorillalogic.sodaBank.SodaService" init-method="initSodaAccounts">
  <property name="numAccounts" value="1000"/>
</bean>

<!-- 暴露為 Flex 遠端服務 -->
<bean id="sodaService" class="org.springframework.flex.messaging.remoting.FlexRemotingServiceExporter">
  <property name="messageBroker" ref="mySpringManagedMessageBroker"/>
  <property name="service" ref="sodaBean"/>
</bean>

客戶端配置

<mx:RemoteObject id="remoteObject"
    destination="sodaService"
    result="resultHandler(event);"
    fault="faultHandler(event);"
    channelSet="{sodaChannels}"/>

<mx:ChannelSet id="sodaChannels">
  <mx:AMFChannel uri="/gorilla/messagebroker/amf"/>
</mx:ChannelSet>

呼叫方式:remoteObject.getSodaModel(); 非同步回調處理 ResultEvent。

Spring Security 整合保護服務

1. 定義安全上下文

<authentication-provider>
  <user-service>
    <user name="ryan" password="monkey" authorities="ROLE_USER, ROLE_ADMIN"/>
    <user name="alex" password="chimp" authorities="ROLE_USER"/>
  </user-service>
</authentication-provider>

2. 配置 MessageBroker 安全處理器

<bean id="loginCommand"
      class="org.springframework.flex.messaging.security.SpringSecurityLoginCommand">
  <constructor-arg ref="_authenticationManager"/>
</bean>

<bean id="endpointSource"
      class="org.springframework.flex.messaging.security.EndpointDefinitionSource">
  <constructor-arg><bean class="org.springframework.security.util.AntUrlPathMatcher"/></constructor-arg>
  <constructor-arg>
    <map>
      <entry>
        <key><bean class="org.springframework.security.intercept.web.RequestKey">
          <constructor-arg value="**/protected/messagebroker/**"/></bean></key>
        <ref bean="configAttribute"/>
      </entry>
      <entry>
        <key><value>my-protected-by-id-amf</value></key>
        <ref bean="configAttribute"/>
      </entry>
    </map>
  </constructor-arg>
</bean>

<bean id="endpointInterceptor"
      class="org.springframework.flex.messaging.security.EndpointServiceMessagePointcutAdvisor">
  <constructor-arg>
    <bean class="org.springframework.flex.messaging.security.EndpointInterceptor">
      <property name="accessDecisionManager" ref="_accessManager"/>
      <property name="authenticationManager" ref="_authenticationManager"/>
      <property name="objectDefinitionSource" ref="endpointSource"/>
    </bean>
  </constructor-arg>
</bean>

3. 套用至 MessageBroker

<bean id="mySpringManagedMessageBroker"
      class="org.springframework.flex.messaging.MessageBrokerFactoryBean">
  <property name="configProcessors">
    <set>
      <ref bean="loginCommand"/>
      <ref bean="securityConfigProcessor"/>
    </set>
  </property>
</bean>

4. 服務綁定安全通道

<bean id="sodaService" class="org.springframework.flex.messaging.remoting.FlexRemotingServiceExporter">
  <property name="messageBroker" ref="mySpringManagedMessageBroker"/>
  <property name="service" ref="sodaBean"/>
  <property name="channelIds" value="my-protected-amf,my-protected-by-id-amf"/>
</bean>

5. 客戶端登入

var token:AsyncToken = sodaChannels.login(username.text, password.text);
token.addResponder(new AsyncResponder(
  function(result:ResultEvent, token:Object):void { remoteObject.getSodaModel(numAccounts.text); },
  function(fault:FaultEvent, token:Object):void { ta.text += "Received fault: " + fault.fault + "\n"; }
));

未來規劃

  • 深化 Spring Security 整合 (方法級安全、ACL)
  • JMS 整合支援訊息驅動架構
  • 自定義命名空間簡化配置 (如 <flex:remoting-destination>)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved