BlazeDS是一个基于消息的框架。主要运用了两种模式:请求响应模式、发布/订阅模式。
BlazeDS提供以下几种通道:
(1)标准AMF通道;AMF协议是基于Http协议的。
(2)加密AMF通道;SecureAMF协议是基于Https协议的。服务器(tomcat)需要增加SSL协议配置
(3)HTTP通道(AMFX)。
其中AMF和HTTP通道都支持无轮询的请求/响应模式和客户端轮询模式(模拟实时通信),而AMF和HTTP流通道模式提供了真正的数据流实时模式。
此文主要讨论SecureAMF协议的实现。
二、服务器Tomcat下配置https环境
加密方式分为:
1.服务器单项加密验证,参见博文:http://blog.csdn.net/supersky07/article/details/7407523
2.服务器配置https双向认证,参见博文:http://jingyan.baidu.com/article/a948d6515d3e850a2dcd2ee6.html
最终都需要修改tomcat下的server.xml配置文件,增加对https访问的支持。
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="/Users/liuwensheng/Documents/tomcat.keystore" keystorePass="1234567890"/>
<!--
clientAuth 是否支持双向验证,默认是false不支持
keystoreFile 是服务器的验证文件
keystorePass 是验证密码
-->
三、Flex客户端利用BlazeDS访问加密服务器需要的配置。
BlazeDS服务器配置需要修改服务器配置文件:remoting-config.xml和proxy-config.xml,分别增加对加密管道的支持:
<default-channels>
<channel ref="my-amf"/>
<channel ref="my-secure-amf"/>
</default-channels>
四、Flex 客户端访问代码的修改
Flex客户端代码需要做适应性修改,为了既可以在http环境下访问标准AMF通道,也可以在https环境下访问SecureAMF通道。所以需要手动设置
RemoteObject的channelSet,既根据浏览器中的访问协议类型(http、https)来动态创建AMF的通道类型。代码如下:
private function init():void
{
//支持HTTP和HTTPS
var channelSet:ChannelSet = changeAMFChannel();
//给mx.rpc.remoting.RemoteObject对象设置通道
remote.channelSet = channelSet;
}
/**
* 为了满足不同的请求协议,http和https做动态互转
**/
private function changeAMFChannel():ChannelSet
{
var surl:String = ExternalInterface.call("eval", "window.location.href");
var cs:ChannelSet = new ChannelSet();
var c:Channel = null;
if(URLUtil.getProtocol(surl) == "https")
{
c = new SecureAMFChannel();
c.uri = "/frame/messagebroker/amfsecure";
}
else
{
c = new AMFChannel();
c.uri = "/frame/messagebroker/amf";
}
cs.addChannel(c);
return cs;
}