最近做了一个Ajax提交反馈页,但是由于空间不支持一些基本的函数,所以准备做个跨域提交。
javascript部分:
$("#btn").click(function(k) { //... var j = form.serializeArray();//序列化name/value $.ajax({ url: "另一个域名/test.php", dataType: 'jsonp', data: j, jsonp: 'jsonp_callback', success: function(json) { //返回的json数据 json = json || {}; if (json.msg=='err'){ alert(json.info); }else if (json.msg=="ok"){ alert('提交成功'); }else{ alert('提交失败'); } }, timeout: 3000 }) //... });
php部分:
$jsonp_callback=$_GET['jsonp_callback']; //... //如果正确 echo $jsonp_callback,'({"msg":"ok"})'; //如果错误 echo $jsonp_callback,'({"msg":"err","info":"因人品问题,发送失败"})'; //...
值得注意的是采用jsonp 方式,beforeSend / error 都不能用了,所以beforeSend里面用js实现的验证只能用ajax在服务器端test.php上面验证了。
在PHP文件如何得到提交的数据呢?接着序列化。
@sean
序列化后URL类似:xxx.php?id=123&val=bbb
php只要$_GET['id'] 就OK了(id/val为表单的input的name).
你好,最近需要用到跨域提交,想了解下这块博主有没有什么安全方面的建议?
@Magento
跨域提交被利用的机会还是蛮大(jsonp其实是get方式),至于安全方面,主要还是在服务端考虑了,比如:$_SERVER['HTTP_REFERER']的判断(但REFERER这些可以伪造的),还有用addslashes过滤POST的字符串(这个比较重要),还有提交后写个cookies记录下(这个要看具体需求,可以简单的禁止重复提交之类的,但对于安全作用不大)。重要的数据最好不要跨域提交,跨域获取到无妨。
json = json || {}; 这种写法,和 eval(json); 有区别吗?
success:function(json) {
........
},
error:function(e){ //此处可以使用啊。你指的error是什么??
alert('请求异常');
}
timeout: 3000
success:function(json) { json是server返回的数据, 有可能返回json或string. 所以json = json || {}比较保险. 和eval完全不同的概念.
error:function(e){ 是请求server遇到错误触发, success:..里的是后端API验证数据不通过时返回的error msg.