当前位置: 首页 > news >正文

跨域解决方案处理

文章目录

  • 首先了解什么是跨域
    • 1. 什么是跨域?
    • 2. 源是什么?
    • 3. 同源策略又是什么?
    • 4. 同源请求与非同源请求
    • 5. 浏览器对跨域请求的限制有哪些?
  • 解决跨域方案
    • 1. JSONP(此解决方式已过时)
    • 2. CORS(此方案需要服务器配合)
      • 1)CORS概念
      • 2)简单请求与复杂请求
      • 3)解决简单跨域请求
      • 4)解决复杂跨域
    • 3. nginx
    • 4. 利用前端脚手架
    • 5. 自己配置代理服务器(node http-proxy-middleware库)

首先了解什么是跨域

1. 什么是跨域?

跨域是指在一个域的Web页面请求另一个域的资源时,由于浏览器的同源策略限制,这种请求可能会被阻止。

2. 源是什么?

https://www.baidu.com:8099
源 = 协议(https) + 域名(www.baidu.com) + 端口号(8099)

判断是否同源:

3. 同源策略又是什么?

同源策略是浏览器为了确保资源安全所遵循的一种安全策略

4. 同源请求与非同源请求

所处源与目标源不一致即为不同源,也就是跨域请求。

在这里插入图片描述

5. 浏览器对跨域请求的限制有哪些?

1)DOM访问限制: 源A的脚本不能访问到源B的DOM(可用ifream验证)
2)Cookie访问限制: 源A不能访问到源B的Cookie
3)Ajax响应数据限制:源A可以向源B发送请求,但是接收不到源B的响应数据

注意点:

  • 跨域只发生在浏览器端,服务端不存在跨域限制
  • 即使跨域, ajax请求可以发出,但是响应数据不会交给开发者
    在这里插入图片描述
  • <link> <script> <img>等标签请求也可能跨域,但是浏览器对标请求不做严格限制

解决跨域方案

1. JSONP(此解决方式已过时)

在这里插入图片描述

  • 原理 通过在页面里添加script标签来实现跨域
function requestCall(data){console.log(data);
}let script = document.createElement('script')
script.type = 'text/javascript'
script.src = `https://www.abc.com:8099?callback=requestCall`;
document.body.appendChild(script);script.onload = ()={script.remove();
}
  • jquery 封装的JSONP
$.getJSON(`https://www.abc.com:8099?callback=?`, (data)=>{console.log(data);
})

2. CORS(此方案需要服务器配合)

1)CORS概念

在这里插入图片描述

2)简单请求与复杂请求

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/2840f275d70e40ae9605a359c5a66d56.png)

关于预检请求:

  • 发送时机:发送跨域请求之前有浏览器主动发出
  • 主要作用: 用于向服务端确认,是否允许接下来的跨域请求
  • 基本流程:先发OPTIONS请求,如果用过预检,则继续发跨域请求
  • 请求头内容:
请求头含义
Origin请求源
Accsess-Control-Request-Header实现请求的请求头
Accsess-Control-Request-Method请求方法

在这里插入图片描述在这里插入图片描述

3)解决简单跨域请求

请求头里面一般有```Origin```,表明发送请求的源

在这里插入图片描述

服务器给出响应时配置响应头Accsess-Control-Allow-Origin表明允许跨域,随后浏览器校验时即可通过

4)解决复杂跨域

先让浏览器通过预检配置如下响应头
响应头含义
Accsess-Control-Allow-Origin请求源
Accsess-Control-Allow-Header允许请求头
Accsess-Control-Allow-Method允许方法
Accsess-Control-Max-Age本次预检请求的有效期,单位为秒

在这里插入图片描述

在处理真正的跨域请求 解决方案同简单跨域请求
可以寻找对应的库解决(node的cors)

3. nginx

location /user/ {proxy_pass url;
}

4. 利用前端脚手架

module.exports = {...
devServer: {proxy: {'/api': {target: 'http://abc.com/login', // 后台接口域名secure: false, // 如果是https接口,需要配置这个参数changeOrigin: true, //是否跨域pathRewrite: {'/api': ''}}}}

5. 自己配置代理服务器(node http-proxy-middleware库)

 app.use("/api",createProxyMiddleware({target: 'http://localhost:3001',changeOrigin:true,pathRewrite: {'/api': ''});

学习资源出处

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【Linux网络】IP协议{初识/报头/分片/网段划分/子网掩码/私网公网IP/认识网络世界/路由表}
  • HTTP-概述
  • React Hooks学习笔记
  • redis源码分析之底层数据结构(一)-动态字符串sds
  • 【Git】取消追踪多个文件或目录
  • Duplicate class kotlin.collections.jdk8.CollectionsJDK8Kt found in modules。Android studio纯java代码报错
  • 使用Spring Boot和自定义缓存注解优化应用性能
  • Linux内存管理--系列文章柒——硬件架构
  • ELK集群搭建
  • 28个常用的损失函数介绍以及Python代码实现总结
  • React -- useState状态更新异步特性——导致获取值为旧值的问题
  • 前端工程化(01):10款自动化构建工具初识。
  • [GHCTF 2024 新生赛]ezzz_unserialize
  • 攻防世界 Web_python_template_injection(flask模版注入)
  • 网络安全应急响应信息收集利器-Eagle_Eye
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • angular2 简述
  • Debian下无root权限使用Python访问Oracle
  • jquery cookie
  • Nodejs和JavaWeb协助开发
  • Redux系列x:源码分析
  • Tornado学习笔记(1)
  • XForms - 更强大的Form
  • zookeeper系列(七)实战分布式命名服务
  • 从零开始在ubuntu上搭建node开发环境
  • 高性能JavaScript阅读简记(三)
  • 区块链分支循环
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 听说你叫Java(二)–Servlet请求
  • 微信公众号开发小记——5.python微信红包
  • 学习使用ExpressJS 4.0中的新Router
  • 责任链模式的两种实现
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (2)MFC+openGL单文档框架glFrame
  • (4)事件处理——(7)简单事件(Simple events)
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (动态规划)5. 最长回文子串 java解决
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (四)软件性能测试
  • (算法二)滑动窗口
  • (一)Linux+Windows下安装ffmpeg
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • (状压dp)uva 10817 Headmaster's Headache
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .CSS-hover 的解释
  • .Net Core 中间件与过滤器
  • .net MySql
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)