golang解决跨域问题

news2024/11/24 4:45:59

文章目录

    • 前言
    • 一、跨域问题
      • 1.是什么
      • 2.跨域的特征(跨域报错)
    • 二、解决跨域问题的方法
      • 1.golang解决跨域问题
      • 2.简单请求
      • 3.非简单请求过程分析(复杂请求):
    • 三、状态码设置为200依旧出错

前言

今天中午在部署golang与vue搭建的一个项目时,因为将项目部署到了云端的Docker容器内
期间涉及到了一些跨域问题,本以为在后端配置一下跨域即可,没想到最后是因为非简单请求跨域的规范导致出错
本文章会介绍跨域的基础概念,解决跨域的方法都有什么,golang如何解决跨域问题,简单与非简单请求的基本概念及规定。

一、跨域问题

1.是什么

由于浏览器的同源策略限制,进而产生跨域拦截问题。同源策略是浏览器最核心也最基本的安全功能;所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port)。

同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。同源策略在解决浏览器访问安全的同时,也带来了跨域问题,当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域。

2.跨域的特征(跨域报错)

Access to XMLHttpRequest at 'http://43.143.232.114:8080/login' from origin 'http://localhost:8081' has 
been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 
'Access-Control-Allow-Origin' header is present on the requested resource.

二、解决跨域问题的方法

常见的方法有三种:前端对脚手架文件进行配置、nginx进行转发、后端写相应的字段配合

在解决跨域问题之前需要先了解一下简单请求与非简单请求,如果不搞明白一次请求都干了什么那么问题将得不到很好的解决。

1.golang解决跨域问题

这里是原生go解决跨域请求的方法,框架的话与这个差不多。知道了方法还需知道是因为什么,接着往下看。

resp.Header().Set("Content-Type", "application/json")
resp.Header().Set("Access-Control-Allow-Origin", "*") //允许访问所有域
// 必须,设置服务器支持的所有跨域请求的方法
resp.Header().Set("Access-Control-Allow-Methods", "POST, GET, PUT, DELETE, OPTIONS")
// 服务器支持的所有头信息字段,不限于浏览器在"预检"中请求的字段
resp.Header().Set("Access-Control-Allow-Headers", "content-type")
// 可选,设置XMLHttpRequest的响应对象能拿到的额外字段
resp.Header().Set("Access-Control-Expose-Headers", "Access-Control-Allow-Headers, Token")
// 可选,是否允许后续请求携带认证信息Cookir,该值只能是true,不需要则不设置
resp.Header().Set("Access-Control-Allow-Credentials", "true")

2.简单请求

简单请求只有:

  1. 只可能有GET + POST +HEAD三种请求类型。而且必须满足下面的2和3两个特征,(POST请求也不全是简单请求,后面有例子)
  2. 不能有自定义头字段 ,只能有以下几种:
    1. Accept
    2. Accept-Language
    3. Content-Type
    4. Content-Language
  3. Content-Type的值只能是以下三种:
    1. text/plain
    2. multipart/form-data 上传文件用的
    3. application/x-www-form-urlencoded 表单提交的数据类型,一般的post请求的数据类型
      除此之外都是复杂请求。

3.非简单请求过程分析(复杂请求):

非简单请求是那种对服务器有特殊要求的请求,比如请求方法是 PUTDELETE ,或者 Content-Type 字段的类型是 application/json

非简单请求的CORS请求,会在正式通信之前,增加一次HTTP查询请求,称为"预检"请求(preflight),预检请求其实就是我们常说的 OPTIONS 请求,表示这个请求是用来询问的。头信息里面,关键字段 Origin ,表示请求来自哪个源,除 Origin 字段,"预检"请求的头信息包括两个特殊字段:

//该字段是必须的,用来列出浏览器的CORS请求会用到哪些HTTP方法
Access-Control-Request-Method
//该字段是一个逗号分隔的字符串,指定浏览器CORS请求会额外发送的头信息字段.
Access-Control-Request-Headers

相应的响应体可以有以下几段:

//该字段是必须的。它的值要么是请求时Origin字段的值,要么是一个*,表示接受任意域名的请求
Access-Control-Allow-Origin
//该字段必需,它的值是逗号分隔的一个字符串,表明服务器支持的所有跨域请求的方法。注意,返回的是所有支持的方法,而不单是浏览器请求的那个方法。这是为了避免多次"预检"请求。
Access-Control-Allow-Methods
//如果浏览器请求包括Access-Control-Request-Headers字段,则Access-Control-Allow-Headers字段是必需的。它也是一个逗号分隔的字符串,表明服务器支持的所有头信息字段,不限于浏览器在"预检"中请求的字段。
Access-Control-Allow-Headers
//该字段可选。CORS请求时,XMLHttpRequest对象的response只能拿到6个基本字段:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。如果想拿到其他字段,就必须在Access-Control-Expose-Headers里面指定。
Access-Control-Expose-Headers
//该字段可选。它的值是一个布尔值,表示是否允许发送Cookie。默认情况下,Cookie不包括在CORS请求之中。设为true,即表示服务器明确许可,Cookie可以包含在请求中,一起发给服务器。这个值也只能设为 true,如果服务器不要浏览器发送Cookie,删除该字段即可。
Access-Control-Allow-Credentials
//该字段可选,用来指定本次预检请求的有效期,单位为秒,在此期间,不用发出另一条预检请求。
Access-Control-Max-Age

