我正在研究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_

最佳答案

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

Enabling CORS

W3C CORS Specification

基本上,服务器需要执行以下操作:

  • 支持浏览器针对跨域请求发送的HTTP OPTIONS请求(又名CORS飞行前请求)。这包括通过以下方式响应OPTIONS请求:
  • Access-Control-Allow-Origin header (例如:“*”表示允许所有来源)
  • 访问控制请求方法 header (例如:“GET,POST,PUT,DELETE,OPTIONS”)
  • 访问控制允许标题(例如:“X-Requested-With,Origin,Content-Type,Accept”)

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

    关于activemq - 通过ActiveMQ-Apollo在sock.js上使用stomp.js似乎不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18217327/

    10-13 03:29