在微信公共平台开发过程中,遇到ajax轮询跨域和同域情况下遇到问题,这方面没什么经验,求大神交流!!!

时间:2022-08-28 18:02:36
轮询时的请求头:
同域:
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每次返回都繁盛改变!

这种差异不知道咋解决啊!!!

#3


真的没人吗?

#4


看一下这个帖子:http://mutongwu.iteye.com/blog/1637183

跨域情况下,客户端和服务端是不是交换请求信息的。

在服务端和客户端都要加上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每次返回都繁盛改变!

这种差异不知道咋解决啊!!!

#3


真的没人吗?

#4


看一下这个帖子:http://mutongwu.iteye.com/blog/1637183

跨域情况下,客户端和服务端是不是交换请求信息的。

在服务端和客户端都要加上res.header("Access-Control-Allow-Credentials", true);

并且在ajax每次轮询的时候,要加上这两段:
xhrFields: {
      withCredentials: true
  },
crossDomain: true