2016-06-14 237 views
7

我发出一个POST请求,请求刚好位于待处理状态,直到最终失败。我监视了nginx日志和节点服务器日志,并且请求甚至没有注册。除另一个同事之外,这对其他任何人都有效。如果我使用边缘浏览器或其他计算机,它可以正常工作。仅适用于Chrome和Firefox的选项(失败)

我试图向其他(自定义)服务器发出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://网内部/#事件

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) 

我真的猜这是关系到的东西,在我的浏览器(一个或多个),但我缓存真的找不到什么。我已经清除了所有可以存储的cookies和任何东西。我还可以在哪里检查以清除事情?这显然是我的电脑/浏览器(和另一个不幸的人)的本地东西。

+0

http://stackoverflow.com/questions/10143093/origin-is-not-allowed-by-access-control-allow-origin –

+0

这与Angular无关。您正在访问的服务器需要支持CORS请求。 'OPTIONS'是浏览器自主进行的预检请求。如果它没有返回预期的'Access-Control-Allow -...'标头,它甚至不会尝试发送实际的请求。 –

+0

@GünterZöchbauer我启用了CORS。该请求适用于其他计算机和浏览器。 – Aarmora

回答

2

请尝试订阅()到observable。

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

对不起,这只是我的服务,这是我的组件调用。我的组件已订阅。我应该澄清一点。 – Aarmora

+0

@Aarmora您是否尝试过进入后期调用以查看它执行的最后一步是什么? – zpul

+0

它会进行完整的调用,但请求只是挂起。由于连接被拒绝,所以没有回叫。 – Aarmora

1

您是否尝试过在头文件中设置'Cache-Control'?我认为在jQuery的你可以简单地设置

$.ajax({  
    cache: false 
}); 

或定期Ajax请求添加头部

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

我没有听说过这个。我只是尝试它,并没有得到不同的结果。好的建议,但。 – Aarmora

1

没有与CORS问题和使用localhost作为域(已在原产地已上市头)。通常,由于某些安全原因,当涉及localhost时,CORS/OPTIONS请求无法正常工作,但挂起通常不会发生,所以这可能不是正确答案,但它值得一试!

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

按照下面的评论

你的服务器似乎允许的连接,但它不会出现发送响应。您是否能够从成功的OPTIONS请求中发布头文件以证明服务器实际上能够处理这些请求。

+0

不幸的是,当从本地主机或从具有域和DNS设置的web服务器调用时,会发生同样的事情。谢谢,不过。 – Aarmora

+0

另一件事是您的服务器由于某些逻辑问题(通过cookie /凭证或其他原因)未返回响应。您是否可以添加处理这些请求的服务器端代码的POST和OPTION端点? –

+0

是的,该服务器可以在Edge上为其他人或我工作。它只适用于Chrome和Firefox。 – Aarmora

1

你为什么不阻止进入OPTIONS请求循环。有时真的让你发疯。其他浏览器不会触发OPTIONS请求,但Chrome和Firefox会确保CORS。我已经成功地使用了这个库,名为xdomain从github,它真的工作!他们的github介绍页面将xdomain介绍为CORS alternative。最重要的是我在JQuery中使用它,但它也支持Angular的http服务。看看它 。它可以帮助你的好:)。这里是链接库Xdomain CORS Alternative

相关问题