ajax请求本地json文件,谷歌浏览器报跨域错误

前端在做页面的时候,有时候需要可能为了测试某一功能,或者为了自己做demo,会访问本地json文件,获取数据,进行处理;但最近发现使用ajax请求json文件的时候,谷歌浏览器报错如下:
Access to XMLHttpRequest at ‘file:///…’ from origin ‘null’ has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https.
意即:跨域请求仅支持协议方案:http、data、chrome、chrome-extension、https。换句话说,认识访问本地文件是跨域行为,谷歌浏览器的安全机制会使得跨域失败。至于为什么,表示看了一些前人总结,我只总结出几句话“谷歌浏览器的安全策略,禁止ajax访问本地的文件,这是不安全的不被允许的”。
经测试,火狐、IE都是可以访问本地ajax文件,没有跨域问题的。
解决谷歌浏览器需要请求本地json文件:

1、jsonp(jsonp请求本地与请求其他服务器有不一样的用法)

2、项目中使用nginx反向代理(自行了解,nginx是个不错的代理服务器)

3、在webstorm中打开(webstorm中自带了一个本地服务器,会在浏览器中开一个端口)

4、修改谷歌浏览器的配置(不知怎么修改,且不实用)

综上,此处采取最经常实用的jsonp请求,经过自己实践和总结直接写出经验:ajax是无法在谷歌之下请求到本地文件的,与jsonp的配合也是用在访问其他服务器。

jsonp请求json文件方法:

1、jsonp请求本地json文件
不知道大家在使用script的src属性引入CDN文件的时候,有没有注意到这是一个不用考虑跨域的请求其他服务器并成功获取文件的方式。所以,请求本地文件就是使用“script的src + jsonp方式”,具体用法如下:

json文件

callbackFun({
    "data": [{
        "id": 1,
        "name": "z"
    },{
        "id": 2,
        "name": "m"
    }]
})
// 此处的callbackFun与下面的函数名对应

html页面中

<script type="text/javascript">
	function callbackFun (data) {
        console.log(data);
	}
</script>

<script src="./data.json?callback=callbackFuc"></script>
// callback代表json的回调函数,callbackFun为回调函数名,及你要进行处理数据的函数名
// callbackFun回调函数必须放在前面
2、jsonp + ajax请求其他服务器文件
$.ajax({
    async : true,
    url : "https://xxx/xx/xx",
    type : "GET",
    dataType : "jsonp", // 返回的数据类型,设置为JSONP方式
    jsonp : 'callback', //指定一个查询参数名称来覆盖默认的 jsonp 回调参数名 callback
    jsonpCallback: 'handleResponse', //设置回调函数名
    data : {}, 
    success: function(response, status, xhr){
        console.log('状态为:' + status + ',状态是:' + xhr.statusText);
        console.log(response);
    }
});

// 也可以通过getJSON
$.getJSON("https://xxxx?xx=xx&xx=xx&callback=?", function(data){
                console.log(data);
 });
Ajax是一种用于在网页上进行异步通信的技术,可以通过发送HTTP请求来获取数据或更新页面内容。然而,由于同源策略的限制,我们通常无法直接在网页上通过Ajax请求跨域的资源,包括本地的JSON文件跨域请求本地的JSON文件并不常见,因为同源策略主要用于防止恶意行为和安全问题。但是有时我们可能遇到需要跨域请求本地JSON文件的情况,例如在开发过程中需要模拟服务器返回的数据。 要实现跨域请求本地的JSON文件,可以通过以下几种方式: 1. JSONPJSON with Padding) JSONP是一种通过动态创建<script>标签,实现跨域访问的方法。在本地JSON文件中,我们可以通过在JSON数据外面包裹一个函数调用来返回数据。 例如,在本地JSON文件中添加如下代码: ```javascript jsonpCallback({"name": "John", "age": 25}); ``` 然后在网页上使用Ajax请求: ```javascript function jsonpCallback(data) { console.log(data); } var script = document.createElement('script'); script.src = 'local.json?callback=jsonpCallback'; document.body.appendChild(script); ``` 这样就可以通过JSONP方式跨域请求并获取本地的JSON数据。 2. CORS(Cross-Origin Resource Sharing) CORS是一种通过在服务器端设置响应头来实现跨域访问的方法。在本地JSON文件中,我们需要在服务器端设置Access-Control-Allow-Origin响应头,允许指定域名的跨域请求。 例如,在服务器端的响应头中添加如下代码: ```javascript Access-Control-Allow-Origin: http://example.com ``` 然后在网页上使用Ajax请求: ```javascript var xhr = new XMLHttpRequest(); xhr.open('GET', 'local.json', true); xhr.onreadystatechange = function() { if (xhr.readyState === 4 && xhr.status === 200) { var data = JSON.parse(xhr.responseText); console.log(data); } }; xhr.send(); ``` 这样就可以通过CORS方式跨域请求并获取本地的JSON数据。 总结:通过使用JSONPCORS方式,我们可以实现跨域请求本地的JSON文件JSONP通过创建<script>标签,而CORS则通过在服务器端设置响应头,使得跨域请求合法化。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值