同域:
Request URL:http://42.159.152.47/wx/scan/OA?rand=100&username=yiqiuheng&from=OA&objectid=1&t=1411480040192
Request Headers
Provisional headers are shown
Accept:*/*
Referer:http://42.159.152.47/test
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36
X-DevTools-Emulate-Network-Conditions-Client-Id:32E60886-6F0B-47D8-BFF3-E596A5D9D475
X-Requested-With:XMLHttpRequest
异域:
Request URL:http://42.159.152.47/wx/scan/OA?rand=729&username=mlsc&from=OA&objectid=1&t=1411480245969
Request Headers
Provisional headers are shown
Accept:*/*
Origin:http://localhost:8080
Referer:http://localhost:8080/Wry_wx/wx.jsp
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36
X-DevTools-Emulate-Network-Conditions-Client-Id:AE742D3D-EEE6-48BB-90EC-46521A503DF7
对比发现,一个有X-Requested-With:XMLHttpRequest,一个没有,都是ajax轮询,怎么会出现这个差别的!?
当轮询结束,返回404时,请求头和返回头如下:
同域:
Remote Address:42.159.152.47:80
Request URL:http://42.159.152.47/wx/scan/OA?rand=100&username=yiqiuheng&from=OA&objectid=1&t=1411483163181
Request Method:GET
Status Code:404 Not Found
Request Headersview source
Accept:*/*
Accept-Encoding:gzip,deflate,sdch
Accept-Language:zh-CN,zh;q=0.8
Cache-Control:no-cache
Connection:keep-alive
Cookie:connect.sid=s%3AP36cxJZCN6yJX8s2fe6X5mcKzm1rIHl9.EfMzNxdkjRpyZjLrDToCPo1sppXkK0of%2FAdSgPakUuo
Host:42.159.152.47
Pragma:no-cache
Referer:http://42.159.152.47/test
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36
X-Requested-With:XMLHttpRequest
Query String Parametersview sourceview URL encoded
rand:100
username:yiqiuheng
from:OA
objectid:1
t:1411483163181
Response Headersview source
Access-Control-Allow-Origin:*
Connection:keep-alive
Content-Length:9
Content-Type:text/plain; charset=utf-8
Date:Tue, 23 Sep 2014 14:39:49 GMT
ETag:W/"9-b1748c4d"
X-Powered-By:Express
异域:
Remote Address:42.159.152.47:80
Request URL:http://42.159.152.47/wx/scan/OA?rand=380&username=mlsc&from=OA&objectid=1&t=1411482084092
Request Method:GET
Status Code:404 Not Found
Request Headersview source
Accept:*/*
Accept-Encoding:gzip,deflate,sdch
Accept-Language:zh-CN,zh;q=0.8
Cache-Control:no-cache
Connection:keep-alive
Host:42.159.152.47
Origin:http://localhost:8080
Pragma:no-cache
Referer:http://localhost:8080/Wry_wx/wx.jsp
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36
Query String Parametersview sourceview URL encoded
rand:380
username:mlsc
from:OA
objectid:1
t:1411482084092
Response Headersview source
Access-Control-Allow-Origin:*
Connection:keep-alive
Content-Length:9
Content-Type:text/plain; charset=utf-8
Date:Tue, 23 Sep 2014 14:21:50 GMT
ETag:W/"9-b1748c4d"
set-cookie:connect.sid=s%3Aq7je2-dcvQ9kL4B_amHJK-pzFTonQiy_.6B16W2OJtD9GU3SfaAqNDAXxlJx4A2CUDxXnnEcdTWI; Path=/; HttpOnly
X-Powered-By:Express
两者对比发现,异域时,response Headers多了一个set-cookie,request header少了一个Cookie:connect.sid。
同域的情况是我正确的,但是异域时,对服务端做同样的http访问就出现了以上区别。
是不是异域时,每次response都重新设置了cookie,导致服务端接受到的session-id老是变化。
而同域情况下,每次客户端轮询时,服务端的seesion-id不变。
我想知道是什么引起的这样的区别,这个问题困扰我几天了,真心求大神!!!
js轮询代码如下:
(function() {
var $,
__slice = [].slice;
$ = jQuery;
//为`jQuery`对象扩展`scan`方法,注册或触发二维码扫描事件。
$.fn.scan = function(handler, options) {
//直接调用`scan`时,触发`jQuery`对象的`scan`事件。
if (!arguments.length) {
return this.trigger('scan');
}
//对选区内二维码逐一处理,等候其扫描事件。
return this.each(function() {
var continuous, error, expires, img, load, msg_ids, new_src, src;
msg_ids = {};
// + 缓存原始图片地址,供载入失败或失效时刷新用;
// + 变量`img`实时指向有效的图片元素;
// + 临时二维码有效时间为`1800`秒。
if (!(src = $(this).attr('src'))) {
return;
}
continuous = $(this).attr('continuous') != null;
img = this;
expires = 1800 * 1000;
//手工触发`scan`时,用自定义参数调用二维码扫描句柄。
$(this).on('scan', null, null, function() {
var args, event;
event = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
return handler != null ? handler.apply(img, args) : void 0;
});
//增补当前时间生成新地址,以防浏览器缓存原图片。
new_src = function() {
var w_query;
w_query = src.indexOf('?') !== -1;
return "" + src + (w_query ? '&' : '?') + "t=" + (Date.now());
};
//二维码图片载入后:
load = function() {
//1. 显示图片;
//2. 轮询扫码结果。
var permanent, polling, refresh;
$(img).show();
(polling = (function(_this) {
return function() {
var timeout;
if (!$(img).is(':visible')) {
return;
}
timeout = setTimeout(polling, 25000);
return (function() {
var scan_url, start;
start = Date.now();
scan_url = encodeURI(decodeURI(src.replace(/(.*)(\/qrcode)($|((\?|\/).*))/i, '$1/scan$3')));
scan_url = scan_url.indexOf('?') !== -1 ? scan_url + ("&t=" + (Date.now())) : scan_url + ("?t=" + (Date.now()));
return $.ajax(scan_url).success(function(params) {
var msg_id, _ref;
clearTimeout(timeout);
$(img).addClass('scanned');
// alert("x");
_ref = params, msg_id = _ref[0], params = 2 <= _ref.length ? __slice.call(_ref, 1) : [];
if (msg_ids[msg_id]) {
return;
}
msg_ids[msg_id] = 1;
if (handler != null) {
handler.apply(img, params);
}
if (continuous) {
return polling();
}
//请求失败时,
}).fail(function(xhr, status) {
// $(img).addClass('scanned');
if (xhr.status === 404) {
return;
}
clearTimeout(timeout);
return polling();
});
})();
};
})(this))();
//二维码失效后刷新二维码:
// 1. 如果图片已经不可见,不更新图片;
// 2. 创建新的图片元素,设置图片地址;
// 3. 载入成功后,替换原图,重新计时;
// 4. 载入失败后,重复刷新二维码流程。
if (permanent = src.match(/\/qrcode\/\d+(\?|$)/)) {
return;
}
return setTimeout(refresh = (function(_this) {
return function() {
if (!$(img).is(':visible')) {
return;
}
return $(img).clone().attr('src', new_src()).hide().appendTo(document.body).load(function() {
if (!$(img).is(':visible')) {
return;
}
img = $(this).replaceAll(img).show().get(0);
return setTimeout(refresh, expires);
}).error(function() {
$(this).remove();
return refresh();
});
};
})(this), expires);
};
error = function() {
//图片载入失败时,更新图片地址(重试)。
return $(this).attr('src', new_src());
};
//注册载入成功与失败事件。
$(this).load(load).error(error);
if (this.complete) {
//如已经载入,手动触发载入事件。
return $(this).load();
}
});
};
}).call(this);
具体问题描述可以见这个描述:http://bbs.csdn.net/topics/390892127
都没分了,真不好意思!!!
4 个解决方案
#1
自己顶一下!
#2
大致说一下我分析出来的结果,同域下,cookies的expire为N/A,并且ajax轮询时返回的response都不会重新调用set-Cookies,所以session-id一直保持不变。
但是异域情况下,cookies的expire为session,ajax轮询时返回的response会重新调用set-Cookies,所以session-id每次返回都繁盛改变!
这种差异不知道咋解决啊!!!
但是异域情况下,cookies的expire为session,ajax轮询时返回的response会重新调用set-Cookies,所以session-id每次返回都繁盛改变!
这种差异不知道咋解决啊!!!
#3
真的没人吗?
#4
看一下这个帖子:http://mutongwu.iteye.com/blog/1637183
跨域情况下,客户端和服务端是不是交换请求信息的。
在服务端和客户端都要加上res.header("Access-Control-Allow-Credentials", true);
并且在ajax每次轮询的时候,要加上这两段:
xhrFields: {
withCredentials: true
},
crossDomain: true
跨域情况下,客户端和服务端是不是交换请求信息的。
在服务端和客户端都要加上res.header("Access-Control-Allow-Credentials", true);
并且在ajax每次轮询的时候,要加上这两段:
xhrFields: {
withCredentials: true
},
crossDomain: true
#1
自己顶一下!
#2
大致说一下我分析出来的结果,同域下,cookies的expire为N/A,并且ajax轮询时返回的response都不会重新调用set-Cookies,所以session-id一直保持不变。
但是异域情况下,cookies的expire为session,ajax轮询时返回的response会重新调用set-Cookies,所以session-id每次返回都繁盛改变!
这种差异不知道咋解决啊!!!
但是异域情况下,cookies的expire为session,ajax轮询时返回的response会重新调用set-Cookies,所以session-id每次返回都繁盛改变!
这种差异不知道咋解决啊!!!
#3
真的没人吗?
#4
看一下这个帖子:http://mutongwu.iteye.com/blog/1637183
跨域情况下,客户端和服务端是不是交换请求信息的。
在服务端和客户端都要加上res.header("Access-Control-Allow-Credentials", true);
并且在ajax每次轮询的时候,要加上这两段:
xhrFields: {
withCredentials: true
},
crossDomain: true
跨域情况下,客户端和服务端是不是交换请求信息的。
在服务端和客户端都要加上res.header("Access-Control-Allow-Credentials", true);
并且在ajax每次轮询的时候,要加上这两段:
xhrFields: {
withCredentials: true
},
crossDomain: true