跨域怎么通过POST方式传数据
如上所说 jsonp
为 get
方式
有一个思路是 先发送到同域名的某个方法下 如www.a.com/a.php
之后通过 a.php
文件 CURL
到接口文件请求数据
跨域可以直接使用 hprose-html5,简单方便,支持的语言多。
nginx转代为同域名才是最终解决办法,CORS的一个致命的缺点就是AJAX不会把cookie中session id也发过去,于是很多事情干不了。
没懂,POST不本来就是跨域的吧,用表单提交不行吗?
跨域访问使用JSONP,是支持JSON格式的非官方跨域交互协议,很好用
下面展示一个使用JSONP协议访问豆瓣API,并渲染页面的过程
$.ajax({
url:'https://api.douban.com/v2/movie/subject/'+movie_id;
cache:true,
type:get, //你可以换成post,这个看接口
jsonp:'callback',
crossDomain:true,
success:function(data){
$('#inputTitle').val(data.title);//用获取到的对象属性给文本框赋值
}
})
jsonp
是get
请求
可参考这篇文章 http://div.io/topic/1103
JSONP好像是这样的
已经说了很多次,地球上解决跨域问题,最好的方法是使用Apache做转发。
这里的原理比较详细:链接描述
ajax封装的jsonp,或者自己用原生的方法实现
AJAX中XMLHttpRequest(XHR)受浏览器同源策略限制,要解除限制,可以设置CORS头(Access-Control-Allow-Origin)或者使用GET实现的JSONP.
值得注意的是,直接通过FORM表单提交的POST/GET请求并不会被浏览器同源策略限制,这也是为什么要设置csrf_token防范CSRF攻击.
为啥不用nginx直接做一个转发?性能好,还能监控,还能控制行为。
http://a.com/123.html
<iframe name="test" style="display:none;"></iframe>
<form method="post" action="http://b.com/456.php" target="test">
<input type="text" value="hello" />
<input type="submit" value="gooooo" />
</form>
<script>
function callback(){
alert('POST完成, 并触发回调了!!!!');
}
</script>
http://b.com/456.php
php
<?php //做你打算做的事情 header('http://a.com/callback.php?data=你想要传回去的内容');
http://a.com/callback.php
php
<?php //这里爱怎么写怎么写, 反正只要用 parent 就可以访问到 `123.html` 页面中的内容了. echo '<script>parent.callback()</script>';
关键点: b.com
在处理完成后, 使用302
跳到 a.com
下的回调页面, 由a.com
输出js代码,
触发主页面中相关的js,来完成回调.
因为iframe
最终加载的是 a.com
下的内容, 所以js可以通过 parent
来访问 123.html
中的js代码.
如果你的 b.com
不可控, 那你还是可以完成POST
提交, 只是没办法得到结果而已(跨域).
至于 b.com
跳到a.com
的回调页面时的安全问题, 建议双方协商已知的key, 然后对回传的数据进行加密, 然后a.com
在接收之后,进行解密,得到内容.以防止被其他人篡改数据,导致安全问题.
Cross-Origin Resource Sharing 跨域资源共享
Cross-Origin Resource Sharing,跨域资源共享,简称 CORS。CORS系统定义了一种浏览器和服务器交互的方式来确定是否允许跨域请求。跨域资源共享是一种网络浏览器的技术规范,它为Web服务器定义了一种方式,允许网页从不同的域访问其资源。
简言之,CORS就是为了让AJAX可以实现可控的跨域访问而生的。
由于有同源策略,跨域请求是被禁止。
我们需要在服务器端设置允许不同域的请求。
Apache配置方法
Apache需要使用mod_headers
模块来激活HTTP头的设置,它默认是激活的。你只需要在Apache配置文件的<Directory>
,<Location>
,<Files>
或<VirtualHost>
的配置里加入以下内容即可
Header set Access-Control-Allow-Origin *
PHP配置方法
header("Access-Control-Allow-Origin:*");
以上的配置的含义是允许任何域发起的请求都可以获取当前服务器的数据。当然,这样有很大的危险性
,恶意站点可能通过XSS攻击我们的服务器。所以我们应该尽量有针对性地设置安全的来源,例如下面的设置使得只有http://www.shihj.com
这个域才能跨域访问服务器的API。
header("Access-Control-Allow-Origin:http://www.shihj.com");
对于通配符*
,它可以直接Access-Control-Allow-Origin:*
这样使用,但它是不允许通配子域名的,如:Access-Control-Allow-Origin:*.shihj.com
。
jsonp是get
可以试试cros
js的安全策略里有提到为了安全考虑,在js代码中不能对其他域名的js脚本进行调用,跨域一般用jsonp. jquery的$.ajax的jsonp 是get方式。 原理就是动态引入script标签,而script标签的src是可以跨域的,指定一个服务端的程序url,比方是一PHP文件, 在PHP文件里输出你本地函数的调用.