处理跨域方式

简介:

一、跨域

一个域名地址的组成:

当协议、子域名、主域名、端口号中任意一个不相同时,都算作不同域。

不同域之间相互请求资源,就算作“跨域”。

比如:http://www.abc.com/index.html请求http://www.efg.com/service.php

JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象。

什么是跨域呢,简单地理解就是因为JavaScript同源策略的限制,a.com域名下的js无法操作b.com或者是c.a.com域名下的对象。

  • ww.abc.com/index.html调用www.abc.com/service.php(非跨域)

  • ww.abc.com/index.html调用www.efg.com/service.php(跨域) 主域名不同

  • ww.abc.com/index.html调用bbs.abc.com/service.php(跨域)   子域名不同

  • ww.abc.com/index.html调用www.abc.com:81/service.php(跨域)   端口号不同

  • ww.abc.com/index.html调用https://www.abc.com/service.php(跨域)   不写默认是http协议,协议不同,所以跨域。

子域名:

下面都是abc.com的子域名,可以有一级,也可以有多级,子域名不同就跨域了。

  • www.abc.com

  • bbs.abc.com

  • beijing.bbs.abc.com

  • haidian.beijing.bbs.abc.com

一、处理跨域方式—代理

主要是后端做一个代理,跟前端没关系。

通过在同域名的web服务器端创建一个代理:

北京服务器(域名:www.beijing.com)

上海服务器(域名:www.shanghai.com)

比如在北京的web服务器的后台

(www.beijing.com/proxy-shanghaiservice.php)来调用上海服务器(www.shanghai.com/service.php)的服务,然后把响应结果返回给前端,这样前端调用北京同域名的服务就和调用上海的服务效果相同了。

二、处理跨域方式—JSONP

JSONP解决主流浏览器get请求的跨域数据访问问题。

复制代码

在www.aaa.com页面中<script>function jsonp(json){
    slert(json["name"]);
}</script>

<script src="http://www.bbb.com/jsonp.js"></script> 
//载入另外一个域名中的js,在www.bbb.com/jsonp.js代码中调用jsonp方法:jsonp({'name':'洪七','age':24});

复制代码

1、原理

在A域名去声明一个方法,

载入B域名中的js,因为script可以跨域提交http请求。

B域名中载入的js中直接去调用a域名中声明的方法。

借助script标签,A域名去声明,B域名去调用。

其实这种处理方式和XHR没有太大关系了,只是借助script标签可以跨域访问的特性。

2、使用

前端改造:

在get请求的代码中需要修改一下dataType,从json改为jsonp。再增加一个属性,这个名字就叫jsonp,值可以任意写,比如叫callback。

也就是对代码做了2处改动,

  • 把dataType从json改成jsonp,

  • 增加一jspnp的属性取了个值叫callback。

后端改造:

在get请求的处理中获取到callback, 前端jsonp参数取了个名字叫callback,所以后端就要获取callback。

如果前端取callback123的话,后端就要获取callback123。

3、分析

发请求的时候jquery自动增加了一个参数,参数的名称是callback123,参数的值是jquery自动生成的。

比如我实际应用中一例子:

发完ajax请求,网页中请求的Headers的Request URL为:http://api.xxx.com/vipuser/grade?cb=jQuery18308066630555287624_1487902991956&username=xxx&token=xxx&format=jsonp

参数名cb,参数的值是jquery自动生成的。
这个值是:jQuery18308066630555287624_1487902991956

响应Response为:

返回值:jQuery18308066630555287624_1487902991956({"message":"success","gradeInfo":{xxx},"code":"0","info":{xxx}})

返回值前面是参数的值,一模一样,后面用括号括起了要返回的json对象。

最后注意一点:JSONP的原理只能对get请求有效,不支持POST请求。

三、处理跨域方式—XHR2(HTML5)

html5提供的XMLHttpRequest Level2已经实现了跨域访问以及其他的一些新功能。

IE10以下不支持XHR2这个标准。

使用

客户端不需要什么改造。

服务器:只需要设置2个服务器头。

header('Access-Control-Allow-Origin:*');后面有个*星号,*就是所有域都可以访问,当然也可以设置特点的域名。比如说我们服务器在上海,可以在Access-Control-Allow-Origin后面设置一个北京服务器的域名,只有在北京的那个域名可以访问。

header('Access-Control-Allow-Methods:POST,Get');



本文转自 sshpp 51CTO博客,原文链接:http://blog.51cto.com/12902932/1926154,如需转载请自行联系原作者

相关文章
|
消息中间件 调度
如何区分进程、线程和协程?看这篇就够了!
本课程主要探讨操作系统中的进程、线程和协程的区别。进程是资源分配的基本单位,具有独立性和隔离性;线程是CPU调度的基本单位,轻量且共享资源,适合并发执行;协程更轻量,由程序自身调度,适合I/O密集型任务。通过学习这些概念,可以更好地理解和应用它们,以实现最优的性能和资源利用。
610 11
|
人工智能 自然语言处理 PyTorch
CLIP(Contrastive Language-Image Pre-training)
CLIP(Contrastive Language-Image Pre-training)
2296 0
|
负载均衡 算法 数据可视化
蚁群算法(实例帮助理解)
蚁群算法(实例帮助理解)
2496 0
蚁群算法(实例帮助理解)
|
Java API 网络安全
基于JavaMail的Java邮件发送:简单快速上手
基于JavaMail的Java邮件发送:简单快速上手
738 0
基于JavaMail的Java邮件发送:简单快速上手
|
存储 前端开发 JavaScript
dapp/defi智能合约流动性LP质押挖矿系统开发(开发源码案例)丨成熟技术
Dapp:代表去中心化应用程序。它们是在去中心化网络或区块链上运行后端代码(主要用Solidity编写的智能合约)的应用程序。可以使用React、Vue或Angular等前端框架构建Dapp。
|
1天前
|
人工智能 自然语言处理 安全
阿里云AI数智鉴密:AI 生成内容如何拿到一张"防篡改的身份证"
隐形水印 + C2PA签名:让AI生成内容“持证上岗”。
1086 0
|
9天前
|
人工智能 自然语言处理 安全
阿里云千问办公、Qoder Teams、Qoder CN区别与选择指南:模型能力、适用场景与最新活动参考
本文聚焦阿里云2026年推出的三款自研AI办公产品,清晰拆解千问办公、Qoder Teams、Qoder CN的差异化定位与能力边界:千问办公主打职场全场景提效,支持自然语言指令一键完成PPT生成、数据分析等高频办公任务;Qoder Teams面向程序员团队,深度整合AI代码生成、团队协同与企业知识库能力;Qoder CN则专为金融、政务等强合规场景打造,实现数据不出境与VPC私有化部署。文章同步给出分场景选型指南与最新活动定价,帮助不同类型的企业按需组合产品,实现业务岗、研发岗与强合规场景的AI能力全覆盖。
3595 3
阿里云千问办公、Qoder Teams、Qoder CN区别与选择指南:模型能力、适用场景与最新活动参考
|
21天前
|
人工智能 缓存 前端开发
DeepSeek Harness 首发实测 + 入门教程,夯爆了!梁神我错了
DeepSeek Harness + DeepSeek V4 Pro 项目实战保姆级教程!手把手带你从零安装开源 AI 编程工具,开发架构图、知识讲解网站、3D 网页游戏、全栈 AI 应用 4 个项目,覆盖运行模式选择、插件安装与开发,看看能不能对标 Claude。
13325 91
DeepSeek Harness 首发实测 + 入门教程,夯爆了!梁神我错了