前端vue后端go如何进行跨域设置?一篇就通透理解

这篇具有很好参考价值的文章主要介绍了前端vue后端go如何进行跨域设置?一篇就通透理解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

什么是跨域,为什么要跨域?

跨域(Cross-Origin)指的是在浏览器中,当一个 web 应用程序试图访问不同域名、不同端口或不同协议的资源时,就会发生跨域请求,此时浏览器的同源策略(Same-Origin Policy)就会进行拦截,他是同源策略是一种安全机制,它限制了网页中的 JavaScript 代码只能访问同源(相同协议、主机和端口)的资源,以防止恶意网站通过 JavaScript 访问用户的敏感信息。

那我们为什么要跨域呢?

  1. 前端分离的项目:两者是运行再不同一个端口或者说是不同一个域名的,比如前端运行在localhost:9090而后端却运行在localhost:9092端口,他们传输数据就需要跨域才可以。
  2. 第三方资源集成:网站可能不仅需要后端的数据还需要第三方资源,通俗就是别的网站上的内容我也想要借用,此时别的网站也就是另外一个域名,跨过去就又是跨域了。
  3. 跨域通信:在某些场景下,不同域名的网页需要进行通信、数据交换或共享信息,例如使用跨域 Ajax 请求获取数据。

本篇文章主要说前端设置 代理服务器 的方式进行处理,后端讲解通过跨域资源共享(CORS机制 来实现跨域请求。

主要讲解localhost的不同端口发送的跨域请求,不同域的跨域请求是一样的流程下篇文章讲解什么是域以及域和ip地址的关系。

1.前端跨域处理方式以及原理

先看前端的vue项目,我们先创建一个vue项目然后找到其中的vue.config.js 将这段代码复制上去

//前端跨域处理方式
module.exports = {
  devServer: {
    port: 9090, // 自定义端口
    proxy: {//设置跨域请求
      '/api': {   //只要是api开头的就会转到后端
            target: 'http://localhost:9092', // 后端监听的地址
            changeOrigin: true,
            pathRewrite: {
              '^/api': '/api'
            }
      }
    }
  }
}

前端vue后端go如何进行跨域设置?一篇就通透理解,golang,vue.js* 前端代码解释

port就是设置前端运行的端口位置,proxy就是代理的意思 , 之后设置当在前端的请求中如果有/api路径的ajax请求的话,就会把发送请求的端口改为http://localhost:9092,也就是说前端要发送的请求让http://localhost:9092来代替发送changeOrigin意思就是是否开启代理,最后pathRewrite意思是路径代替,比如原来的请求默认是 本地端口+路径也就是=

http://localhost:9090/api/login)对吧,此时路径代替('^/api': '/api')的意思就是将api及其以前的部分代替成api,那么此时的路径是否就变为了api/login,然后再在路径的前面加上发送请求的代理端口,此时发送出来的请求就是http://localhost:9092/api/login  看最后的结果就是通过前面的代理配置然后得到了真正的后端需要的路径。

然后就能够成功发送给后端了,后续等待后端返回数据时,在浏览器看来它发送请求的地方时代理服务器http://localhost:9092,它接收的数据是

后端在http://localhost:9090端口发送的,那么请求的发送和数据的接收是在同一个端口,之后就判断是符合同源协议的。此时也就实现了跨域请求数据。

2后端跨域处理方式以及原理

这里为了更方便多人观看我后端用的是net/http包中的go原生语言中的http请求创建服务器、处理函数的,并没有使用gin框架

先看一眼我后端的创建服务器和请求然后就讲解跨域原理

func main() {
    // 定义接口处理函数
    loginHandler := func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprint(w, "Hello, api/login!")
    }
​
    // 注册接口处理函数
    http.HandleFunc("api/login", loginHandler)
​
    // 创建服务器并设置跨域请求的响应头
    server := &http.Server{
        Addr:    ":9092",
        Handler: corsMiddleware(http.DefaultServeMux),
    }
    // 启动服务器
    server.ListenAndServe()
}
​
// 中间件函数,用于设置跨域请求的响应头
func corsMiddleware(handler http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        // 允许所有域名访问,可以根据实际需求进行修改
        w.Header().Set("Access-Control-Allow-Origin", "http://localhost:9090") // 前端的地址 //指定允许访问该资源的外域 URI,对于携带身份凭证的请求不可使用通配符*
​
        // 允许的请求方法
        w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE") //指明实际请求所允许使用的 HTTP 方法
​
        // 允许的请求头字段
        w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization")//指明实际请求中允许携带的首部字段
​
        // 预检请求的缓存时间,单位为秒
        w.Header().Set("Access-Control-Max-Age", "3600")
​
        fmt.Println("前端发送了option")
        // 如果是预检请求,直接返回
        if r.Method == http.MethodOptions {
            return
        }
        fmt.Println("前端发送了post")
        // 调用下一个处理函数
        handler.ServeHTTP(w, r)
    })
}

