Firefox中的AJAX请求失败,在IE中工作(服务器在两种情况下都返回200)

时间:2016-01-03 23:32:43

标签: javascript ajax

我正在本地测试。我在localhost:50972上使用IIS和HTML服务,在localhost上使用Java / Jersey作为应用程序服务器:8080。

以下AJAX请求在Internet Explorer中成功,但在Chrome和Firefox中失败,即使服务器显示200 OK:

public getTest() {
    var settings: JQueryAjaxSettings = {
        url: "http://localhost:8080/getData",
        type: "GET",
        crossDomain: true,
        dataType: "text",
    };

    jQuery.ajax(settings).done(function (o) {
        alert(o);
    }).fail(function (request) {
        alert(request);
    });
}

Java端的代码如下所示:

@GET
@Path("/getData")
public Response getData() {

    NewCookie cookie = new NewCookie("test", "key:val", "/", null, "comment", 100, false );
    return Response.status(Response.Status.OK).entity("Hello World").cookie(cookie).build();
}

以下是来自IE和Firefox的相关HTTP请求/响应:

Internet Explorer请求(成功)

GET http://localhost:8080/getData?_=1451863561652 HTTP/1.1
Referer: http://localhost:50972/
Accept: text/plain, */*; q=0.01
Accept-Language: en-US
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko
Connection: Keep-Alive
DNT: 1
Host: localhost:8080

Firefox请求(失败)

GET http://localhost:8080/getData?_=1451863686206 HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0
Accept: text/plain, */*; q=0.01
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://localhost:50972/
Origin: http://localhost:50972
Connection: keep-alive

来自服务器的响应(发送给两者)

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: test=key:val;Version=1;Comment=comment;Path=/
Content-Type: text/plain
Content-Length: 11
Date: Sun, 03 Jan 2016 23:26:07 GMT

Hello World

我也尝试使用{}dataType: json代替Hello WorlddataType: text,但没有任何变化。我还试过了crossDomain: truecrossDomain: false帮助?

1 个答案:

答案 0 :(得分:2)

观察到的行为是因为Firefox(和Chrome等)正确考虑了另一个端口来建立不同的来源; IE没有。

请参阅MDN - Same Origin Policy

  

如果协议,端口(如果指定了一个端口)和两个页面的主机相同,则两个页面具有相同的原点。

     

.. [但] IE不包含同源组件的端口 ,因此考虑http://company.com:81/index.htmlhttp://company.com/index.html来自同一来源,不受任何限制。

在服务器上启用CORS - 请求在所有浏览器中成功。