添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
Access to XMLHttpRequest at ‘http://abc.com‘ from origin ‘http://xxx.com‘ has been blocked by CORS p
最新推荐文章于 2024-08-23 18:57:37 发布
最新推荐文章于 2024-08-23 18:57:37 发布 阅读量 494

Access to XMLHttpRequest at 'http://abc.com' from origin 'http://xxx.com' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute.

今天同事改一个老项目的请求配置,本地改完没问题,部署之后报跨域问题,搞了半天没解决,帮忙看了一下,错误如↑

看了一下错误提示,上面说这个错误是由于浏览器的跨域资源共享(CORS)策略引起的。浏览器默认情况下限制了从一个源(origin)向另一个源发送跨域请求。

根据错误消息,咱们的请求是从 `http://abc.com` 发起的,而目标地址是 `http://xxx.com`。由于这两个域名不同,浏览器会执行预检请求(preflight request)来检查服务器是否允许跨域请求。

预检请求的目的是检查服务器是否允许实际请求(例如 GET、POST)的跨域访问。服务器需要在响应的头部中包含一些特定的信息,以便浏览器确认是否允许跨域访问。

错误消息中提到了一个特定的问题, 即响应头部中的 `Access-Control-Allow-Origin` 字段的值不能为通配符 '*',当请求的凭据模式为 'include' 时。这意味着你的服务器需要设置具体的允许跨域访问的域名,而不是使用通配符。而这个问题是由XMLHttpRequest的withCredentials属性控制的

一般为了解决这个问题,咱们可以在服务器端进行配置,确保响应头部中的 `Access-Control-Allow-Origin` 字段的值是请求源的域名,而不是通配符。例如,你可以将该字段设置为 `http://abc.com`。

另外,还需要确保服务器在预检请求的响应中包含其他必要的头部字段,例如 `Access-Control-Allow-Methods` 和 `Access-Control-Allow-Headers`,以指定允许的请求方法和头部信息。

但咱们是多个项目用一个接口,显然这个方式不合适

这个时候,我们看一下这个incloude模式是什么意思?咱们的代码为什么会是这个模式?如果不设置成这个模式,是不是就可以了?查找资料后总结如下:

当请求的凭据模式为 'include' 时,意味着在发送跨域请求时,浏览器会在请求中包含凭据信息,例如身份验证凭证(如 cookies)或 HTTP 认证头部。这通常用于需要在跨域请求中传递用户凭据的情况,例如进行身份验证或会话管理。

在默认情况下,浏览器在跨域请求中不会发送凭据信息。但是,如果你的代码中设置了请求的凭据模式为 'include',例如通过将 XMLHttpRequest 对象的 withCredentials 属性设置为 true ,那么浏览器会在发送跨域请求时包含凭据信息。

当请求的凭据模式为 'include' 时,CORS 策略要求服务器的响应头部中的 Access-Control-Allow-Origin 字段的值不能是通配符 '*',而是必须是实际请求的源域名。这是为了确保凭据信息不会被恶意网站获取到。

这里看到了withCredentials关键词,同时上面报错也提到了withCredentials

回项目里搜 withCredentials,果然,在封装的http请求里,看到了

$https.defaults.withCredentials = true;

注释掉,重新部署,问题解决啦  ^_^

完成后,查一下withCredentials是干啥的,因为是老项目,也不知道有没有用。

`withCredentials` 属性是 `XMLHttpRequest` 对象的一个属性,用于指定在发送跨域请求时是否包含凭据信息(如 cookies、HTTP 认证头部)。

当 `withCredentials` 属性设置为 `true` 时,浏览器会在发送跨域请求时包含凭据信息。这可以用于以下场景:

1. 跨域身份验证:当你的应用程序需要在跨域请求中传递用户凭据(如 cookies)以进行身份验证时,你可以将 `withCredentials` 设置为 `true`。这样,在发送跨域请求时,浏览器会自动包含用户的身份验证凭据,使服务器能够验证用户并提供相应的响应。

2. 跨域会话管理:如果你的应用程序需要在跨域请求中维护会话状态,你可以使用 `withCredentials` 属性。通过在跨域请求中包含会话凭据,服务器可以识别用户的会话并保持会话状态的连续性。

需要注意的是,使用 `withCredentials` 属性需要服务器支持接收和处理包含凭据信息的跨域请求。服务器需要正确配置 CORS 响应头部,允许接收跨域请求的凭据信息。否则,在发送带有凭据信息的跨域请求时,浏览器会拒绝该请求。

总结来说,`withCredentials` 属性的作用是允许在跨域请求中发送凭据信息,常用于跨域身份验证和跨域会话管理的场景。但使用时需要确保服务器端正确配置和处理跨域请求的凭据信息。

而咱们这个问题就是因为 服务端Access-Control-Allow-Origin设置为“*”,咱们withCredentials又设置为true导致的冲突导致的。

在浏览器打开本地的html文件, 上面proxy中的url获取的就是一个本地文件, 协议是file://,如果是在服务器启动的话,则使用的是 http 或者 http s协议。 出于安全性考虑, Chrome 默认禁止了这种用法,file协议和 http / http s协议不同,会被 Chrome 认为是跨域访问,所以会报被 CORS (Cross- Origin Resource Sharing,跨域资源共享)的安全策略阻止。 错误信息: Access to XMLHttpRequest at ' http ://localhost:9090' from origin ' http ://localhost:9090' has been block ed by CORS policy: No ' Access -Control-Allow- Origin ' header is present on the request ed resource. 翻译:【在 http ://localhost:9090对 http ://localhos 解决“ Access to XMLHttpRequest at ‘ XXX ’ from origin http ://localhost’ has been block ed by CORS policy” Access to XMLHttpRequest at ' http :// xxx ' from origin ' http ://xx' has been block ed by CORS policy: Response to preflight request doesn't pass access control check: No ' Access -Control-Allow- Origin ' header is present on the re 跨域问题解决方案: CORS Access to XMLHttpRequest at '*' from origin '*' has been block ed by CORS policy: Response to preflight request doesn't pass access control check: No ' Access -Control-Allow- Origin ' header... 2.搜索 Block insecure private network requests。1.在浏览器输入框中输入 chrome ://flags/进入设置页面。谷歌浏览器后出现上面的错误。 前端 跨域主流解决方案( Access to XMLHttpRequest at ‘ http ..’ from origin ‘null‘ has been block ed by CORS policy) java.net.UnknownHostException: XXX . XXX . com at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:195) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366) at java.net.Socket.connect(Soc 今天做前后端分离的项目时, 前端 向后台发送请求发现报错: Access to XMLHttpRequest at ‘ http ://localhost:8082/doLogin’ from origin http ://localhost:8080’ has been block ed by CORS policy: Response to preflight request doesn’t pass access control check: No ‘ Access -Control-A