①:复杂请求会先发送一个预检请求,方法为OPTIONS,只包含头部信息,不包含请求体,单独一个包发给服务器。包含如下字段:
Origin: 发送请求的页面的源
Access-Control-Request-Methods: 请求希望使用的方法
Access-Control-Request-Headers: (可选)要使用的逗号分隔的自定义头部列表
例如:Origin: http://aiecp.com
Access-Control-Request-Methods: POST
Access-Control-Request-Headers: content-type
②:服务器拿到之后,可以确定是否允许这种类型的请求,然后在响应中发送如下头部信息(不发送响应体,一定一定不要发送响应体):
Access-Control-Allow-Origin: http://aiecp.com
Access-Control-Allow-Methods: POST, GET, PUT, DELETE, OPTIONS
Access-Control-Allow-Headers: content-type
Access-Control-Max-Age: 172800 // 这是缓存预检请求的秒数

③:只有预检请求请求完毕后且状态码为200才会发动正式的请求(预检请求没有请求体,相应的响应也没有响应体)

三、状态码设置为200依旧出错

请添加图片描述

浏览器不是傻子,你在后端直接返回200状态码,但是浏览器还会对你返回的数据进行一下检查,如果检查出你的响应头不符合规范

或者说你的响应体里面有内容,就会停止发送正式的请求(响应体有内容可能是错误信息)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/169748.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaWeb开发(三)3.3——Spring Bean详解(基于XML方式)

一、Bean的概念 由 Spring IoC 容器负责创建、管理所有的Java对象&#xff0c;这些管理的对象称为 Bean&#xff0c;Bean 根据 Spring 配置文件中的信息创建。 二、基于XML方式管理bean对象 eg&#xff1a; <?xml version"1.0" encoding"UTF-8"?&…

JupyterLab,极其强大的 10 个秘密技巧

之前一篇文章&#xff1a;整理了上千个 Python 工具库&#xff0c;涵盖24个大方向 没想到火了。喜欢的可以看一下。 今天我给大家分享一下 Jupyter Lab 的一些内容。 JupyterLab 是 Jupyter 主打的最新数据科学生产工具&#xff0c;某种意义上&#xff0c;它的出现是为了取代…

瑞芯微的接口结构学习总结

MPI 接口使用的主要数据结构&#xff1a; 瑞芯微提供的媒体处理软件平台&#xff08;Media Process Platform&#xff0c;简称 MPP&#xff09;是适用于瑞芯微芯片系列的 通用媒体处理软件平台。该平台对应用软件屏蔽了芯片相关的复杂底层处理&#xff0c;其目的是为了屏蔽不 …

2022 全球网络黑产常用攻击方法 Top 10

近几年&#xff0c;借助互联网产业发展的东风&#xff0c;网络黑产也迎来更加巅峰的状态&#xff0c;不论是从攻击效率&#xff0c;组织规模&#xff0c;亦或是收益变现能力&#xff0c;都在一天天变的成熟完善。根据艾瑞咨询 2020 年发布的《现代网络诈骗分析报告》&#xff0…

哪些数据库开了全文索引

大家好&#xff0c;才是真的好。 今天我们讨论Domino运维管理问题&#xff1a;哪些数据库开启了全文索引&#xff1f; 在前面的某些篇章中&#xff0c;我们介绍过什么是Notes应用的全文索引Full Text Index&#xff0c;以下简称FTI。它是Notes库中的单词的文本索引或列表&…

HTML零基础教程,九大知识点带你玩转前端(下)

博主&#xff1a;冰小九&#xff0c;新人博主一只&#xff0c;欢迎大佬前来指导 冰小九的主页喜欢请给个三连加关注呀&#xff0c;谢谢&#x1f337;&#x1f337;&#x1f337;三连加关注&#xff0c;追文不迷路&#xff0c;你们的支持就是我最大的动力&#xff01;&#xff0…

javaAPI操作-Zookeeper

## 4)ZooKeeper JavaAPI 操作 4.1)Curator介绍 •Curator 是 Apache ZooKeeper 的Java客户端库。 •常见的ZooKeeper Java API &#xff1a; •原生Java API •ZkClient •Curator •Curator 项目的目标是简化 ZooKeeper 客户端的使用。 •Curator 最初是 Netfix 研发的…

电影购票系统项目实战

