最近要做一个东西,拦截flex请求,然后获得请求信息以及详细内容,包括基本的http header和afm协议的具体内容。相关链接如下:
flex和java的通信使用的是BlazeDS,关于BlazeDS的更多内容请查看官网
BlazeDS的通信协议使用的是AMF,关于AMF的详细信息,请参考
http://blog.csdn.net/loaferwang/article/details/4046503以及官方文档
关于flex的开发环境我使用的是这篇文章的方式
首先简单说下flex和java之间的通信流程
java通过BlazeDS对外暴露服务,flex端通过特定的配置请求到BlazeDS服务地址,之后通过AMF协议传输数据,包含服务调用和数据传输,具体的数据类型从as到java我就不多赘述了。如下图所示:
!
通过在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.文中的很多观点都是我个人理解,如有不对,希望指出。谢谢。