jQuery 使用 JSONP

缺点:

1、这种方式无法发送post请求(这里)

2、另外要确定jsonp的请求是否失败并不容易,大多数框架的实现都是结合超时时间来判定。

跨域的几种方式

在项目中可能会需要在一个域名下请求另外一个域名的资源,下面我们来探讨下跨域的几种实现方式

1、jsonp

最常见的一种跨域方式,其背后原理就是利用了script标签不受同源策略的限制,在页面中动态插入了script,script标签的src属性就是后端api接口的地址,并且以get的方式将前端回调处理函数名称告诉后端,后端在响应请求时会将回调返还,并且将数据以参数的形式传递回去。

前端:

//http://127.0.0.1:8888/jsonp.html

var script = document.createElement('script');

script.src = 'http://127.0.0.1:2333/jsonpHandler?callback=_callback'

document.body.appendChild(script); //插入script标签

//回调处理函数 _callback

var _callback = function(obj){

for(key in obj){

console.log('key: ' + key +' value: ' + obj[key]);

}

}

后端:

//http://127.0.0.1:2333/jsonpHandler

app.get('/jsonpHandler', (req,res) => {

let callback = req.query.callback;

let obj = {

type : 'jsonp',

name : 'weapon-x'

};

res.writeHead(200, {"Content-Type": "text/javascript"});

res.end(callback + '(' + JSON.stringify(obj) + ')');

})

在jsonp.html中打开控制台可以看到返回数据的输出:

jsonp.png

2、CORS

Cross-Origin Resource Sharing(跨域资源共享)是一种允许当前域(origin)的资源(比如html/js/web service)被其他域(origin)的脚本请求访问的机制。

当使用XMLHttpRequest发送请求时,浏览器如果发现违反了同源策略就会自动加上一个请求头:origin,后端在接受到请求后确定响应后会在Response

