跨域问题Access to XMLHttpRequest‘*‘from origin ‘*‘ has been blocked by CORS..Access-Control-Allow-Origin

跨域问题解决方案:CORS

Access to XMLHttpRequest at '*' from origin '*' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

从源'本地路径'访问 '目标路径(请求链接)'文本传输请求已被CORS策略阻塞:对预置请求的响应未通过访问控制检查:请求的资源上不存在'Access- control - allow - origin '报头。

错误原因:

本地路径和目标路径不是同一个域名下引起的跨域问题,并且,就算两个域名是同一个一级域名不同二级域名的时候,例如 a.baidu.com  和 b.baidu.com 是属于不同域的,也是会出现这个问题

介绍

出于安全原因,浏览器限制从脚本内发起的跨源HTTP请求。 例如,XMLHttpRequest和Fetch API遵循同源策略。 这意味着使用这些API的Web应用程序只能从加载应用程序的同一个域请求HTTP资源,除非响应报文包含了正确CORS响应头。

注:这段描述不准确,并不一定是浏览器限制了发起跨站请求,也可能是跨站请求可以正常发起,但是返回结果被浏览器拦截了。

CORS(跨源资源共享)是一个系统,由传输HTTP标头组成,用于确定浏览器是否阻止前端JavaScript代码访问跨源请求的响应

同源安全政策禁止以资源跨域访问。但CORS使Web服务器能够表示他们希望选择允许跨资源访问其资源。

跨域资源共享(CORS) 是一种机制,它使用额外的 HTTP 头来告诉浏览器  让运行在一个 origin (domain) 上的Web应用被准许访问来自不同源服务器上的指定的资源。当一个资源从与该资源本身所在的服务器不同的域、协议或端口请求一个资源时,资源会发起一个跨域 HTTP 请求

如,站点 http://domain-a.com 的某 HTML 页面通过 <img> 的 src 请求 http://domain-b.com/image.jpg。网络上的许多页面都会加载来自不同域的CSS样式表,图像和脚本等资源。

跨域资源共享( CORS )机制允许 Web 应用服务器进行跨域访问控制,从而使跨域数据传输得以安全进行。现代浏览器支持在 API 容器中(例如 XMLHttpRequest 或 Fetch )使用 CORS,以降低跨域 HTTP 请求所带来的风险。

 

解决方案:

1、如果跨域请求发生在相同一级域名不同二级域名之间

例如:a.baidu.com  和 b.baidu.com

跨域直接在邀请求的接口页面中强制设置域为一级域     document.domain = "baidu.com";

2、设置接口允许ajax跨域访问

在服务器aspx页面头文件里加:

<meta http-equiv="Access-Control-Allow-Origin" content="*" />

在web.config文件中的 system.webServer 节点下 增加如下配置

<system.webServer>  
    <httpProtocol> 
        <customHeaders> 
            <add name="Access-Control-Allow-Methods" value="OPTIONS,POST,GET"/> 
            <add name="Access-Control-Allow-Headers" value="x-requested-with"/> 
            <add name="Access-Control-Allow-Origin" value="*" /> 
        </customHeaders> 
    </httpProtocol> 
</system.webServer>

网上说的解决方案都是Internet Explorer 8 、9使用 XDomainRequest 对象实现CORS。是不是有这么复杂?于是博主各种百度寻找解决方案。最后发现在调用处指定 jQuery.support.cors = true; 这一句就能解决IE8、9的问题了

这句话的意思就是指定浏览器支持跨域。IE9以上版本的浏览器、谷歌、火狐等都默认支持跨域,而IE8、9却默认不支持跨域,需要我们指定一下。

//例如
jQuery.support.cors = true;
var ApiUrl = "http://b.baidu.com";
$(function () {
    $.ajax({
        type: "get",
        url: ApiUrl + "api/Charging/GetAllChargingData",
        data: {},
        success: function (data, status) {
            if (status == "success") {
                alert("ok");
            }
        },
        error: function (e) {
            alert("error");
        },
        complete: function () {

        }
    });
});

注:我这里设置的*是任意的请求都可以访问,如果需要限制替换成自己的访问地址就可以了。

参考资料:

 HTTP访问控制(CORS)   https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS

CORS(跨源资源共享)      https://developer.mozilla.org/en-US/docs/Glossary/CORS

 

 

你有困难我帮忙,我住隔壁我姓王。----------------- 你隔壁的老王宣。

