当前位置:网站首页>一文搞懂│什么是跨域?如何解决跨域?
一文搞懂│什么是跨域?如何解决跨域?
2022-07-15 15:34:00 【InfoQ】
什么是跨域
- 域:是指浏览器不能执行其他网站的脚本
- 跨域:它是由浏览器的同源策略造成的,是浏览器对
JavaScript实施的安全限制,所谓同源(即指在同一个域)就是两个页面具有相同的协议protocol,主机host和端口号port则就会造成跨域

跨域场景
- 场景的跨域场景有哪些,请参考下表

解决跨域的四种方式
- nginx的反向代理
- 使用
nginx反向代理实现跨域,是最简单的跨域方式
- 只需要修改
nginx的配置即可解决跨域问题,支持所有浏览器,支持session,不需要修改任何代码,并且不会影响服务器性能
// nginx配置
server {
listen 81;
server_name www.domain1.com;
location / {
proxy_pass http://www.domain2.com:8080; #反向代理
proxy_cookie_domain www.domain2.com www.domain1.com; #修改cookie里域名
index index.html index.htm;
# 当用webpack-dev-server等中间件代理接口访问nignx时,此时无浏览器参与,故没有同源限制,下面的跨域配置可不启用
add_header Access-Control-Allow-Origin http://www.domain1.com; #当前端只跨域不带cookie时,可为*
add_header Access-Control-Allow-Credentials true;
}
}- jsonp请求
jsonp是服务器与客户端跨源通信的常用方法。最大特点就是简单适用,兼容性好兼容低版本IE,缺点是只支持get请求,不支持post请求
- 原理时网页通过添加一个
<script>元素,向服务器请求json数据,服务器收到请求后,将数据放在一个指定名字的回调函数的参数位置传回来
//jquery实现
<script>
$.getJSON('http://autofelix.com/api.php&callback=?', function(res) {
// 处理获得的数据
console.log(res)
});
</script>- 后端语言代理
- 可以通过一种没有跨域限制的语言中转一下,通过后端语言去请求资源,然后再返回数据
- 比如
http://www.autofelix.cn需要调用http://api.autofelix.cn/userinfo去获取用户数据,因为子域名不同,会有跨域限制
- 可以先请求
http://www.autofelix.cn下的php文件,比如http://www.autofelix.cn/api.php,然后再通过该php文件返回数据
<?php
// api.php 文件中的代码
public function getCurl($url, $timeout = 5)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
$result = getCurl('http://api.autofelix.cn/userinfo');
return $result;- 后端语言的设置
- 主要通过后端语言主动设置跨域请求,这里以
php作为案例
<?php
// 允许所有域名访问
header('Access-Control-Allow-Origin: *');
// 允许单个域名访问
header('Access-Control-Allow-Origin: https://autofelix.com');
// 允许多个自定义域名访问
static public $originarr = [
'https://autofelix.com',
'https://baidu.com',
'https://csdn.net',
];
// 获取当前跨域域名
$origin = isset($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP_ORIGIN'] : '';
if (in_array($origin, self::$originarr)) {
// 允许 $originarr 数组内的 域名跨域访问
header('Access-Control-Allow-Origin:' . $origin);
// 响应类型
header('Access-Control-Allow-Methods:POST,GET');
// 带 cookie 的跨域访问
header('Access-Control-Allow-Credentials: true');
// 响应头设置
header('Access-Control-Allow-Headers:x-requested-with,Content-Type,X-CSRF-Token');
}边栏推荐
猜你喜欢

Installation and use of Doxygen and annotation syntax

Redis05: redis transactions

Information system project manager core examination site (IX) organizational structure type

SQL实现将数据表中的字段中的值按分隔符分成多列

Information system project manager 10 days before the exam limit sprint + answer (6): project procurement management and contract management

12306 ticket grabbing tools shock and attack

Salesforce中實施Campaign Influence模型注意事項

对接企业微信,客户关系管理也可以很简单!

在Salesforce中基于SAML 2.0搭建SSO并启用JIT User Provisioning(SF Orgs间 / SF Org与Experience Cloud间 / 其他IdP)

nifi ListSFTP等代理设置
随机推荐
CFA考试报名须知
Salesforce中实施Campaign Influence模型注意事项
【动态规划】—— 数位统计DP
磁盘分区标为活动的方法及取消磁盘分区标为活动的方法
Transplantation and analysis of freemodbus on stm32f1 platform
Comparable to headhunter resume sorting skills how to quickly sort out resumes
由四种颜色组成的环,填到五个段组成的一个环上,使得各个环与相邻的颜色并不相同的组合能有多少种(全量)。
virtual box挂载共享文件夹
拜占庭将军问题
Salesforce中解析合并字段Merge Fields
Core examination site for information system project managers (XI) two key technologies and architectures of the Internet of things
Typora入门:全网最全教程
A ring composed of four colors is filled into a ring composed of five segments, so how many combinations (full quantity) can each ring have with different colors from the adjacent ones.
对接企业微信,客户关系管理也可以很简单!
ORACLE在修改主键时出现ORA-00955报错解决方法
STM32 internal flash operation function
蚂蚁隐私计算创新TEE技术获学术认可
最常用的chrome浏览器控制台的调试技巧,你看你知道不。
@What is tap
插值法计算两点之间的数值