电影购票系统项目实战电影购票系统简介、项目功能演示。日志框架搭建、系统角色分析首页、登录、商家界面、用户界面实现商家功能-展示详情、影片上架、退出商家功能-影片下架、影片修改用户功能-展示全部影片用户功能-购票功能用户功能-评分功能用户功能-根据片名查询全部影片…

绝缘手套穿戴智能识别算法 yolov5

绝缘手套穿戴智能识别算法通过opencvpython深度学习技术&#xff0c;对现场人员是否佩戴绝缘手套进行识别检测&#xff0c;当检测到现场人员违规行为未佩戴绝缘手套时立刻抓拍告警。我们使用YOLO(你只看一次)算法进行对象检测。YOLO是一个聪明的卷积神经网络(CNN)&#xff0c;用…

初学者C语言练习题-入门

一、入门 C语言一经出现就以其功能丰富、表达能力强、灵活方便、应用面广等特点迅速在全世界普及和推广。C语言不但执行效率高而且可移植性好&#xff0c;可以用来开发应用软件、驱动、操作系统等。C语言也是其它众多高级语言的鼻祖语言&#xff0c;所以说学习C语言是进入编程世…

Python SciPy 模块列表

SciPy 模块列表以下列出了 SciPy 常用的一些模块及官网 API 地址&#xff1a;模块名功能参考文档scipy.cluster向量量化cluster APIscipy.constants数学常量constants APIscipy.fft快速傅里叶变换fft APIscipy.integrate积分integrate APIscipy.interpolate插值interpolate API…

Android自定义控件(八) Android仿招商银行APP手势解锁

前言 目前大部分APP的登录方式有多种类型&#xff0c;其中手势解锁就是其中比较常见的一种方式&#xff0c;经常使用的招商银行APP&#xff08;IOS&#xff09;端的手势解锁体验不错的&#xff0c;就仿照它自定义下手势解锁功能。 说明 1、招行APP手势解锁效果 2、绘制分析 …

【技术推荐】前端JS攻防对抗

简介 网络爬虫一直以来是让网站维护人员头痛的事情&#xff0c;即要为搜索引擎开方便之门&#xff0c;提升网站排名、广告引入等&#xff0c;又要面对恶意爬虫做出应对措施&#xff0c;避免数据被非法获取&#xff0c;甚至出售。因此促生出爬虫和反爬虫这场旷日持久的战斗。 爬…

Java中的Arrays类

1、问题Arrays类是什么&#xff0c;Arrays常用方法。2、方法了解Arrays类的概念Arrays 位于java.util包下,Arrays是一个操作数组的工具类。Arrays常用方法Arrays.fill&#xff1a;替换数组原元素&#xff1b;Arrays.sort:对数组进行排序&#xff08;递增&#xff09;&#xff1…

23种设计模式(六)——装饰模式【单一职责】

文章目录意图什么时候使用装饰真实世界类比装饰模式的实现装饰模式的优缺点亦称&#xff1a; 装饰者模式、装饰器模式、Wrapper、Decorator 意图 装饰者模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象扩展新的功能&#xff0c;同时不改变其结构。主要解决…

Allegro如何快速找到差分不耦合处操作指导

Allegro如何快速找到差分不耦合处操作指导 做PCB设计的时候,需要检查差分对不耦合的地方,让差分不耦合的地方高亮出来 具体操作如下 用Allegro172版本打开pcb,选择View选择Vision Manager

抖快社交,变道求生

配图来自Canva可画 抖音、快手再一次杀回了社交市场。 2022年12月底&#xff0c;快手App store版本更新&#xff0c;在原有的快手热榜、朋友动态、快手拍摄的基础上&#xff0c;新增亲密贴贴、快手直播等新锁屏组件&#xff0c;通过强化产品的交互功能&#xff0c;增强用户的…

针对游戏开发CG制作的搬砖人员的资源搜索技巧分享—【持续补充篇】

一.常用搜索技巧分享 1.视频参考类(bilibili,youtube,常用的视频官网,其实可以满足了,再不行就在百度/Google搜一下) 2.教程和代码类 github Bootstrap Well magebox realtimevfx

Python项目(Django框架)天天生鲜在CentOS7.9搭建运行

CentOS安装python3 为方便管理&#xff0c;在CentOS桌面创建一个文件夹&#xff0c;将软件包下载到这里&#xff0c;右键--在终端打开 安装python3.9.7 : wget https://www.python.org/ftp/python/3.9.7/Python-3.9.7.tgz &#xff08;命令前的sudo如果是root用户可以去掉&…

深度学习目标检测基础_sigmoid和softmax函数

文章目录sigmoid和softmaxsigmoid函数softmax函数总结sigmoid和softmax sigmoid和softmax都是分类函数&#xff0c;他们的区别如下 sigmoid函数 Sigmoid 多标签分类问题多个正确答案非独占输出&#xff08;例如胸部X光检查、住院&#xff09;。构建分类器&#xff0c;解决有…