2017-05-10 92 views
1

我想编写一个拦截器来添加一个令牌给所有使用Angular的HTTP请求。我大致使用这里给出的配方 - https://thinkster.io/interceptors角拦截器和CORS

所以代码使用http模块工厂和tokenInterceptor()函数。我可以成功地将一个标记作为头添加到请求中 - 但现在,当它通过拦截器时,它会被某种CORS阻塞机制阻止。在Chrome控制台中出现此错误 -

XMLHttpRequest无法加载http://127.0.0.1:/。 对预检请求的响应未通过访问控制检查:否 请求的 资源上存在“访问控制 - 允许来源”标头。 Origin'http://127.0.0.1:/'为 因此不允许访问。响应有HTTP状态代码403

我想在我的拦截器设置访问控制允许起源头象下面无济于事:

config.headers['Access-Control-Allow-Origin'] = '*'; 

我在网上尝试了一些建议,但没有帮助。客户端是否需要做任何事情来解决CORS相关问题 - 或者这是否是服务器方面的问题?

+0

要获得更多帮助,您应该发布您用来发出请求的前端JavaScript片段 - 包括它正在添加的请求标头。您应该也可以发布服务器端拦截器代码的片段。当你说*我已经在网上尝试了一些建议*时,你应该明确列出到目前为止您尝试过的内容。您可以使用https://stackoverflow.com/posts/43902712/edit编辑/更新您的问题以添加所有这些详细信息。 – sideshowbarker

回答

3

多数民众赞成响应请求的服务器需要发送Access-Control-Allow-Origin响应头为OPTIONS请求,不只是为GETPOST请求。

https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests

回应预检要求未通过访问控制检查

究其原因,浏览器给你的错误是:之前它会尝试你正在努力使实际的请求从您的前端JS代码中,浏览器会发送一个OPTIONS请求,以查看服务器是否以某种方式进行响应,指示它正在选择接收您尝试创建的请求。

所以,你的服务器端代码需要增加处理的OPTIONS请求与响应Access-Control-Allow-OriginAccess-Control-Allow-Headers & Access-Control-Allow-Methods

做什么都需要在客户端完成修复CORS相关问题 - 或者这是否都是服务器端问题?

在客户端没有什么可以改变行为或让浏览器不发出错误。 CORS配置是所有服务器端问题。您的服务器必须处理OPTIONS

响应有HTTP状态代码403

这表明授权失败。这可能只是因为您的服务器未配置为发送成功响应(200204OPTIONS请求 - 在这种情况下,您必须配置为执行此操作(发送200204以及正确的Access-Control-Allow-*标题,并且不会响应正文) - 或者可能是因为您尝试发送需要授权并且授权失败的请求。