我试图使用AJAX加载跨域HTML页面,但除非数据类型为“jsonp”,否则我无法得到响应。但是,使用jsonp时,浏览器需要脚本mime类型,但收到“text/html”
我的请求代码是:
$.ajax({
键入:“获取”,
url:“http://saskatchewan.univ-ubs.fr:8080/SASStoredProcess/do?_username=DARTIES3-2012&;u密码[email protected]&;\u计划=%2利用率%2灾难3-2012%2 Mon+档案%2分析\u dc&;annee=2012&;ind=V&;\u操作=执行”,
数据类型:“jsonp”,
}).成功(功能(数据){
$('div.ajax-field').html(数据);
});
有没有办法避免对请求使用jsonp?我已经尝试过使用crossDomain参数,但它不起作用
如果没有,是否有任何方法可以在jsonp中接收html内容?目前,控制台在jsonp回复中显示“意外<;”
jqueryajax注释
- 由于浏览器的安全限制,大多数Ajax请求受同源策略的约束;请求无法从其他域、子域、端口或协议成功检索数据
- 脚本和JSONP请求不受同源策略限制
有一些方法可以克服跨域障碍:
- CORS代理方案
- 规避同一原产地政策的方法
- 打破跨域壁垒
有一些插件可以帮助跨域请求:
- 使用YQL和jQuery的跨域AJAX请求
- 使用jQuery.ajax的跨域请求
抬起头
克服此问题的最佳方法是在后端创建您自己的代理,这样您的代理将指向其他域中的服务,因为在后端不存在同源策略限制。但如果在后端无法做到这一点,那么请注意以下提示
**警告**
使用第三方代理不是一种安全的做法,因为它们可以跟踪您的数据,因此它可以用于公共信息,但决不能用于私人数据
下面显示的代码示例使用jQuery.get()和jQuery.getJSON(),这两种方法都是jQuery.ajax()的速记方法
任何地方都可以
2021年更新
到2021年1月31日,公共演示服务器(cors anywhere.herokuapp.com)将非常有限
CorsAnywhere(corsAnywhere.herokuapp.com)的演示服务器就是这个项目的一个演示。但是滥用已经变得如此普遍,以至于演示所在的平台(Heroku)要求我关闭服务器,尽管已经做出了努力来阻止滥用。由于滥用及其流行,停机时间变得越来越频繁
为了解决这个问题,我将进行以下更改:
- 收费上限将从每小时200英镑降至每小时50英镑
- 到2021年1月31日,cors-anywhere.herokuapp.com将不再担任公开代理
- 从2月1日开始。2021年,cors-anywhere.herokuapp.com将仅在访问者完成挑战后提供请求:用户(开发人员)必须访问cors-anywhere.herokuapp.com上的页面,以临时解锁其浏览器的演示。这允许开发人员尝试该功能,以帮助决定是否自行托管或寻找替代方案
CORS Anywhere是一个node.js代理,它将CORS头添加到代理请求中。
要使用API,只需在URL前面加上API URL。(支持https:请参阅github存储库)
如果要在需要时自动启用跨域请求,请使用以下代码段:
$.ajaxPrefilter(功能(选项){
if(options.crossDomain&;jQuery.support.cors){
var http=(window.location.protocol=='http:'?'http:':'https:');
options.url=http+'//cors anywhere.herokuapp.com/'+options.url;
//options.url=";http://cors.corsproxy.io/url=";+options.url;
}
});
美元(
'http://en.wikipedia.org/wiki/Cross-origin_resource_sharing',
功能(响应){
控制台日志(响应);
$(“查看器”).html(响应);
});
无论起源如何
无论来源是什么,都是跨域jsonp访问。这是anyorigin.com的开源替代品
要从google.com获取数据,您可以使用以下代码段:
//最好指定所需的字符集。
//您可以使用所需的字符集而不是utf-8。
//有关scriptCharset和contentType选项的详细信息,请参见:
// http://api.jquery.com/jQuery.ajax/#jQuery-ajax设置
$.ajaxSetup({
scriptCharset:“utf-8”,//或“ISO-8859-1”;
contentType:“application/json;charset=utf-8”;
});
$.getJSON('http://whateverorigin.org/get?url=' +
编码元件('http://google.com“)+”&;callback=?”,
功能(数据){
控制台日志(数据);
//如果预期的响应是文本/纯文本
$(“查看器”)html(data.contents);
//如果预期的响应是JSON
//var响应=$.parseJSON(data.contents);
});
CORS代理
CORS代理是一个简单的node.js代理,用于为任何网站启用CORS请求。
它允许站点上的javascript代码访问其他域上的资源,这些域通常由于同源策略而被阻止
- CORS代理gr2m
- 科尔斯·马杜拉姆代理酒店
它是如何工作的?
CORS代理利用了跨源资源共享,这是与HTML5一起添加的一项功能。服务器可以指定他们希望浏览器允许其他网站请求他们托管的资源。CORS代理只是一个HTTP代理,它在响应中添加了一个标题,上面写着;任何人都可以要求这个
这是实现目标的另一种方式(见www.corsproxy.com)。您只需从代理的URL中删除http://和www.,然后在URL前面加上www.corsproxy.com/
$。获取(
'http://www.corsproxy.com/' +
“en.wikipedia.org/wiki/Cross-origin\u resource\u sharing”,
功能(响应){
控制台日志(响应);
$(“查看器”).html(响应);
});
CORS代理浏览器
最近我发现了这个,它涉及各种面向安全的跨源远程共享实用程序。但它是一个以Flash为后端的黑匣子
您可以在这里看到它的作用:CORS代理浏览器
在GitHub上获取源代码:koto/cors代理浏览器