javascript跨域请求解决方案

前言


  • 对于很多前端或者做混合开发的同学,我们难免会遇到跨域发起请求业务,比如A站点向B站点请求数据等等。由于最近要做一个站点集群的项目,所以具体业务要求很多个站点之间的消息推送,所以难免要做跨域请求。
  • 这两天我在度娘上面用 “javascript php 跨域 ajax”等关键字找了好几遍,发现真的没有一篇博客写出一个具体的解决方案(ps.最多的方案基本都是选择jsonp,我相信get满足不了大家的吧?),所以我觉得总结一下我自己遇到的坑(其实是自己修炼不够,我会乱说?),以后少走弯路。

跨域方案


下面是我这几天摸索出来的一些具体的解决方案,大家可以参照自己的具体业务逻辑来选用不同的解决方案。
### jsonp
***

  • 我知道程序员都是猴急的人(摆脱不了猿类的本性 - -!),所以按照惯例我们先贴代码:
  • 客户端:
		$.post('http://a.com',//接口URL地址
{
"username":"张三"//这里写你向服务器端发送的数据
},
function(data){
console.log(data);
//回调,这里是服务器端返回的数据
//这就是普通的json了
},'jsonp');
  • 服务器端:
		 $callback = $_GET['callback'];
$username = $_GET['usernae'];
if(!empty($callback)){
$data = $username;//这是你业务逻辑处理好的数据,一般是个数组
header('Content-Type:Application/json;charset=utf-8');//必须设置
echo $callback.'('.json_encode($data).')';
exit();
}else{
exit('Access Denied!');//异常抛错
}
  • jsonp不管你用什么方式传送,实际都是get请求,所以大小有限制。
  • get请求是明文请求,除非我们加密,不然请求内容一目了然
  • 在服务器端里面callback必须有,因为jsonp的机制其实是在请求后面加了callback的get请求
  • ajax(jsonp的另外一种写法)


    • 按照管理先抛代码,客户端:
    	$.ajax({
          url: 'http://example.com',//请求地址
          type: 'POST',
          data: { id: idValue },
          //调小超时时间会引起异常
          timeout: 3000,
          //请求成功后触发
          dataType:jsonp,
          success: function (data) { show.append('success invoke!' + data+'
    '); },
          //请求失败遇到异常触发
          error: function (xhr, errorInfo, ex) { show.append('error invoke!errorInfo:' + errorInfo+'
    '); },
          //完成请求后触发。即在success或error触发后触发
          complete: function (xhr, status) { show.append('complete invoke! status:' + status+'
    '); },
          //发送请求前触发
          beforeSend: function (xhr) {
          //可以设置自定义标头
          xhr.setRequestHeader('Content-Type', 'application/xml;charset=utf-8');
          show.append('beforeSend invoke!' +'
    ');
          },
          //是否使用异步发送
          async: true
        })
    • 服务器端代码跟第一种写法一样

    cors


    • 我相信很多人跟我一样,找跨域的相关资料的时候,大神们总是摔下一句“CORS Can Solve It!”然后就没有下文了,国内文档更是是说一个单词“CORS!”,好吧,像我这样的小白找半天,终于找到找好梯子,自行google到cors的具体用法,如下:
    • 客户端:
    function test(){
    var xhr = new XMLHttpRequest();
    xhr.open("POST", "http://www.example.com", true);
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    textdata = {
    "username":"张三",
    "num":"1",
    "sex":"boy"
    };
    var testdata = JSON.stringify(textdata);
    var getdata = "data=" + testdata;
    xhr.send(getdata);
    xhr.onreadystatechange = function() {
    //如果执行状态成功,那么就把返回信息写到指定的层里
    if (xhr.readyState == 4 && xhr.status == 200) {
    var data = xhr.responseText;
    $obj = eval('(' + data + ')');
    console.log($obj);
    }
    }
    }
    • 服务器端:
    public function test(){
    $data = $_POST['data'];//接收POST数据
    $jsonData = json_decode($data,true);//把接收到的数据封装成数组形式
    //查看是否已经存在当前用户
    //$name = $jsonData['uuid']; //调取相应数据
    $outputdata['status'] = $jsonData;
    $this->ajaxReturn($outputdata);//我这里是thinkphp框架封装好的返回调用
    }
    • 注意事项:
    	 1.在服务器端里面加上请求头部信息:header('Access-Control-Allow-Origin: *');,允许任何站点访问,这里也可设置只允许某一个站点跨域访问。
    2.还需要注意的是,在客户端需要先把数据变成json字符串形式在传到服务器端。

    总结

    • 以上就是javascript跨域请求的全部内容。
    • 如果有任何疑问或者建议,请联系作者的个人邮箱(dream_zk2014@sohu.com)
    • 转发请注明出处 dreamzk.cn

    thinkphp,javascript跨域请求解决方案的更多相关文章

    1. cors跨域和jsonp劫持漏洞 和 同源策略和跨域请求解决方案

      cors跨域和jsonp劫持漏洞: https://www.toutiao.com/a6759064986984645127/ 同源策略和跨域请求解决方案:https://www.jianshu.co ...

    2. ajax跨域请求解决方案

      大家好,今天我们学习了js的跨域请求的解决方案,由于JS中存在同源策略,当请求不同协议名,不同端口号.不同主机名下面的文件时,将会违背同源策略,无法请求成功!需要进行跨域处理! 方案一.后台PHP进行 ...

    3. Javascript 跨域访问解决方案 总结

      在客户端编程语言中,如javascript和ActionScript,同源策略是一个很重要的安全理念,它在保证数据的安全性方面有着重要的意义.同 源策略规定跨域之间的脚本是隔离的,一个域的脚本不能访问 ...

    4. js跨域请求解决方案

      什么是跨域? 跨域是指一个域下的文档或脚本试图去请求另一个域下的资源,这里跨域是广义的. 广义的跨域: 1.) 资源跳转: A链接.重定向.表单提交 2.) 资源嵌入: <link>.&l ...

    5. 优雅绝妙的Javascript跨域问题解决方案

      关于Javascript跨域问题的解决方案已在之前的一片文章中详细说明,详见:http://blog.csdn.net/sfdev/archive/2009/02/13/3887006.aspx: 除 ...

    6. thinkphp 设置跨域请求

      场景:我的本地网页服务器无法访问本地的接口服务器接口提示一下错误:大致意思是:是一个跨域请求我的没有访问该地址的权限(接口服务器采用的是PHP编写) XMLHttpRequest cannot loa ...

    7. Javascript跨域请求的几种解决方法

      什么情况下才会出现跨域? 假设域名是:http://www.example.com.cn/ 如果所请求的域名跟这个域名不致,这种情况就是跨域,由于跨域存在漏洞,所以一般来说正常的跨域请求方式是请求不到 ...

    8. jquery跨域请求解决方案(我们寻找,我还没有添加验证)

      http://www.3lian.com/edu/2014/02-10/127921.html 本篇文章仅仅要是对jquery ajax跨域解决方法(json方式)进行了介绍,须要的朋友能够过来參考下 ...

    9. javascript 跨域请求详细分析(终极跨域解决办法)

      自从我接触前端以来,接手的项目里面很大部分都是前后端分离的,后端只提供接口,前端根据后端接口渲染出实际页面.个人觉得这是一个挺好的模式,前后端各自负责各自的模块,分工明确,而且也给前端更大的发挥空间. ...

    随机推荐

    1. C# 动态执行批处理命令

      本文转载:http://www.cnblogs.com/lenic/p/4097045.html C# 动态执行一系列控制台命令,并允许实时显示出来执行结果时,可以使用下面的函数.可以达到的效果为: ...

    2. RFID开发利器 proxmark3

      Proxmark3 介绍 Proxmark3是由Jonathan Westhues设计并且开发的开源硬件,其主要用RFID的嗅探.读取以及克隆等的操作.其官方网站为:Jonathan Westhues ...

    3. 数据结构之hash表

      哈希表是种数据结构,它可以提供快速的插入操作和查找操作.hash定义了一种将字符组成的字符串转换为固定长度(一般是更短长度)的数值或索引值的方法,称为散列法,也叫哈希法.由于通过更短的哈希值比用原始值 ...

    4. 05_android入门_GET方式实现登陆(在控件上显示服务端返回的内容)

      当点击登陆之后,怎么把server端返回的数据,写到指定的控件上尼?,在android怎么实现尼?以下我们通过详细的代码进行分析和实现,希望能对你,在学习android知识上有所帮助. 以下通过代码说 ...

    5. 无线网卡的查看与配置——iw,iwconfig,ethtool

      摘要:在linux上,我们经常需要把一台笔记本设置成一个共享wifi上网的路由器.如果我们需要把本机配置成一台无线AP,就需要查看网卡的相关信息和进行对应配置.其中iw.iwconfig和ethtoo ...

    6. oracle where 后面的条件中|| 是什么意思

      oracle where 后面的条件中|| 是连接符号,Oracle中另一个concat函数能够连接两个字符串 concat(a,b) Oracle中nvl函数的使用方法和作用是什么? 假设你某个字段 ...

    7. 【React Native 实战】旋转图片验证码

      1.前言蘑菇街用打乱方向的图片作为验证码,既起到了验证码的作用又宣传了图片,今天我们就用React Native来实现这样的功能. 2.属性 Image标签属性resizeMode enum('cov ...

    8. Android典型界面设计——ViewPage+Fragment实现区域顶部tab滑动切换

      一.问题描写叙述 本系列将结合案例应用,陆续向大家介绍一些Android典型界面的设计,首先说说tab导航,导航分为一层和两层(底部区块+区域内头部导航).主要实现方案有RadioGroup+View ...

    9. lambda形式(转)

      lambda语句被用来创建新的函数对象,并且在运行时返回它们. 使用lambda形式 #!/usr/bin/python# Filename: lambda.py def make_repeater( ...

    10. MySQL通用优化 叶金荣!!!

      http://mp.weixin.qq.com/s?__biz=MjM5NDE0MjI4MA==&mid=208777870&idx=1&sn=6efddd6283e4deb3 ...