我搜索过 jquery 论坛、stackoverflow、google、bing,甚至 yahoo,但都没有成功。 每 10 秒我都会尝试通过以下 JQuery 片段从 logservlet servlet 加载文本数据:
<script type="text/javascript" src="http://code.jquery.com/jquery-1.7.2.min.js"></script>
<script type="text/javascript">
var autorefresh = setInterval(function () {
$.ajax({
url : "logservlet?devkey=chat",
success : function(data) {
$("#log_ta").append(data);
}
});
}, 10000);
</script>
问题是,在服务器端我没有看到有效的 session ,我尝试跟踪 session 属性。该问题似乎与 JQuery 的 http 请求 header 中缺少“Cookie JSESSIONID=xxxxxxxxxxxxxxxxxxxxxxxxxxx”有关。我从服务器获取响应 header ,JSESSIONID 始终随每个请求而变化:
Server Apache-Coyote/1.1
Set-Cookie JSESSIONID=9EEAFA2A933E7742D8FEDADD5345B76D; Path=/CumulusServer
Content-Length 0
Date Fri, 23 Mar 2012 13:02:08 GMT
但是 JQuery 随后不再使用它,以下是请求 header :
Host 192.168.1.11:8080
User-Agent Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0
Accept */*
Accept-Language en-us,en;q=0.5
Accept-Encoding gzip, deflate
Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection keep-alive
X-Requested-With XMLHttpRequest
Referer http://192.168.1.11:8080//CumulusServer/
这里有什么问题吗? “$.ajax”调用不感知 session 吗?或者我是否错过了一些在每个 ajax 请求中手动硬编码 JSESSIONID 的管道代码?是这样吗,这应该是什么样子?顺便说一句,当我从 Web 浏览器调用相同的 url 时,JSESSIONID header 将发送到服务器!
谢谢, D.
请您参考如下方法:
事实上,我确实运行了 Adblock Plus(感谢您的提示),但它与此无关。 其实事情有点棘手。我找到了两个解决方案,但我没有解释发生了什么。
解决方案#1: - 在页面加载时手动保存 JSESSIONID:
var Session = {
id : '${pageContext.session.id}',
user : '${pageContext.request.remoteUser}'
};
$(window).load(function () {
setCookie('JSESSIONID',Session.id);
});
function setCookie(name,value,expires,path,domain,secure) {
var cookieString = name + "=" +escape(value) +
( (expires) ? ";expires=" + expires.toGMTString() : "") +
( (path) ? ";path=" + path : "") +
( (domain) ? ";domain=" + domain : "") +
( (secure) ? ";secure" : "");
document.cookie = cookieString;
}
这工作正常,并且 JSESSIONID 会相应地在下一个 ajax 请求中发送。
解决方案 #2: - 在 servlet doGet() 方法中添加“text/plain”mime 类型。 最初在我的测试中我根本没有设置任何内容类型。在我意识到 JQuery 默认情况下需要 XML 响应后,我更改了服务器 doGet() 方法以显式设置内容类型,如下所示:
resp.setContentType("text/plain");
现在,ajax 调用也可以正常工作,实际上不需要手动管理 cookie。我没有解释为什么解决方案 #2 有效,但它确实有效。
谢谢, D.
