我正在为cometd服务器编写jquery客户端(我正在使用jquery.cometd.js插件)并且我已经没有想法为什么最简单的情况不起作用。
cometd服务器支持apache(所以它在同一个域上运行)和所有 请求从uri http://wwwhost/cometd转发。
问题在于,当我尝试连接(通过执行handshake())到cometd时,它不发送请求 直接到/ cometd但是/ cometd / handshake会给出404错误。 我检查了我正在测试的其他应用程序,dojo总是连接到/ cometd然后发送消息'握手'。
任何人都知道为什么jquery.cometd会这样做?
这是我在apache日志中可以看到的:
- - [23/Mar/2010:17:59:30 +0100] "POST /cometd/handshake HTTP/1.1" 404 158 "http://wwwhost/" "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.8) Gecko/20100308 Iceweasel/3.5.8 (like Firefox/3.5.8)"
下面你可以找到我正在使用的代码(它或多或少是我从示例中得到的)。
(function($)
{
var COMETD_URL = "http://wwwhost/cometd";
var cometd = $.cometd;
$(document).ready(function() {
cometd.configure({
url: COMETD_URL,
logLevel: 'debug'
});
cometd.handshake();
});
})(jQuery);
和firebug调试:
Initial transport is Object {}
cometd.js (line 278)
Status disconnected -> handshaking
cometd.js (line 278)
Handshake sent Object { version="1.0", more...}
cometd.js (line 278)
Send Object { url="http://wwwhost/cometd/handshake", more...}
cometd.js (line 278)
POST http://wwwhost/cometd/handshake
POST http://wwwhost/cometd/handshake
404 Not Found 104ms
修改
看起来我的服务器实现不支持cometd之外的URI。 Jquery最后添加了消息的类型,因此在发送握手时它会将其发送到: / cometd / handshake一般看起来像/ cometd / message_type。
我找到了在cometd.js代码中发送消息的函数,该函数有三个参数:
function _send(messages, longpoll, extraPath)
并且例如调用此函数:
_send([message], true, 'connect');
这意味着我总是以/ cometd / handshake结束。 我必须修复服务器或注释掉cometd.js中的追加网址。
答案 0 :(得分:1)
我遇到了同样的事情。它在maven下运行时起作用,但不是直接在码头上运行。
我在我的码头添加了一个名为contexts / cometd.xml的文件。这似乎是多余的,但它对我有用。
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">
<configure class="org.eclipse.jetty.webapp.WebAppContext">
<Set name="contextPath">/</Set>
<Set name="resourceBase"><SystemProperty name="jetty.home" default="."/>/webapps/server</Set>
</configure>
答案 1 :(得分:0)
尝试将appendMessageTypeToURL
设为false
cometd.configure({
url: COMETD_URL,
logLevel: 'debug',
`appendMessageTypeToURL`: false
});
但正如文档所述,握手失败可能还有另一个原因
几次握手可能会失败 原因:
- 您错误输入了服务器网址
- 长轮询传输无法成功协商
- 服务器拒绝握手(例如,身份验证 凭证错了)
- 服务器崩溃
- 网络出现故障