* 后端代码解释

我们看我们后端是先开启了一个9092服务器的端口,之后设置了一个中间件 corsMiddleware 处理函数 设置了一个api/login路径的处理函数,

1.这里简单说下什么是中间件:

在 Go 语言中,中间件是一种函数,位于服务器和实际请求处理函数之间,允许您在请求达到处理函数之前修改请求或响应。中间件常用于实现横切关注点,如日志记录、身份验证、授权,以及在这种情况下的 CORS 处理。也就是说任何要走到9092端口的数据都要先经过中间件函数,然后再走对应路径的处理函数。

2.前端发送请求的流程:

前端在发送ajax请求的时候会让浏览器默认先发送一个OPTIONS请求,OPTIONS请求到达后端的中间的时候后端会告诉OPTIONS请求,后端允许什么域名什么方法去发起请求,然后把这些数据返回给浏览器(<==也就是后端中间件的作用),之后浏览器判断自己即将要发送的POST请求的域名、方法、字段是否符合后端的设置,如果符合的话,此时就会发送POST请求,如果不符合的话也就没有必要发送POST请求了,就会直接被同源策略给拦截住了。

3.接下来设置一下前端请求

我们在前端没有设置跨域的请求下,让前端运行在9090端口,此时在9090端口的地方发送了一个目的地是9092端口的URLhttp://localhost:9092/api/v1/login

(这里我用的是axios请求,但本质axios请请求就是封装了ajax请求,所以大家还认为是ajax请求就好)前端vue后端go如何进行跨域设置?一篇就通透理解,golang,vue.js

4.后端得到请求后的处理流程

当发送之后我们后端得到的结果就应该是第一次浏览器发送OPTIONS请求,然后后端打印了 “前端发送了option” 然后后端就return了,之后浏览器真正发送post请求的时候,后端再一次进入了中间件并打印了 “前端发送了option” 然后第二次请求是POST请求,所以进入到了后续,又一次打印了 “前端发送了post”

之后就继续进行路径对应的处理函数了。 前端vue后端go如何进行跨域设置?一篇就通透理解,golang,vue.js

这里我们测试一下如果后端允许的地址不包含前端端口的话我们设置为允许3030端口 w.Header().Set("Access-Control-Allow-Origin", "http://localhost:3030")

此时前端在9090端口的地方发送了http://localhost:9092/api/v1/login 目的地的post请求,此时后端就只会打印一个 “前端发送了option” ,因为同源策略已经把前端要发送的POST请求给拦截了。

前端vue后端go如何进行跨域设置?一篇就通透理解,golang,vue.js

最后最后给大家说一下我在测试前后端跨域时候遇见的坑。

1.第一个坑

在前端写发送请求测试的时候一定不能发送get请求,因为get请求不会让浏览器先发送一个OPTIONS请求去探路,我一开始并不知道,所以这就导致我在测试找跨域原理的时候用的get请求我就发现为什么我无论后端开不开跨域,前端开不开代理得到的结果都是一样的。让我测试了无数遍,开始质疑跨域有什么意义。。。还有一件事就是当前端发送POST请求的时候要携带参数才行,如果不携带参数浏览器会认为是简单请求,也不会先发送OPTIONS请求去探路。前端vue后端go如何进行跨域设置?一篇就通透理解,golang,vue.js

2.第二个坑

我们在做测试的时候如果测试中参数都没有问题的话,那么浏览器会正常先发送一次OPTIONS请求,然后再发送POST请求,这样会得到你预期的效果但是!!!如果这个时候你说没看清楚,然后又一次重启项目,想要再测一次,你就会发现这次浏览器只是发送了POST请求,然后又会质疑是不是自己刚看错了。。经过尝试我得知,浏览器是有记忆的,所以同样的路径,浏览器第一次测试的时候就已经记住了结果,所以第二次测试的时候就不会再发送OPTIONS请求了,而是直接POST请求,所以想要第二次测试的话,就改一下前端运行端口,和后端跨域允许范围,就能够重新测试了。

* 后端跨域小tips

我们都知道在后端的http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}函数参数中我们是可以同通过wr获得发来请求的请求地址、请求头等等信息的,(如果是gin框架可以通过context获得相关信息)所以我们可以把允许访问的地址设置为从r中提取的请求地址,这样就设置为所有地址都可以实现跨域请求了。至于说为什么不用 * 来表示所有请求都可以跨域是因为:对于携带身份凭证的请求不可使用通配符*,比如前端发送的携带了cookie身份验证,用 * 就不能实现跨域请求了。文章来源地址https://www.toymoban.com/news/detail-848292.html

