位置: IT常识 - 正文

前后端分离项目,如何解决跨域问题?(前后端分离项目部署到服务器)

编辑:rootadmin
前后端分离项目,如何解决跨域问题?

推荐整理分享前后端分离项目,如何解决跨域问题?(前后端分离项目部署到服务器),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:前后端分离项目如何部署,nginx负载均衡前后端分离项目,springboot前后端分离项目,idea怎么运行前后端分离项目,nginx负载均衡前后端分离项目,docker部署前后端分离项目,idea怎么运行前后端分离项目,前后端分离项目如何部署,内容如对您有帮助,希望把文章链接给更多的朋友!

跨域问题是前后端分离项目中非常常见的一个问题,举例来说,编程猫(codingmore)学习网站的前端服务跑在 8080 端口下,后端服务跑在 9002 端口下,那么前端在请求后端接口的时候就会出现跨域问题。

403 Forbidden 是HTTP协议中的一个状态码(Status Code),意味着后端服务虽然成功解析了请求,但前端却没有访问该资源的权限。

那怎么解决这个问题呢?通常有两个思路:

前端使用 Nodejs 代理(开发环境下,生产环境下可以用 Nginx 替代)或者后端开启跨域资源共享一、关于跨域

跨域对于前后端开发者来说,就像一块狗皮膏药,无论是面试还是开发中,都会经常遇到。

之所以出现跨域问题,是因为浏览器的同源策略,为了隔离潜在的恶意文件,为了防御来自歪门邪道的攻击,浏览器限制了从同一个源加载的文档或脚本与来自另一个源的资源进行交互。

前面我们提到了,前端跑在 8080 端口下,后端跑在 9002 端口下,这种情况就属于不同的源(域名不同,协议不同,端口不同),所以 8080 端口下的前端请求直接访问 9002 端口下的后端接口时就访问失败了。

那正确的打开方式是什么呢?我们前面也提到了,前端使用 Nodejs 代理或者后端开启跨域资源共享,我们一一来实践下。

二、Nodejs 代理

在 Nodejs 出现之前,JavaScript 编写的程序通常需要在用户的浏览器上执行,Node.js 出现后,JavaScript 也能用于服务端编程了。Nodejs 一系列的内置模块使得程序可以脱离 IIS、Apache 这种 Web 服务作为独立的服务器执行。

我们使用 Nodejs 来解决跨域问题的思路就是,在本地创建一个虚拟服务器,对 8080 端口下的前端请求进行代理,同时接收 9002 端口下的服务器端响应,这样服务端和服务端进行数据的交互就不会出现跨域问题了。

第一步,配置 Nodejs 代理服务

