最近要做一个东西,拦截flex请求,然后获得请求信息以及详细内容,包括基本的http header和afm协议的具体内容。相关链接如下:

flex和java的通信使用的是BlazeDS,关于BlazeDS的更多内容请查看官网

http://opensource.adobe.com/wiki/display/blazeds/BlazeDS

BlazeDS的通信协议使用的是AMF,关于AMF的详细信息,请参考

http://blog.csdn.net/loaferwang/article/details/4046503以及官方文档

关于flex的开发环境我使用的是这篇文章的方式

http://www.ibm.com/developerworks/cn/java/j-lo-jeeflex/?ca=drs-tp4608

首先简单说下flex和java之间的通信流程

java通过BlazeDS对外暴露服务,flex端通过特定的配置请求到BlazeDS服务地址,之后通过AMF协议传输数据,包含服务调用和数据传输,具体的数据类型从as到java我就不多赘述了。如下图所示:

![flex-java通信示意图]
Image Title

通过在web.xml中配置特定的servlet以及目录下的相关配置,java端完成了服务的响应和请求

通过endpoint的特定地址,flex端可以与java端的服务进行通信

通信协议为AMF

 而我现在要做的就是在MessageBrokerServlet接收到flex端的请求之后,拦截到,之后获得我想要的信息,然后这个请求继续执行,不影响原本的流程。既然java端服务都是通过MessageBrokerServlet这个Servlet接收转发的,那么我们就看下在web.xml 中MessageBrokerServlet是如何配置的,如下:
<servlet>
   <servlet-name>MessageBrokerServlet</servlet-name>
   <servlet-class>flex.messaging.MessageBrokerServlet</servlet-class>
   <init-param>
     <param-name>services.configuration.file</param-name>
     <param-value>/WEB-INF/flex/services-config.xml</param-value>
   </init-param>
   <load-on-startup>1</load-on-startup>
 </servlet>
 ```

很明显在<init-param> 中,MessageBrokerServlet加载了/flex/services-config.xml这个文件,观察service-config.xml发现,这个文件又加载了其他三个文件,如下
```xml
<servlet>
   <servlet-name>MessageBrokerServlet</servlet-name>
   <servlet-class>flex.messaging.MessageBrokerServlet</servlet-class>
   <init-param>
     <param-name>services.configuration.file</param-name>
     <param-value>/WEB-INF/flex/services-config.xml</param-value>
   </init-param>
   <load-on-startup>1</load-on-startup>
 </servlet>
 ```
整个流程就清晰了。

services-config.xml:引入了其他三个配置文件,其本身做的工作为定义对外服务的一些信息,其中包括容器类型,协议类型,服务地址,日志信息,以及创建服务的工厂等。

remoting-config.xml:是一个比较重要的地方,指明了请求处理数据java对象的桥接器JavaAdapter。以及具体的服务名称和对外提供的调用方法。基本上所有的对外接口全部在这里定义,下面是一个服务的定义
```xml
<destination id="flexService">
    <properties>
        <factory>flexFactory</factory>
        <source>flexService</source>
        <scope>application</scope>
    </properties>
</destination>

其中destination id定义的是对外的服务名称,factory指定了这个服务的初始化工厂,这个是我自己定义的,是使用spring进行的初始化,下面的source和scope分别指定了服务源和范围

proxy-config.xml:指定了远程请求的桥接方式,通常为flex.messaging.services.http.HTTPProxyAdapter。还设定了请求的限制max-total-connections等信息

messaging-config.xml :指定了actionscript对象的桥接器,使用flex.messaging.services.messaging.adapters.ActionScriptAdapter。

在remoting,proxy,messaging这三个文件中,都有一段配置:

<default-channels>
       <channel ref="my-amf"/>
</default-channels>

这段配置指定了通信的协议。其中my-amf是定义在services-config.xml中的,如下:

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

相关的配置就是这些,篇幅太长,下一篇介绍在MessageBrokerServlet中,如何应用这些配置,以及服务的响应,数据的传输,AMF协议的解析。

ps.文中的很多观点都是我个人理解,如有不对,希望指出。谢谢。

Comments
Write a Comment