jQuery异步请求(如getJSON)跨域解决方案
相信大家在使用jQuery异步请求非自己网站内相对资源(通过别人站点上的URL直接读取)使经常会遇到如下错误吧,实际上这些错误都是浏览器安全机制“搞的鬼”,才让我们开发路上遇到了拦路虎。
当你直接在浏览器中请求:“http://www.weather.com.cn/adat/sk/101110101.html”时会得到你需要的json数据。
当你通过jQuery的getJSON方法读取时你就会得到下列错误。
Chrome提示错误:
XMLHttpRequest cannot load http://www.weather.com.cn/adat/sk/101110101.html. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.
火狐提示错误:
已阻止跨源请求:同源策略禁止读取位于 http://www.weather.com.cn/adat/sk/101110101.html 的远程资源。(原因:CORS 头缺少 'Access-Control-Allow-Origin')。
理解跨域首先必须要了解同源策略。同源策略是浏览器上为安全性考虑实施的非常重要的安全策略。
- 何谓同源: URL由协议、域名、端口和路径组成,如果两个URL的协议、域名和端口相同,则表示他们同源。
- 同源策略: 浏览器的同源策略,限制了来自不同源的"document"或脚本,对当前"document"读取或设置某些属性。从一个域上加载的脚本不允许访问另外一个域的文档属性。
如果是自己开发的网站那就很简单,只需要在后台(C#)输出json的同时给Response增加一个Header头,开启允许跨域请求就可以完美的解决该问题。
C#后台只需要增加如下一句话即可:
Response.AddHeader("Access-Control-Allow-Origin", "null");
如果是别人网站就没有办法了,只能借助后台进行处理,毕竟C#读取是不存在跨域问题的。C#读取之后,后台进行转换增加如上的响应头后输出,这样就可以跨域了。
该灵感源自:“eezzo.com”给我的。
当然对于那些无法自行开发的站长而言,可以直接调用eezzo.com的API进行直接转换,这样我们就可以完美的解决jQuery在浏览器跨域请求时的问题了。下边贴出代码:
$(document).ready(function() {
//测试跨域请求连接
var requestUrl = "http://www.weather.com.cn/adat/sk/101110101.html";
//这里一定要注意,实际请求的url其实是以参数形式从eezzo.com读取的,因此我们都要对url进行编码,使用encodeURI方法即可
$.getJSON("http://eezzo.com/API/CD", { url: encodeURI(requestUrl) }, function(json) {
alert(json);
});
});
通过以上代码我们就可以轻松的获取各大网站提供的API数据了。通过跟踪得到实例所读取的json数据如下:
实现跨域有2种方法:
1、通过自己自行编写代码实现;
2、通过eezzo.com提供的API直接进读取,毕竟拿来主义还是比较靠谱的
下边是测试中用到的获取天气json数据的一些资料
C# 获取天气 JSON解析 http://blog.csdn.net/ecocn/article/details/8542152
天气预报接口|API|城市代码 http://blog.csdn.net/a535537066/article/details/6656365
jQuery异步请求(如getJSON)跨域解决方案的更多相关文章
- [ 转 ]jquery的ajax和getJson跨域获取json数据
目前浏览器端跨域访问常用的两种方法有两种: 1.通过jQuery的ajax进行跨域,这其实是采用的jsonp的方式来实现的. jsonp是英文json with padding的缩写.它允许在服务器端 ...
- jquery的ajax和getJson跨域获取json数据
目前浏览器端跨域访问常用的两种方法有两种: 1.通过jQuery的ajax进行跨域,这其实是采用的jsonp的方式来实现的. jsonp是英文json with padding的缩写.它允许在服务器端 ...
- ajax异步请求/同源策略/跨域传值
基本概念 Ajax 全称是异步的 JavaScript 和 XML . 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进 ...
- jquery 请求apache solr 跨域解决方案
<script type="text/javascript" src="js/jquery-1.7.2.min.js"></script> ...
- jQuery中getJSON跨域原理详解
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp28 jQuery中getJSON跨域原理详解 前几天我再开发一个叫 河蟹工 ...
- 上传文件,使用FormData进行Ajax请求,jsoncallback跨域
通过传统的form表单提交的方式上传文件: <form id= "uploadForm" action= "http://localhost:8080/cfJAX_ ...
- asp.net web api2.0 ajax跨域解决方案
asp.net web api2.0 ajax跨域解决方案 Web Api的优缺点就不说了,直接说怎么跨域,我搜了一下,主要是有两种. 一,ASP.NET Web API支持JSONP,分两种 1, ...
- 常见跨域解决方案以及Ocelot 跨域配置
常见跨域解决方案以及Ocelot 跨域配置 Intro 我们在使用前后端分离的模式进行开发的时候,如果前端项目和api项目不是一个域名下往往会有跨域问题.今天来介绍一下我们在Ocelot网关配置的跨域 ...
- 第十四节:Asp.Net Core 中的跨域解决方案(Cors、jsonp改造、chrome配置)
一. 整体说明 1. 说在前面的话 早在前面的章节中,就详细介绍了.Net FrameWork版本下MVC和WebApi的跨域解决方案,详见:https://www.cnblogs.com/yaope ...
随机推荐
- javascript数组排序---2冒泡
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 使用sphinx索引mysql数据
数据库表如下 mysql> select * from tb_account; +----+-------+------+ | id | name | age | +----+-------+- ...
- opacity在IE6~8下无效果,解决的办法
opacity在IE6~8下无效果,解决的办法 问题出现时rgba()在ie6下不出效果,最后查到是opacity的问题. opacity是css3时出现的,目前主流浏览器都支持.but老IE是个麻烦 ...
- hive join 优化
common join : 即reducer join,瓶颈在shuffle阶段,会产生较大的网络io: map join:即把小表放前面,扫描后放入每个节点的内存,在map阶段进行匹配: 开启map ...
- idea15破解
注册方法: 注册码可以沿用14的,只是在 注册时选择 License server ,填 http://idea.lanyus.com ,然后点击 OK 14的话,网上可以找到一个,根据你的用户名 ...
- MMDrawerController 的实践,已经实现,几行简单的代码实现侧栏
学习方法,看readme,看给的Demo 看功能怎么实现的去模仿,个人感觉模仿是最快的学习方法 废话少说,上代码 导入MMDrawerController框架我就不多少了,之后做什么才是我们才关注的事 ...
- python学习之 dictionary 、list、tuple操作
python 内置类型数据 有dictionary(字典).list(列表)和tuple(元组) 一.Dictionary Dictionary 是 Python 的内置数据类型之一,它定义了键和值之 ...
- rsa 密钥和公钥的生成
openssl genrsa -out prikey.pem openssl rsa -in prikey.pem -pubout -out pubkey.pem
- Word2Vec在Tensorflow上的版本以及与Gensim之间的运行对比
接昨天的博客,这篇随笔将会对本人运行Word2Vec算法时在Gensim以及Tensorflow的不同版本下的运行结果对比.在运行中,参数的调节以及迭代的决定本人并没有很好的经验,所以希望在展出运行的 ...
- MVC进阶之路:依赖注入(Di)和Ninject
MVC进阶之路:依赖注入(Di)和Ninject 0X1 什么是依赖注入 依赖注入(Dependency Injection),是这样一个过程:某客户类只依赖于服务类的一个接口,而不依赖于具体服务类, ...