到了这里,关于前端vue后端go如何进行跨域设置?一篇就通透理解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 本地前端代理连接服务器后端gateway api浏览器提示cors跨域,如何解决?

    🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家 关注收藏订阅 !持续更新中,up!up!up!!   本地前端代理连接服务器后端gateway api浏览器提示

    2024年04月12日
    浏览(24)
  • 【前端】根据后端返回的url进行下载并设置文件下载名称

            在我们项目当中存储文件是存储到厂商的服务器上的,然后厂商返回一个可以直接下载url地址,但是前端使用这个url下载的时候永远都是保存一个名字,这时候我们就需要设置文件保存的名称,         那么如何实现呢?使用了fetch将url转换成了blob即可。 代码

    2024年02月04日
    浏览(29)
  • 前端如何压缩图片在进行上传给后端

       前端压缩图片我目前能想到的就是 通过canvas 改变图片的 画质去改变图片的大小。 解决方案如下: 1、首先获取图片的全部内容,然后转化为base64让他可以在页面上展示。 2、当我们获取到base64的图片的时候我们就可以获取图片的大小尺寸。 3、我们把这个图片放置到ca

    2024年01月19日
    浏览(27)
  • Jmeter进行http接口测试,这一篇就搞定

    jmeter-http接口测试脚本 jmeter进行http接口测试的主要步骤(1.添加线程组 2.添加http请求 3.在http请求中写入接口的URL,路径,请求方式,参数 4.添加查看结果树 5.调用接口,查看返回值) 针对接口添加header在如下途径添加: jmeter做http接口测试添加cookie: 3.jmeter-webservice脚本 进

    2024年04月15日
    浏览(16)
  • 前端上传的文件,后端将如何进行存储以及回显

    完成文件上传这个功能需要涉及到两个部分: 前端程序 服务器程序 文件上传后将如何进行储存 本地磁盘储存 云服务器oss储存 ##后端项目创建 创建springboot工程,引入对应的起步依赖(web、mybatis、mysql驱动、lombok) 配置文件application.properties中引入mybatis的配置信息,准备对应

    2024年02月04日
    浏览(26)
  • 前端HTML基础:表单标签看这一篇就行了。

    表单标签:     在网页中为了收集用户资料,此时你就会用到表单。 在HTML中,一个完整的表单由表单域、表单控件和提示信息3个部分组成 1.表单域 表单域就是一个包含表单元素的区域。 在HTML标签中,form标签用于定义表单域,以实现用户信息的收集和传递。 form会把它范

    2024年02月21日
    浏览(34)
  • 如何给Windows电脑重装系统+新系统设置(从检查到实施,看这一篇就够了!)包含BitLocker的备份,镜像的下载,启动盘的制作,安装的流程,驱动的下载,新电脑的设置等各个方面。

    如何给一个Windows电脑(任意版本)重装win11(此方法Windows10适用)系统? 在此之前都需要注意(或检查)什么方面? 会出现什么问题以及其解决方法? 这篇文章会给予读者一个完整的解答。 大家好,我是爱好计算机的初中生一名 由于电脑磁盘内存有限以及最近考试学习的

    2024年02月03日
    浏览(35)
  • 利用LightHouse进行合理的页面性能优化,看这一篇就够了!

    Lighthouse 是一款由 Google 开发的开源工具,用于评估 Web 应用程序的性能和质量。它可以分析 Web 应用程序的加载速度、渲染性能、可访问性、可用性和最佳实践等方面,提供详细的报告和建议。 官网 1.谷歌打开设置,搜索输入商店: 2.下载 Lighthouse : 3.我们从官网上下载一个

    2024年02月05日
    浏览(20)
  • JeecgBoot Vue3 版本前端后端设置免登录-不登录直接访问页面-前端免登录直接访问

    jeecgboot Vue3 版本做出了巨大的更新,前端项目的变动最大,在使用的时候官网文档有的地方没有介绍,如果您想做官网,前台的项目,这个时候需要绕过登录,直接进入项目,这个时候需要一下的配置,即可实现对应的功能。 在学习编程的时候不光要和老师,教程一一的学习

    2024年02月10日
    浏览(21)
  • 纯前端文档预览,还要支持所有主流格式,有这一篇就足够了

            纯前端的文档预览功能,是非常常见的需求,但就是这么简单的需求,难住了许多可爱的小伙伴们。别急,先访问一下解决方案,给你一个惊喜,再往下看: 文件在线预览DEMO 服务器文件预览DEMO Vue3纯前端文档预览演示 1. Vue2版本代码全面同步Vue3所有特性,支持

    2023年04月08日
    浏览(19)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包