首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jquery Ajax请求调用了两次,第一个请求没有发送标头中的token

Jquery Ajax请求调用了两次,第一个请求没有发送标头中的token
EN

Stack Overflow用户
提问于 2012-11-29 05:31:51
回答 3查看 6.5K关注 0票数 3

我正在使用ajax调用一个基于WCF REST的服务。

ajax方法在页面加载之前被调用。我希望在ajax请求的头部发送一个"Token“。在小提琴手中,我看到的是:

1.)头中没有token的服务请求。(AJAX调用失败)2.)头中有token的相同服务的请求。(传递AJAX调用)

在那之后,在chrome和safari上一切都可以正常工作。但在IE10和Mozilla上只有一个服务调用。因此,IE10和Mozilla中的服务调用失败,因为请求的头部中没有令牌。

这是我调用的方法:

代码语言:javascript
复制
function callservice (method, serviceUrl, params, successHandler, errorHandler) {
    $.ajax({
        crossDomain: true,
        type: method,
        url: serviceUrl,
        beforeSend: function (XMLHttpRequest) { XMLHttpRequest.setRequestHeader("Authorization", Token); },
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: successHandler,
        error: errorHandler
    });
    function photos(data) {
        alert(data);
        console.log(data);
    };
}

我控制Web服务和应用程序(调用此Web服务)。当应用程序和web服务都托管在本地host.In上时,如果只有一次成功的服务调用,则不会出现此问题。但是当有一个跨域调用时,有两个AJAX调用。

我的问题是,为什么AJAX请求不在第一次尝试时发送令牌?为什么只在第二个AJAX调用中发送令牌?

任何形式的帮助都将不胜感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-28 23:09:48

问题出在CORS.Earlier上,浏览器不允许对与客户端不同的域发出ajax请求,因为它被认为是安全的。只要服务器与client.So合作,浏览器就可以发出跨域ajax请求。这就是当有来自浏览器的跨域请求时实际发生的情况:

1.)首先,浏览器向服务发送“预检”请求,以从WCF服务收集授权信息(在我的例子中,这是一个头方法为“OPTIONS”的请求)。作为回报,Web服务发送Access Control Allow Origin作为其响应header.And的一部分,由于此请求而显示在fiddler上的错误是HTTP500WCF AJAX请求在数据字段中没有任何内容,因为它只是查找error.This服务的授权详细信息的一种方式。

2.)Chrome和Safari随后向网络服务发出了第二个请求,因为它们已经获得了service.Whereas Firefox的授权细节,并且IE不愿意向该服务发出第二个ajax请求,因为飞行前请求存在HTTP500错误。因此,Chrome和Safari都能够与该服务进行通信。

因此,解决方案是修改来自WCF服务的响应,以防有“印前检查请求”发送给它。我修改了服务发送的响应,以防有“印前检查请求”发送HTTP 200 OK响应。这允许IE和Mozilla等浏览器在印前检查请求后发送实际请求。

这是我提到的其中一个来源:http://www.bennadel.com/blog/2327-Cross-Origin-Resource-Sharing-CORS-AJAX-Requests-Between-jQuery-And-Node-js.htm

希望这对面临同样问题的人们有所帮助。

票数 7
EN

Stack Overflow用户

发布于 2012-11-29 05:51:25

跨域呼叫在同源策略下。默认情况下,您不能进行调用。您需要使用CORS或JSONP或代理。

票数 0
EN

Stack Overflow用户

发布于 2012-11-29 05:42:01

XMLHttpRequest:除非他们更改了它,否则在MS Explorer中,您将需要使用ActiveXObject("Microsoft.XMLHTTP")。对于我在普通JS中进行的ajax调用,我使用下面这行代码来根据浏览器类型创建对象:

代码语言:javascript
复制
if (window.XMLHttpRequest){
   //for most BRowsers
   r = new XMLHttpRequest(); 
} else{ 
   //for Explorer
   r = new ActiveXObject("Microsoft.XMLHTTP");
}

然后将您的beforesend应用于这里创建的对象(在我的例子中是r)。我真的相信这是你和EI的问题。但没有经过测试。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13614802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档