我的代码在同一个域中运行良好
但是当我使用dataType:'jsonp'&跨域:true
代码示例-
var fa = new FormData();
fa.append("upload_pass", document.getElementById("upload_pass").files['0']);
$.ajax({
url: 'http://xxx.xx.xx.xx/upload.php',
data: fa,
contentType: false,
processData: false,
dataType: 'jsonp',
crossDomain: true,
type: 'GET',
success: function(data) {
alert(data);
}
});
是否存在概念上的理解差距或编码问题
请提出建议。
无法通过GET上传文件。即使您将使用JSONP。JSONP只处理GET请求。并且您不能使用GET请求上传文件(通常使用POST请求上传文件)。
若你们想发送跨域POST请求到某个服务器,那个么你们应该在下一种情况下确定:
该服务器应该向您发送标头Access-Control-Allow-Origin : *
。此外,您可能需要Access-Control-Allow-Methods: POST
标头。
如果它有这些头,那么你很幸运,你可以在这个服务器上发布你的数据。
附言:您可以尝试使用其他方法进行有效的跨域请求。很好的js库easyXDM用于跨域请求,witch使用不同的方法来实现。
JSONP和CORS完全是两种不同的东西。
JSONP
带有填充的JSON只是利用下载javascript文件时没有同源策略限制这一事实进行的黑客攻击。由于您只能下载脚本,因此我们使用内置的数据格式JSON,而不是XML或HTML。此外,您只能使用JSONP发出GET请求,因为它所做的只是创建一个script
,其中src
设置为其他域,并将其附加到您的DOM中,一旦下载,就会执行它,也就是说,我们的回调用于从传递JSON对象的原始域调用代码。
CORS
跨源资源共享是W3C的一项标准,它允许从另一个域请求网页上的许多资源(例如字体、JavaScript等)。您不仅限于使用GET,还可以使用所有常见的HTTP方法,如POST、HEAD、PUT、DELETE和其他
如何提出CORS请求:
这很简单,只需将AJAX调用中的url更改为其他域,客户端就不会进行其他更改
如果您的浏览器支持CORS,那么根据请求的类型(简单/复杂),可能会触发飞行前OPTIONS请求,以获取有关哪种类型的方法的信息;此域允许使用内容类型,并且将缓存此OPTIONS响应。
接下来,每当您对其他域进行AJAX调用时,在后台,浏览器都会发送一个Origin
请求头。例如,如果谷歌的一个页面对facebook进行AJAX调用,那么类似这样的内容就会添加到请求头中
Origin: http://google.com
当脸书看到这个标题时,它会检查谷歌网站是否在他们允许的主机的有效列表中,并通过发送以下标题作为回应来同意这一点。
Access-Control-Allow-Origin: http://google.com
请注意,Origin和Allow Origin头中的主机名应该匹配,以便浏览器接受并根据收到的响应采取行动。你甚至可以限制方法&通过在响应中设置以下标头允许的自定义标头
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: X-PINGOTHER
最后,为了回答您的问题,请更改您的Ajax定义,如下所示
$.ajax({
url: 'http://some-other-domain.com/upload.php',
data: fa,
contentType: false,
processData: false,
type: 'POST',
success: function(data) {
alert(data);
}
});
由于您只是对文件进行简单的POST调用,所以这是一个简单的请求,所以Allow Origin头就足够了。在您的PHP中,读取Origin
标头,检查它是否在您的列表中,并在Allow Origin响应标头中设置相同的标头值。我不知道PHP,但希望它是这样的:)
<?php
$headers = apache_request_headers();
foreach ($headers as $header => $value) {
if($header == "Origin"){
/* check if $value is in your list
if yes, set the response header */
header('Access-Control-Allow-Origin: $value');
/* adding just this header will allow any method from this
domain, in case you need to allow only POST method add
Access-Control-Allow-Methods header as well */
break;
}
}
// do the remaining processing of request
?>
上的更多资源
- CORS的历史
- CORS上的5分钟视频
- 针对复杂CORS请求的飞行前请求
希望这能回答您的问题:)
除了GET,您不能使用JSONP进行任何类型的请求。您不能使用GET请求上传文件(除非它是一个非常小的文件,可以用JavaScript读取并转换为可以被视为常规表单数据的字符串)。
您需要切换到使用带有CORS的POST(或同一原点上的代理)来禁用同一原点策略。
对于跨域工作,您需要这些东西-
1:-您需要服务器的权限。类似访问控制允许来源:*。
2:-如果您使用的是jquery,那么您可以使用jsonp方法。
3:-如果你想使用纯javascript,那么你可以使用这个链接-
如何在没有JQuery的情况下从Javascript发出JSONP请求?
正如人们所说的那样,GET不是实现这一目标的方法。我见过这种事情是通过隐藏的iFrame完成的。您可能可以找到各种jQuery插件来实现所需的结果,但我发现了一个名为"jQuery iFrame Transport"的插件
https://cmlenz.github.io/jquery-iframe-transport/
希望这会对你有所帮助。
您不能使用JSONP或GET请求上传文件。你确定它早些时候对同一来源有效吗?
您必须发送跨域XHR请求才能上传文件。您可以使用JQuery文件上传。https://github.com/blueimp/jQuery-File-Upload/wiki/Cross-domain-uploads