当前位置: 首页 > 面试题库 >

使用jQuery AJAX加载跨域终结点

申屠黎昕
2023-03-14
问题内容

我正在尝试使用AJAX加载跨域HTML页面,但除非dataType为“
jsonp”,否则无法获得响应。但是,使用jsonp时,浏览器期望使用脚本mime类型,但接收到“ text / html”。

我的请求代码是:

$.ajax({
    type: "GET",
    url: "http://saskatchewan.univ-ubs.fr:8080/SASStoredProcess/do?_username=DARTIES3-2012&_password=P@ssw0rd&_program=%2FUtilisateurs%2FDARTIES3-2012%2FMon+dossier%2Fanalyse_dc&annee=2012&ind=V&_action=execute",
    dataType: "jsonp",
}).success( function( data ) {
    $( 'div.ajax-field' ).html( data );
});

有什么方法可以避免对请求使用jsonp吗?我已经尝试使用crossDomain参数,但是没有用。

如果没有,有什么办法可以接收jsonp中的html内容?当前,控制台在jsonp回复中说“意外<”。


问题答案:

jQuery Ajax笔记
由于浏览器安全性的限制,大多数Ajax请求都遵循相同的原始策略;该请求无法成功从其他域,子域,端口或协议检索数据。
脚本和JSONP请求不受相同的原始策略限制。
有一些方法可以克服跨域障碍:

  • CORS代理替代
  • 规避原产地政策的方法
  • 打破跨领域障碍

有一些插件可帮助处理跨域请求:

  • 带有YQL和jQuery的跨域AJAX请求
  • 使用jQuery.ajax的跨域请求

当心!

克服此问题的最佳方法是,在后端创建自己的代理,以便你的代理将指向其他域中的服务,因为在后端中不存在相同的原始策略限制。但是,如果你不能在后端执行此操作,请注意以下提示。

警告!
使用第三方代理不是安全的做法,因为它们可以跟踪你的数据,因此可以与公共信息一起使用,但绝不能与私有数据一起使用。

下面显示的代码示例使用jQuery.get()和jQuery.getJSON(),它们都是jQuery.ajax()的简写方法

任何地方的CORS

CORS Anywhere是一个node.js代理,它将CORS标头添加到代理请求中。
要使用API​​,只需在URL前面加上API URL。(支持https:见github仓库)

如果要在需要时自动启用跨域请求,请使用以下代码段:

$.ajaxPrefilter( function (options) {
  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;
  }
});

$.get(
    'http://en.wikipedia.org/wiki/Cross-origin_resource_sharing',
    function (response) {
        console.log("> ", response);
        $("#viewer").html(response);
});

无论起源

无论起源如何,都是跨域jsonp访问。这是anyorigin.com的开源替代方案。

要从google.com获取数据,你可以使用以下代码段:

// It is good specify the charset you expect.
// You can use the charset you want instead of utf-8.
// See details for scriptCharset and contentType options: 
// http://api.jquery.com/jQuery.ajax/#jQuery-ajax-settings
$.ajaxSetup({
    scriptCharset: "utf-8", //or "ISO-8859-1"
    contentType: "application/json; charset=utf-8"
});

$.getJSON('http://whateverorigin.org/get?url=' + 
    encodeURIComponent('http://google.com') + '&callback=?',
    function (data) {
        console.log("> ", data);

        //If the expected response is text/plain
        $("#viewer").html(data.contents);

        //If the expected response is JSON
        //var response = $.parseJSON(data.contents);
});

CORS代理

CORS Proxy是一个简单的node.js代理,可为任何网站启用CORS请求。它允许你站点上的javascript代码访问其他域上的资源,这些资源通常由于同源策略而被阻止。

  • CORS代理gr2m
  • CORS代理rmadhuram

它是如何工作的?CORS Proxy利用了跨域资源共享功能,该功能是随HTML 5一起添加的。服务器可以指定它们希望浏览器允许其他网站请求其托管的资源。CORS代理只是一个HTTP代理,它在响应中添加一个标头,说“任何人都可以请求”。

$.get(
    'http://www.corsproxy.com/' +
    'en.wikipedia.org/wiki/Cross-origin_resource_sharing',
    function (response) {
        console.log("> ", response);
        $("#viewer").html(response);
});

CORS代理浏览器
最近,我发现了这个,它涉及各种面向安全性的跨源远程共享实用程序。但这是一个以Flash为后端的黑盒子。



 类似资料:
  • 问题内容: 我正在尝试使用AJAX加载跨域HTML页面,但是除非dataType为“jsonp”,否则无法获得响应。但是,使用jsonp时,浏览器期望使用脚本mime类型,但接收到“ text / html”。 我的请求代码是: 有什么方法可以避免对请求使用jsonp吗?我已经尝试使用crossDomain参数,但是没有用。 如果没有,有什么办法可以接收jsonp中的html内容?当前,控制台在j

  • 问题内容: Firefox存在一个长期存在的问题,即不加载与当前网页不同来源的字体。通常,在CDN上提供字体时会出现问题。 随着Amazon S3 CORS的推出,是否存在使用CORS解决Firefox中字体加载问题的解决方案? 编辑:非常高兴看到S3 CORS配置的示例。 edit2:我找到了一个可行的解决方案,但实际上并没有理解它的作用。如果任何人都可以提供有关配置的更详细的解释以及亚马逊解释

  • 我正在尝试使用Struts 2和jQuery构建Web应用程序。 在改变下拉列表时,我需要从数据库中获取详细信息。在我的< code>struts.xml配置中,我将方法和操作定义如下: 当我在所有相应位置进行更改后执行应用程序时,请求被传递给 类和 DAO 方法,并且控件成功返回到屏幕。但是返回的数据在屏幕上不可用,我收到一条错误消息: url…404未在jQuery中找到(匿名函数)ajax。

  • 本文向大家介绍javascript使用链接跨域下载图片,包括了javascript使用链接跨域下载图片的使用技巧和注意事项,需要的朋友参考一下 前言 图片是最常见的静态资源文件,可以从本地、外链获取图片,或者使用base64码展示。而canvas的toDataUrl() API可以将图片转base64码,然后模拟点击事件即可下载图片。 外链下载 在本地或者网站下载外链url图片时涉及到跨域,跨域会

  • 问题内容: 我正在支持cookie的浏览器(IE以外的任何人)上用localStorage替换cookie。问题是_site.com_和www。site.com存储它们自己的单独的localStorage对象。我认为www被视为一个子域(如果您问我这是一个愚蠢的决定)。如果用户最初在 site.com上并决定输入 www 。下次访问 _site.com_时,将无法访问她的所有个人数据。如何使我的所

  • 如何通过跨域加载函数获得超文本标记语言元素?. load函数很完美,但是我不知道如何丰富单个元素的价值? 超文本标记语言代码从我想得到的值: 其他服务器上其他HTML页面上的My JS(可以正常工作):