在 sock.js 上使用 stomp.js 和 ActiveMQ-Apollo 似乎不起作用
Posted
技术标签:
【中文标题】在 sock.js 上使用 stomp.js 和 ActiveMQ-Apollo 似乎不起作用【英文标题】:Using stomp.js over sock.js with ActiveMQ-Apollo does not seem to work 【发布时间】:2013-08-15 13:19:36 【问题描述】:我正在研究 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 目录)为以及直接来自 cdn.sockjs.org 的 SockJS。
我在最新的 Chrome 和 Firefox(在 OSX 上)上尝试了这个例子,同样的事情发生了。没有建立连接。
再次,回到 Apollo 附带的标准示例,它工作正常,但我想知道为什么 StompJS 优于 StockJS 失败。
有人见过这个问题吗?
谢谢。 -AP_
【问题讨论】:
尝试了标准的 WebSocket,StompJS 似乎工作正常。所以,可能与 SockJS 库有关... ActiveMq配置文件的哪些配置需要修改??? 【参考方案1】:您需要修改 ActiveMQ-Apollo Web 配置以支持跨域资源共享 (CORS),如下所述:
Enabling CORS
W3C CORS Specification
服务器基本上需要做以下事情:
支持浏览器为跨域请求发送的 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 查询参数
【讨论】:
以上是关于在 sock.js 上使用 stomp.js 和 ActiveMQ-Apollo 似乎不起作用的主要内容,如果未能解决你的问题,请参考以下文章
STOMP 上的重复事件 Socket.io 和 Node.js
如何使用 stomp.js 在 javascript 中使用 Web 套接字消息?