Headers中加入一个属性:Access-Control-Allow-Origin,值就是发起请求的源地址(http://127.0.0.1:8888),浏览器得到响应会进行判断Access-Control-Allow-Origin的值是否和当前的地址相同,只有匹配成功后才进行响应处理。

现代浏览器中和移动端都支持CORS(除了opera mini),IE下需要8+

前端:

//http://127.0.0.1:8888/cors.html

var xhr = new XMLHttpRequest();

xhr.onload = function(data){

var _data = JSON.parse(data.target.responseText)

for(key in _data){

console.log('key: ' + key +' value: ' + _data[key]);

}

};

xhr.open('POST','http://127.0.0.1:2333/cors',true);

xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');

xhr.send();

后端:

//http://127.0.0.1:2333/cors

app.post('/cors',(req,res) => {

if(req.headers.origin){

res.writeHead(200,{

"Content-Type": "text/html; charset=UTF-8",

"Access-Control-Allow-Origin":'http://127.0.0.1:8888'

});

let people = {

type : 'cors',

name : 'weapon-x'

}

res.end(JSON.stringify(people));

}

})

可以在开发者工具里面看到请求的详细信息,并且在控制台也可以看到返回的数据输出:

response header.png

cors console.png

3、服务器跨域

在前后端分离的项目中可以借助服务器实现跨域,具体做法是:前端向本地服务器发送请求,本地服务器代替前端再向api服务器接口发送请求进行服务器间通信,本地服务器其实就是个中转站的角色,再将响应的数据返回给前端,下面用node.js做一个示例

前端:

//http://127.0.0.1:8888/server

var xhr = new XMLHttpRequest();

xhr.onload = function(data){

var _data = JSON.parse(data.target.responseText)

for(key in _data){

console.log('key: ' + key +' value: ' + _data[key]);

}

};

xhr.open('POST','http://127.0.0.1:8888/feXhr',true); //向本地服务器发送请求

xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');

xhr.send("url=http://127.0.0.1:2333/beXhr"); //以参数形式告知需要请求的后端接口

后端:

//http://127.0.0.1:8888/feXhr

app.post('/feXhr',(req,res) => {

let url = req.body.url;

superagent.get(url) //使用superagent想api接口发送请求

.end(function (err,docs) {

if(err){

console.log(err);

return

}

res.end(docs.res.text); //返回到前端

})

})

//http://127.0.0.1:2333/beXhr

app.get('/beXhr',(req,res) => {

let obj = {

type : 'superagent',

name : 'weapon-x'

};

res.writeHead(200, {"Content-Type": "text/javascript"});

res.end(JSON.stringify(obj)); //响应

})

五、处理跨域的方法3 -- XHR2

“XHR2” 全称 “XMLHttpRequest Level2” 是HTML5提供的方法,对跨域访问提供了很好的支持,并且还有一些新的功能。

* IE10以下的版本都不支持

* 只需要在服务器端头部加上下面两句代码:

header( "Access-Control-Allow-Origin:*" );

header( "Access-Control-Allow-Methods:POST,GET" );

只有ajax会跨域吗_ajax处理跨域有几种方式相关推荐

  1. 只有ajax会跨域吗_ajax解决跨域

    http://www.cnblogs.com/sunxucool/p/3433992.html 为什么会出现跨域 跨域问题来源于JavaScript的同源策略,即只有 协议+主机名+端口号 (如存在) ...

  2. 原生态的ajax如何上传文件,原生ajax和iframe框架实现图片文件上传的两种方式

    大家应该可以举出几种常用的异步文件上传功能的实现方式,使用频率较多的有原生ajax和iframe框架,实现图片文件上传,下面就为大家分享图片文件上传的两种方式:原生ajax和iframe框架,供大家参 ...

  3. ajax java对象返回前台少了属性_AJAX常见提交数据的三种方式

    一.键值对方式提交 AJAX提交 控制器接收 方式1:属性接收 @RequestMapping("stu/add") @ResponseBody public HashMap ad ...

  4. 在java里如何跨网页传参_【页面传值6种方式】- 【JSP 页面传值方法总结:4种】 - 【跨页面传值的几种简单方式3种】...

    JSP 页面间传递参数是项目中经常需要的,这应该算是 web 基本功吧. 试着将各种方式总结下来,需要时可以进行权衡利弊选择最合适的方式. 1. URL 链接后追加参数 URL 后面追加参数 resp ...

  5. springboot项目解决跨域的几种方式

    跨域资源共享(CORS):通过修改Http协议header的方式,实现跨域.说的简单点就是,通过设置HTTP的响应头信息,告知浏览器哪些情况在不符合同源策略的条件下也可以跨域访问,浏览器通过解析Htt ...

  6. ajax提交不能进入后台_Ajax跨域问题

    今天写表单提交时候遇到个问题, 每次提交都提示是跨域的问题,捣鼓了半天,发现少了个属性 后台的跨域设置: 前台form表单提交: 解决方式: 在表单提交时候加2个属性 访问正常 解决跨域请求问题,首先 ...

  7. ajax和jsonp没有半点关系,跨域问题

    2019独角兽企业重金招聘Python工程师标准>>> jsonp确实和ajax没有半毛钱关系,只算是一种机制跨域数据获取方案或者协议. 只是说很多库(比如jquery)里面对jso ...

  8. 两种方式实现js, ajax跨域

    2019独角兽企业重金招聘Python工程师标准>>> 做客户端软件或手机应用,没有域,所以要解决跨域通信. 第一种方式就是jsonp 这个大家可以查一下,这里直接贴实例 html代 ...

  9. $.ajax 加了headers报错_Springboot解决Ajax跨域的三种方式

    这篇文章不华丽,但比较实用,能解决不少大家实际业务中的问题.大家可以收藏起来,以备用时之需! 1.同源策略 1.1 含义 ajax出现请求跨域错误问题,主要原因就是因为浏览器的"同源策略&q ...

最新文章

  1. 【Git】Git 基础命令 ( Git 版本库概念 | 创建版本库 git init | 克隆版本库 git clone )
  2. 被迫学计算机,电脑强迫人学习
  3. mysql.ini环境配置_MySQL配置文件mysql.ini参数详解
  4. c语言汇编混编,c语言与汇编混编写法
  5. 学习进度条——第九周
  6. ACL 2021 | 丁香园知识增强预训练模型
  7. Linq to Oracle 使用教程目录
  8. java基础篇(二) ----- java面向对象的三大特性之继承
  9. 管理小故事精髓 100例(转)
  10. 硬核科普:一片晶圆可以生产多少芯片?
  11. 《走遍美国》MP3 共78集下载地址
  12. Windows触控手势
  13. python 文件备份
  14. Word怎么删除空白页操作方法 Word删除空白页的办法详解oldtimeblog
  15. 使用ExcelJs导出表格设置样式、添加边框
  16. 数据库SQL实战11_获取员工其当前的薪水比其manager当前薪水还高的相关信息,当前表示to_date=‘9999-01-01‘, 结果第一列给出员工的emp_no, 第二列给出其manager
  17. Python opencv 在图片上写字
  18. 为何电脑下载mp3等音乐导入U盘后无法在汽车上播放?网易云等音乐软件夹带私货!!
  19. 计算机硬件知识比赛策划,计算机硬件知识讲座活动策划案.doc
  20. Arduino 开锁,刷卡开锁模块

热门文章

  1. python01-变量,运算符与数据类型+位运算
  2. 如何对DevOps数据库进行源代码控制
  3. 分布式服务框架-原理与实践:14---流量控制-学习笔记(理论篇)
  4. OC高效率52之理解消息转发机制
  5. 微信开发文档笔记整理(一)
  6. this class is not key value coding-compliant for the key ##
  7. MySQL 关于毫秒和微秒的处理,MySQL获取毫秒!
  8. Chrome v28 会在pwd目录下生成libpeerconnection.log文件
  9. 《.NET应用架构设计:原则、模式与实践》新书博客--试读-1.3 架构设计中的重要概念...
  10. (灌水)如何限制一个WinForm应用程序只能在一个进程运行