module.exports = { dev: { // Paths assetsSubDirectory: 'static', assetsPublicPath: '/', proxyTable: { '/api': { target: 'http://localhost:9002', // 你请求的第三方接口 changeOrigin: false, // 在本地会创建一个虚拟服务端,然后发送请求的数据,并同时接收请求的数据,这样服务端和服务端进行数据的交互就不会有跨域问题 pathRewrite: { // 路径重写, '^/api': '' // 替换target中的请求地址,也就是说以后你在请求http://api.codingmore.top/v2/XXXXX这个地址的时候直接写成/api即可。 } }, },}

第二步,配置前端访问请求路径

module.exports = merge(prodEnv, { NODE_ENV: '"development"', VUE_APP_BASE_API: '"/api"' // VUE_APP_BASE_API: '"http://localhost:9002"'})

第三步,重启前端服务

再次点击「登录」按钮,可以看到请求的 URL 发生了改变,原来是 http://localhost:9002/users/login,现在是 http://localhost:8080/api/users/login。与此同时,可以看到多了一个 Remote Address,端口也是 8080,也就是说经过 Nodejs 的代理,前后端的交互在同一个源下面了,这样就不会发生跨域问题了。

同时,可以看得到,服务器端返回的状态码变成了 200,表示请求成功。

三、开启跨域资源共享

跨域资源共享,也就是 Cross-Origin Resource Sharing,简拼为 CORS,是一种基于 HTTP 头信息的机制,通过允许服务器标识除了它自己以外的资源,从而实现跨域访问。

第一步,开启 CORS 支持

在 Spring Boot 应用中,加入 CORS 的支持简单到不忍直视,添加一个配置类就可以了。

@Configurationpublic class GlobalCorsConfig { @Bean public CorsFilter corsFilter() { CorsConfiguration config = new CorsConfiguration(); // 设置你要允许的网站域名 config.addAllowedOrigin("http://localhost:8080"); //允许跨域发送cookie config.setAllowCredentials(true); //放行全部原始头信息 config.addAllowedHeader("*"); //允许所有请求方法跨域调用 config.addAllowedMethod("*"); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", config); return new CorsFilter(source); }}

第二步,重启后端服务,再次点击登录按钮,发现请求已经可以正常访问了。

本例中,后端返回 Access-Control-Allow-Origin: http://localhost:8080 就表示,跑在 9002 端口下的后端接口可以被 8080 端口的前端请求访问。

前后端分离项目,如何解决跨域问题?(前后端分离项目部署到服务器)

如果允许所有域名进行跨域调用的话,只需改变一行代码即可。

//允许所有域名进行跨域调用config.addAllowedOriginPattern("*");// 设置你要允许的网站域名// config.addAllowedOrigin("http://localhost:8080");

对于 login 这种简单的请求来说,它们是不会触发 CORS 预检的,因此不需要在服务器端增加其他配置就可以了。那什么是简单请求呢?

1)请求方法是以下三种方法之一:

HEADGETPOST

2)HTTP 的头信息不超出以下几种字段:

AcceptAccept-LanguageContent-LanguageLast-Event-IDContent-Type:只限于三个值 application/x-www-form-urlencoded、multipart/form-data、text/plain

那对于会触发 CORS 预检的非简单请求(比如说请求方法是 PUT 或 DELETE,或者 Content-Type 字段的类型是 application/json,或者请求消息头包含了一些自定义的字段),该怎么办呢?

非简单请求在正式通信之前,会增加一次 HTTP 查询请求,称为“预检”请求。预检请求通过后,才会返回正常的响应内容。

拿编程猫的文章管理页来举例,该页面会向后端发起一个 posts/queryPageable 的分页查询,该请求包含了一个自定义的消息头 Authorization,于是浏览器认为该请求是一个非简单请求,然后就会自动发起一次 OPTIONS 请求,但由于我们的 Spring Boot 项目整合了 SpringsScurity 安全管理框架,没有对OPTIONS请求放开登录认证,导致验证失败,文章分页请求的响应数据就没有返回回来。

第三步,通过以下代码给 OPTIONS 请求放行。

public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity httpSecurity) throws Exception { ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry registry = httpSecurity .authorizeRequests(); //允许跨域请求的OPTIONS请求 registry.antMatchers(HttpMethod.OPTIONS) .permitAll(); }}

再次重启后端服务,重新访问文章列表接口,发现有响应数据了。

非简单请求必须首先使用 OPTIONS 请求方法发起一个预检请求到服务器端,以获知服务器是否允许该实际请求。"预检请求“的使用,避免了跨域请求对服务器的用户数据造成未预期的影响。

我们来通过两张图片简单总结一下预检请求的整个过程,第一张,发起 OPTIONS 预检请求:

第二章,发起正式请求:

四、源码路径

编程猫后端源码:

https://github.com/itwanger/coding-more

编程猫后台管理的前端源码:

https://github.com/itwanger/codingmore-admin-web

参考链接:

跨域:https://segmentfault.com/a/1190000015597029 CORS:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CORS 阮一峰:https://www.ruanyifeng.com/blog/2016/04/cors.html 简单请求+预检请求:https://github.com/amandakelake/blog/issues/62

本篇已收录至 GitHub 上星标 1.6k+ star 的开源专栏《Java 程序员进阶之路》,据说每一个优秀的 Java 程序员都喜欢她,风趣幽默、通俗易懂。内容包括 Java 基础、Java 并发编程、Java 虚拟机、Java 企业级开发、Java 面试等核心知识点。学 Java,就认准 Java 程序员进阶之路😄。

https://github.com/itwanger/toBeBetterJavaer

star 了这个仓库就等于你拥有了成为了一名优秀 Java 工程师的潜力。也可以戳下面的链接跳转到《Java 程序员进阶之路》的官网网址,开始愉快的学习之旅吧。

https://tobebetterjavaer.com/

没有什么使我停留——除了目的,纵然岸旁有玫瑰、有绿荫、有宁静的港湾,我是不系之舟。

本文链接地址:https://www.jiuchutong.com/zhishi/300334.html 转载请保留说明!

上一篇:最全面试题CSS(含答案)(css面试题及答案)

下一篇:《推荐PlumGPT:一款优秀的聊天机器人》(《推荐一个好地方》图书馆)

  • 华为手机开关排序怎么设置(华为手机开关排序拉不下来了)

    华为手机开关排序怎么设置(华为手机开关排序拉不下来了)

  • 小天才z6拍立拍怎么开启(小天才z7拍立拍)

    小天才z6拍立拍怎么开启(小天才z7拍立拍)

  • 华为手机mac地址怎么查(华为手机mac地址不可用)

    华为手机mac地址怎么查(华为手机mac地址不可用)

  • 华为开发者选项在哪(华为开发者选项怎么关闭)

    华为开发者选项在哪(华为开发者选项怎么关闭)

  • voip通话环境不支持录屏(通话环境设置)

    voip通话环境不支持录屏(通话环境设置)

  • 小米8缓存数据是什么(小米缓存数据在哪)

    小米8缓存数据是什么(小米缓存数据在哪)

  • 3gnet是什么意思(3gnet3gwap)

    3gnet是什么意思(3gnet3gwap)

  • 电脑上一长横怎么打(电脑一长横怎么打)

    电脑上一长横怎么打(电脑一长横怎么打)

  • 华为手机无法横屏看视频(华为手机无法横屏播放视频)

    华为手机无法横屏看视频(华为手机无法横屏播放视频)

  • 手机充电必须充满才能拔吗(手机充电必须充满吗可以半路拔掉吗)

    手机充电必须充满才能拔吗(手机充电必须充满吗可以半路拔掉吗)

  • 微信电话连接失败(微信电话连接失败怎么回事,对方挂断吗)

    微信电话连接失败(微信电话连接失败怎么回事,对方挂断吗)

  • 京东账号手机号换了怎么登录(京东账号手机号注销了怎么办)

    京东账号手机号换了怎么登录(京东账号手机号注销了怎么办)

  • 红米note8充电时发热(红米note8充电突然变慢了)

    红米note8充电时发热(红米note8充电突然变慢了)

  • 5ipro与5z区别(5gcpepro和5gcpepro2)

    5ipro与5z区别(5gcpepro和5gcpepro2)

  • 加速器有哪些(免费的吃鸡加速器有哪些)

    加速器有哪些(免费的吃鸡加速器有哪些)

  • 手机微博如何看最近访客(手机微博如何看在线)

    手机微博如何看最近访客(手机微博如何看在线)

  • 微信健康码哪里申请(微信健康码哪里申诉)

    微信健康码哪里申请(微信健康码哪里申诉)

  • 小米8内置收音机吗(小米内置收音机apk提取)

    小米8内置收音机吗(小米内置收音机apk提取)

  • 路由器拨号失败是怎么回事(路由器拨号失败是什么原因)

    路由器拨号失败是怎么回事(路由器拨号失败是什么原因)

  • pr撤回快捷键是什么(pr撤回快捷键是哪个)

    pr撤回快捷键是什么(pr撤回快捷键是哪个)

  • word2007里面怎么画线(word2007里面怎么打印彩色)

    word2007里面怎么画线(word2007里面怎么打印彩色)

  • 手机sd卡如何使用(手机sd卡如何使用视频)

    手机sd卡如何使用(手机sd卡如何使用视频)

  • 滴滴出行怎么取消学生认证(滴滴出行怎么取消认证)

    滴滴出行怎么取消学生认证(滴滴出行怎么取消认证)

  • iconnect是什么手机软件(icon是什么牌子手机)

    iconnect是什么手机软件(icon是什么牌子手机)

  • k歌话筒怎么连接手机(k歌话筒怎么连接手机蓝牙)

    k歌话筒怎么连接手机(k歌话筒怎么连接手机蓝牙)

  • kk键盘怎么发语音包(Kk键盘怎么发语音到快手)

    kk键盘怎么发语音包(Kk键盘怎么发语音到快手)

  • wps为什么是金山文档(wps为什么是金山文档小程序)

    wps为什么是金山文档(wps为什么是金山文档小程序)

  • ppt撤销快捷键是什么(ppt撤销键不管用)

    ppt撤销快捷键是什么(ppt撤销键不管用)

  • 小红书如何退货(小红书怎样退货)

    小红书如何退货(小红书怎样退货)

  • 应交税费是什么科目借贷方向
  • 投资性房地产税务上可以计提折旧吗
  • 递延所得税负债转回怎么理解
  • 原始凭证分割单样本
  • 增值税发票的抵扣联丢了怎么办
  • 资本公积账务
  • 应付票据的处理
  • 公司账户拨款工具有哪些
  • 可供出售金融资产改为什么科目
  • 失业养老保险如何办理
  • 出售股票会计怎么做分录
  • 财产清查的种类有哪些
  • 水利建设基金有优惠政策吗
  • 案例分析互联网巨头的战略计划
  • 增值税发票价税合计是什么意思
  • 开具红字增值税专用发票是什么意思
  • 工程施工开具发票
  • 赠送的产品需要开发票吗
  • 企业交残疾人基金会计分录怎么做
  • 购买股权属于什么科目
  • 给客户退差价怎么说
  • 华为手机屏幕碎了照片
  • 客户回款扣除的费用
  • 电脑玩游戏卡怎么弄
  • 总公司与分公司的账务处理
  • 出售报废固定资产的净损失计入什么科目
  • 个人以房产投资一人有限公司时,房产要开发票吗
  • php的in_array
  • 中秋购物
  • 挂账多年的往来账怎么处理
  • php生成php文件
  • 未确认融资收益怎么理解
  • 固定资产一览表
  • 总分类账的登记依据和方法取决于企业所采用的
  • vue实现下载文件夹
  • 筹资活动产生的现金流量净额为正说明什么
  • vmware虚拟机安装在移动硬盘
  • 个体户办营业执照网上怎么申请
  • 哪些税种需要计提吗
  • 赔偿的费用
  • 特许经营企业的特点
  • 申请开立账户的请示
  • Centos5.5中安装Mysql5.5过程分享
  • 公司承担员工的个税怎么做账
  • 清算期间的坏账会计分录
  • 计提环保税的会计分录
  • 事业单位其他支出科目
  • 商品流通企业会计第三版答案倪明辉
  • 怎样编制银行存款凭证
  • win8系统蓝屏后无法修复
  • windows server 2008 r2安装教程
  • 360 sesvc.exe
  • winxp系统怎么设置默认账户登入
  • ubuntu磁盘清理工具
  • 能上qq但是打不开网页 知乎
  • centos查看具体版本
  • linux whoami命令详解
  • win7桌面快捷方式图标没箭头
  • win8怎么把任务栏变成透明
  • 如何解决win7系统中鼠标键盘不能用
  • 向Windows8靠拢 全新的个性化库页面
  • win10系统怎么卸载ie浏览器
  • nodejs发送http请求
  • 有nodejs就不需要用java了么
  • python redis hmset
  • Android startActivities()的使用
  • bash shell脚本编程经典实例(第2版)
  • python自动化验证码
  • unity shader cull off
  • javascript toggle
  • 互联网巨头bat有哪些
  • android 布局属性大全
  • 国企9000扣完五险一金
  • 广东省深圳市税占27%,高新技术占15%,各市分别占多少?
  • 苏州买房退契税政策2023
  • 北京市税务局的待遇怎么样
  • 单位医保账号怎么注销掉
  • 个人彩票收入属什么类别
  • 车船税优惠政策2022年
  • 甘肃税务政策
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设