3

我正在研究 ActiveMQ-Apollo 安装中的一些示例,并使用示例/websocket。

在这个文件中,Stomp.js 被用来建立连接:

client = Stomp.client(url);

该示例运行良好,我能够看到正在发送和接收的消息。问题是 Stomp 使用默认的 WebSocket,有时可能不可用。所以,我想与 SockJS 客户端库集成。根据此页面上的 StompJS 示例(http://jmesnil.net/stomp-websocket/doc/),应该可以使用以下代码:

<script src="http://cdn.sockjs.org/sockjs-0.3.min.js"></script>
<script>
  // use SockJS implementation instead of the browser's native implementation
  var ws = new SockJS(url);
  var client = Stomp.over(ws);
  [...]
</script>

上面的代码似乎可以正确执行,但是,后来我看到以下错误:

XMLHttpRequest cannot load ws://mylocaldomain.com:61623/info. Cross origin requests are only supported for HTTP. sockjs-0.3.js:807
Uncaught Error: NetworkError: DOM Exception 19 

然后,我看到调试窗口显示此消息:

Opening Web Socket...
Whoops! Lost connection to undefined

我从 mylocaldomain.com:80 提供页面,ActiveMQ Apollo 服务器在同一台机器上运行,但监听端口 61623。我还获取了最新版本的 StompJS(来自 github 上的 dist 目录)以及 SockJS直接来自 cdn.sockjs.org。

我在最新的 Chrome 和 Firefox(在 OSX 上)上尝试了这个例子,同样的事情发生了。没有建立连接。

再次,回到 Apollo 附带的标准示例,它工作正常,但我想找出为什么 StompJS 而不是 StockJS 失败。

有没有人看到这个问题?

谢谢。-AP_

4

1 回答 1

1

您需要修改 ActiveMQ-Apollo Web 配置以支持跨域资源共享 (CORS),如下所述:

启用 CORS

W3C CORS 规范

基本上服务器需要做以下事情:

  • 支持浏览器为跨域请求发送的 HTTP OPTIONS 请求(又名 CORS 飞行前请求)。这包括响应 OPTIONS 请求:
    • Access-Control-Allow-Origin 标头(例如:“*”表示允许所有来源)
    • Access-Control-Request-Method 标头(例如:“GET、POST、PUT、DELETE、OPTIONS”)
    • Access-Control-Allow-Headers(例如:“X-Requested-With,Origin,Content-Type, Accept”)

HTTP OPTIONS 的处理通常可以使用单个 Web 过滤器匹配过滤器模式“/*”来完成。另请参阅ActiveMQ Apollo 1.7支持的“cors_origin”WebSocket 连接器 URL 查询参数

于 2014-05-21T05:34:26.330 回答