仅适用于Chrome和Firefox的选项(失败)

时间:2016-06-14 08:58:52

标签: javascript xmlhttprequest cors

我发出一个POST请求,请求就位,等待它最终失败。我已经监控了nginx日志和节点服务器日志,并且请求甚至没有注册。除了另外一位同事之外,这对我已经测试过的任何人都有效。如果我使用边缘浏览器或其他计算机,它可以正常工作。

我试图向其他(自定义)服务器发出POST请求,并且它也挂起了那里的选项。我也用jQuery发出了POST请求,它也以同样的方式失败。

可能值得注意的是我正在使用withCredentials标志。

接头:

Provisional headers are shown
Access-Control-Request-Headers:content-type
Access-Control-Request-Method:GET
Origin:http://localhost:8080
Referer:http://localhost:8080/<path>
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36

请求:

  public login(user) {
    const endpoint = `http://<url>`;

    let headers = new Headers();
    headers.append('Content-type', 'application/json');

    return this.http
      .post(endpoint, JSON.stringify(user), {
        headers: headers,
      });

  }

我订阅了我的组件中的电话:

this._accountService.login(this.user)
        .subscribe(res => {
            console.log("logged in!");
            if (res.json().status === "success") {
                window.location.href = `/home/${this.org}/${this.product}`;
            }
            else {
                // What other options are there?
                console.log("Do something else maybe?");
            }
        },
        err => {
            this.invalidLogin = true;
            console.log("Ye shall not pass!");
        });

成功的用户标题

Accept:*/*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8
Access-Control-Request-Headers:content-type
Access-Control-Request-Method:POST
Connection:keep-alive
Host:<url>
Origin:<url>
Referer:<url>
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.33 Safari/537.36

来自chrome:// net-internals /#events

t=61869793 [st=    0] +REQUEST_ALIVE  [dt=60162]
                       --> has_upload = false
                       --> is_pending = true
                       --> load_flags = 34624 (DO_NOT_SAVE_COOKIES | DO_NOT_SEND_AUTH_DATA | DO_NOT_SEND_COOKIES | MAYBE_USER_GESTURE | VERIFY_EV_CERT)
                       --> load_state = 14 (WAITING_FOR_RESPONSE)
                       --> method = "OPTIONS"
                       --> net_error = -1 (ERR_IO_PENDING)
                       --> status = "IO_PENDING"
                       --> url = "<url>"
t=61929955 [st=60162]   -HTTP_STREAM_PARSER_READ_HEADERS
                         --> net_error = -324 (ERR_EMPTY_RESPONSE)
t=61929955 [st=60162]   -HTTP_TRANSACTION_READ_HEADERS
                         --> net_error = -324 (ERR_EMPTY_RESPONSE)
t=61929955 [st=60162]   -URL_REQUEST_START_JOB
                         --> net_error = -324 (ERR_EMPTY_RESPONSE)
t=61929955 [st=60162]    URL_REQUEST_DELEGATE  [dt=0]
t=61929955 [st=60162] -REQUEST_ALIVE
                       --> net_error = -324 (ERR_EMPTY_RESPONSE)

我真的猜测这与我浏览器中缓存的内容有关,但我真的找不到什么。我已经清除了所有可以存储的cookie和任何内容。还有什么地方可以检查清楚的事情?这显然是我的电脑/浏览器(以及另一个不幸的人)本地的东西。

4 个答案:

答案 0 :(得分:2)

请尝试订阅()到观察者。

return this.http
  .post(endpoint, JSON.stringify(user), {
    headers: headers,
  }).subscribe(() => console.log("POST done!"));

答案 1 :(得分:1)

您是否尝试在标题中设置“缓存控制”?我认为在jQuery中你可以简单地设置

$.ajax({    
  cache: false 
});

或添加带有常规ajax请求的标头

request.setRequestHeader("Cache-Control", "no-cache"); 

答案 2 :(得分:1)

CORS存在问题,并使用localhost作为域(您已在ORIGIN标头中列出)。出于某些安全原因,通常CORS / OPTIONS请求在localhost涉及时无法正常工作,但通常情况下发生的情况并非如此,因此这可能不是正确答案,但值得一试!< / p>

尝试将新主机添加到本地计算机并从等式中删除localhost。把这个想法扔到那里,希望它可以帮助你!

根据以下评论

您的服务器似乎允许连接,但似乎没有发送响应。您是否能够从成功的OPTIONS请求发布标头,以证明服务器实际上能够处理这些请求。

答案 3 :(得分:1)

为什么不阻止进入breadcrumb请求循环。它有时会让你发疯。其他浏览器不会触发OPTIONS请求,但chrome和firefox会确保OPTIONS。我已经成功地使用了来自github的这个名为CORS的库,它确实有效!他们的github介绍页面将xdomain描述为xdomain。最重要的是我在JQuery中使用它,但它也支持Angular的CORS alternative服务。看看它 。它可以帮助你好:)。这是图书馆Xdomain CORS Alternative

的链接