<think>好的,我现在需要帮用户解决一个CORS问题。用户遇到了错误信息:“Access to XMLHttpRequest at xxx from origin xxx has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource”。首先,我要回忆一下CORS的基本概念和常见原因。 CORS源资源共享,浏览器出于安全考虑会阻止请求,除非服务器明确允许。这个错误通常是因为服务器没有正确设置响应头,比如缺少Access-Control-Allow-Origin。那用户可能是在前端应用尝试访问不同源的API时遇到了这个问题。 接下来,我需要考虑可能的解决方案。首先,用户可能没有权限修改服务器配置,比如在使用第三方API的情况下,这时候可能需要后端代理或者JSONP。但如果是自己的服务器,应该建议他们在后端设置CORS头。 常见的解决方法包括: 1. 服务器端设置响应头,比如Access-Control-Allow-Origin*或特定名,还有相关的其他头如Allow-Methods、Allow-Headers等。 2. 如果是开发环境,可以用开发服务器的代理功能,比如Vue的vue.config.js或React的setupProxy.js,或者用webpack-dev-server的proxy配置。 3. 测试时禁用浏览器安全策略,不过这只是临时方案,不推荐生产使用。 4. 如果用户使用Node.js作为后端,可能需要检查中间件如cors的配置是否正确启用,有没有设置正确的来源和方法。 5. 如果是Nginx或Apache,需要检查配置文件是否正确添加了CORS相关的头信息。 另外,需要注意预检请求(Preflight),对于复杂请求,浏览器会先发OPTIONS请求,服务器必须正确处理OPTIONS方法并返回正确的头。如果服务器没有处理OPTIONS,也会导致CORS失败。 还需要提醒用户,使用*作为允许的源在生产环境可能不安全,最好指定具体的名。同时,携带凭证(如cookies)的请求不能使用*,这时候需要明确设置具体的源,并且设置Allow-Credentials为true。 用户可能不太清楚如何具体配置服务器,所以需要分步骤给出不同后端环境的例子,比如Node.js + Express、Nginx、Apache等。如果用户是前端开发者,可能需要指导他们如何配置代理,或者联系后端团队处理。 此外,可能还需要检查服务器是否有其他安全策略阻止了请求,比如防火墙设置或者云服务的安全组规则。有时候,即使CORS头正确,网络层的限制也会导致请求失败。 最后,要建议用户检查浏览器控制台的详细错误信息,确认请求是否确实被服务器拒绝,或者是否存在其他问题,比如网络错误或证书问题。同时,使用工具如Postman或curl测试API,确认服务端是否正常运行,排除前端代码的问题。</think>这个错误是浏览器**资源共享(CORS)机制**触发的安全限制。以下是分步骤解析与解决方案: --- ### 一、问题本质 1. **请求**:你的前端页面名(如`http://localhost:3000`)请求了不同名/端口/协议的后端API(如`http://api.example.com`) 2. **浏览器拦截**:由于服务器未返回`Access-Control-Allow-Origin`响应头,浏览器判定请求不安全并阻止 --- ### 二、解决方案分类 #### 方案1:修改服务端配置(推荐) ```javascript // Node.js/Express 示例 const cors = require('cors'); app.use(cors({ origin: 'http://your-frontend-domain.com', // 或 '*' 允许所有 methods: ['GET', 'POST', 'PUT', 'DELETE'], allowedHeaders: ['Content-Type', 'Authorization'] })); ``` ```nginx # Nginx 配置示例 location / { add_header 'Access-Control-Allow-Origin' 'http://your-frontend-domain.com'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,Content-Type,Authorization'; } ``` #### 方案2:开发环境临时方案 - **前端代理**(适用于Vue/React等脚手架): ```javascript // vue.config.js module.exports = { devServer: { proxy: { '/api': { target: 'http://your-backend-domain.com', changeOrigin: true } } } } ``` - **禁用浏览器安全策略**(仅测试用): ```bash # Chrome启动参数(macOS/linux) open -n -a "Google Chrome" --args --disable-web-security --user-data-dir=/tmp/chrome ``` #### 方案3:处理预检请求(OPTIONS) ```javascript // 显式处理OPTIONS请求 app.options('/api', cors()); // Express中间件简化处理 ``` --- ### 三、关键注意事项 1. **生产环境必须指定具体**,避免使用`*` 2. **携带凭证时**(如cookies)需配置: ```javascript Access-Control-Allow-Credentials: true Access-Control-Allow-Origin: http://your-frontend-domain.com // 不能为* ``` 3. **复杂请求**(如自定义Header)会触发预检请求,需配置`Access-Control-Allow-Headers` --- ### 四、排查工具 1. 浏览器开发者工具 -> Network标签查看请求头/响应头 2. 使用`curl -I http://api-url`检查响应头 3. 通过Postman发送请求验证是否为纯前端问题 如果服务端无法修改,最后可考虑**JSONP**(仅限GET请求)或**服务器中转代理**方案。
评论 44
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胡老汉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值