thinkphp,javascript跨域请求解决方案
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!');//异常抛错
}
- 以上方案我是参照http://blog.chinaunix.net/uid-18899774-id-3915566.html的个人博客,他是解决extjs跨域问题,但是用在其他原生js亲试没有错误
- 注意事项
***
- 我知道程序员都是猴急的人(摆脱不了猿类的本性 - -!),所以按照惯例我们先贴代码:
- 客户端:
$.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!');//异常抛错
}
- 以上方案我是参照http://blog.chinaunix.net/uid-18899774-id-3915566.html的个人博客,他是解决extjs跨域问题,但是用在其他原生js亲试没有错误
- 注意事项
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跨域请求解决方案的更多相关文章
- cors跨域和jsonp劫持漏洞 和 同源策略和跨域请求解决方案
cors跨域和jsonp劫持漏洞: https://www.toutiao.com/a6759064986984645127/ 同源策略和跨域请求解决方案:https://www.jianshu.co ...
- ajax跨域请求解决方案
大家好,今天我们学习了js的跨域请求的解决方案,由于JS中存在同源策略,当请求不同协议名,不同端口号.不同主机名下面的文件时,将会违背同源策略,无法请求成功!需要进行跨域处理! 方案一.后台PHP进行 ...
- Javascript 跨域访问解决方案 总结
在客户端编程语言中,如javascript和ActionScript,同源策略是一个很重要的安全理念,它在保证数据的安全性方面有着重要的意义.同 源策略规定跨域之间的脚本是隔离的,一个域的脚本不能访问 ...
- js跨域请求解决方案
什么是跨域? 跨域是指一个域下的文档或脚本试图去请求另一个域下的资源,这里跨域是广义的. 广义的跨域: 1.) 资源跳转: A链接.重定向.表单提交 2.) 资源嵌入: <link>.&l ...
- 优雅绝妙的Javascript跨域问题解决方案
关于Javascript跨域问题的解决方案已在之前的一片文章中详细说明,详见:http://blog.csdn.net/sfdev/archive/2009/02/13/3887006.aspx: 除 ...
- thinkphp 设置跨域请求
场景:我的本地网页服务器无法访问本地的接口服务器接口提示一下错误:大致意思是:是一个跨域请求我的没有访问该地址的权限(接口服务器采用的是PHP编写) XMLHttpRequest cannot loa ...
- Javascript跨域请求的几种解决方法
什么情况下才会出现跨域? 假设域名是:http://www.example.com.cn/ 如果所请求的域名跟这个域名不致,这种情况就是跨域,由于跨域存在漏洞,所以一般来说正常的跨域请求方式是请求不到 ...
- jquery跨域请求解决方案(我们寻找,我还没有添加验证)
http://www.3lian.com/edu/2014/02-10/127921.html 本篇文章仅仅要是对jquery ajax跨域解决方法(json方式)进行了介绍,须要的朋友能够过来參考下 ...
- javascript 跨域请求详细分析(终极跨域解决办法)
自从我接触前端以来,接手的项目里面很大部分都是前后端分离的,后端只提供接口,前端根据后端接口渲染出实际页面.个人觉得这是一个挺好的模式,前后端各自负责各自的模块,分工明确,而且也给前端更大的发挥空间. ...
随机推荐
- Jdk和Jre目录和三个lib目录说明----外部扩展jar包servlet,mysql,oracle等
以下文章转载自a personal blog:For Future,因为昨天下午在cmd模式下编译servlet失败,后来在网上找到这篇文章帮我解决了该问题,我觉得挺值得收藏的,并且这篇文章对&quo ...
- Codeforces Gym 100231B Intervals 线段树+二分+贪心
Intervals 题目连接: http://codeforces.com/gym/100231/attachments Description 给你n个区间,告诉你每个区间内都有ci个数 然后你需要 ...
- Codeforces Round #312 (Div. 2) A. Lala Land and Apple Trees 暴力
A. Lala Land and Apple Trees Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/cont ...
- 编写高效的Android代码
编写高效的Android代码 毫无疑问,基于Android平台的设备一定是嵌入式设备.现代的手持设备不仅仅是一部电话那么简单,它还是一个小型的手持电脑,但是,即使是最快的最高端的手持设备也远远比不上一 ...
- PHP 页面编码声明方法(header或meta)
本文为大家介绍了二种页面编码的声明方法,一种是使用php中的header函数来向客户端发送header头,一种是使用html中的meta标签来生明页面编码,本文分别对他们如何使用进行了说明,感兴趣的同 ...
- Swift之UIBezierPath
使用UIBezierPath可以创建基于矢量的路径.使用此类可以定义简单的形状,如椭圆.矩形或者有多个直线和曲线段组成的形状等.主要用到的该类的属性包括 moveToPoint: //设置起始点 ad ...
- java实现迷宫算法--转
沿着所有方向进行探测,有路径则走,没有路径则从栈中回退. 回溯法是一种不断试探且及时纠正错误的搜索方法,下面的求解过程采用回溯法.从入口出发,按某一方向向前探索,若能走通(未走过的),即某处可以到达, ...
- UIButton设置了UIControlStateSelected和UIControlStateHighlighted状态的图片点击会闪烁的解决方案
[btn setBackgroundImage:img1 forState:UIControlStateSelected|UIControlStateHighlighted]; [btn setIma ...
- (转)从Membership 到 .NET4.5 之 ASP.NET Identity
引入 - 用户信息是如何存在数据库中的 我们前两篇都只讲到了怎么用Membership注册,登录等,但是我们漏掉了一个很重要并且是基本上每个用Membership的人都想问的,我的用户信息怎么保存?我 ...
- 加密数据的填充方式(Padding)
1.填充数据为填充字节的长度 这种填充方式中,填充字符串由一个字节序列组成,每个字节填充该字节序列的长度.假定块长度为8,原文数据长度9,则填充字节数等于0x07:如果明文数据长度为8的整数倍,则填充 ...