位置: IT常识 - 正文

解决SpringBoot和前端Vue的跨域问题(springboot比spring做了哪些改进)

发布时间:2024-01-17
解决SpringBoot和前端Vue的跨域问题 一、为什么会出现跨域问题  

推荐整理分享解决SpringBoot和前端Vue的跨域问题(springboot比spring做了哪些改进),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:spring springboot 区别,springboot比spring做了哪些改进,springboot相比spring,springboot的坑,spring,springboot,springboot的坑,springboot比spring做了哪些改进,springboot区别,内容如对您有帮助,希望把文章链接给更多的朋友!

        出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。同源策略会阻止一个域的。javascript脚本和另外一个域的内容进行交互。所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port)。

二、什么是跨域?

        要了解什么是跨域,我们先说一下同源的概念。同源,是指协议、域名、端口都相同。

        例如:http://192.168.0.1:8080与https://192.168.3.1:8080不是同源,因为协议不同,第一个冒号前面的为协议,中间的为域名,第二个冒号后面的为端口,只要满足有一处不同,则就不是同源。

        所谓跨域就是从 A 向 B 发请求,如若他们的地址协议、域名、端口都不相同,直接访问就会造成跨域问题,跨域是非常常见的现象!请求是跨域的但并不一定会报错,普通的图片请求。css文件请求是不会报错的。报错的条件是浏览器的同源策略,且发送Ajax请求,跨域是客户端问题。

类似于如下:

三、常见的跨域场景 

四、如何解决跨域?

1.JSONP        jsonp的原理就是利用<script>标签没有跨域限制,通过<script>标签src属性,发送带有callback参数的GET请求,服务端将接口返回数据拼凑到callback函数中,返回给浏览器,浏览器解析执行,从而前端拿到callback函数返回的数据。

jsonp的缺点:只能发送get一种请求。

2.CORS

        CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。 它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。 CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。   浏览器将CORS跨域请求分为简单请求和非简单请求。   只要同时满足一下两个条件,就属于简单请求 (1)使用下列方法之一:

headgetpost解决SpringBoot和前端Vue的跨域问题(springboot比spring做了哪些改进)

(2)请求的Heder是

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

不同时满足上面的两个条件,就属于非简单请求。浏览器对这两种的处理,是不一样的。

3.nginx反向代理接口跨域         可以将前端项目部署到和接口同源的当前本地的服务器上。在vue.config.js 中进行代理配置,假设当我访问 http://localhost:9528/api/login 时会转换为间接访问 http://localhost:3000/api/login

devServer: { // 其他代码省略。。。。。 // 代理配置 proxy: { // 代理服务器,当请求的网址是http://localhost:3000的时候,会转成http://192.168.80.115:3000 // /api 是 看接口文档所写的,每当访问本地的/api接口时,会转化为访问真实的服务器 '/api': { target: 'http://localhost:3000' // 我们要代理的真实接口地址 } }

 4.web sockets         它是一种浏览器的API,它的目标是在一个单独的持久连接上提供全双工、双向通信。(同源策略对web sockets不适用)web sockets原理:在JS创建了web socket之后,会有一个HTTP请求发送到浏览器以发起连接。取得服务器响应后,建立的连接会使用HTTP升级从HTTP协议交换为web sockt协议。 只有在支持web socket协议的服务器上才能正常工作。       

属性:

5.node.js中间件代理跨域

  node中间件实现跨域代理,原理大致与nginx相同,都是通过启一个代理服务器,实现数据的转发,也可以通过设置cookieDomainRewrite参数修改响应头中cookie中域名,实现当前域的cookie写入,方便接口登录认证。1)非vue框架的跨域   使用node + express + http-proxy-middleware搭建一个proxy服务器。

前端代码:var xhr = new XMLHttpRequest();// 前端开关:浏览器是否读写cookiexhr.withCredentials = true;// 访问http-proxy-middleware代理服务器xhr.open('get', 'http://www.domain1.com:3000/login?user=admin', true);xhr.send();中间件服务器代码:var express = require('express');var proxy = require('http-proxy-middleware');var app = express();app.use('/', proxy({ // 代理跨域目标接口 target: 'http://www.domain2.com:8080', changeOrigin: true, // 修改响应头信息,实现跨域并允许带cookie onProxyRes: function(proxyRes, req, res) { res.header('Access-Control-Allow-Origin', 'http://www.domain1.com'); res.header('Access-Control-Allow-Credentials', 'true'); }, // 修改响应信息中的cookie域名 cookieDomainRewrite: 'www.domain1.com' // 可以为false,表示不修改}));app.listen(3000);console.log('Proxy server is listen at port 3000...');

2)vue框架的跨域   node + vue + webpack + webpack-dev-server搭建的项目,跨域请求接口,直接修改webpack.config.js配置。开发环境下,vue渲染服务和接口代理服务都是webpack-dev-server同一个,所以页面与代理接口之间不再跨域。 webpack.config.js部分配置:

module.exports = { entry: {}, module: {}, ... devServer: { historyApiFallback: true, proxy: [{ context: '/login', target: 'http://www.domain2.com:8080', // 代理跨域目标接口 changeOrigin: true, secure: false, // 当代理某些https服务报错时用 cookieDomainRewrite: 'www.domain1.com' // 可以为false,表示不修改 }], noInfo: true }}五、SpringBoot跨域问题的解决

在Springboot项目里加上这个配置文件CorsConfig.java,重启之后即可实现跨域访问,前端无需再配置跨域。

import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.cors.CorsConfiguration;import org.springframework.web.cors.UrlBasedCorsConfigurationSource;import org.springframework.web.filter.CorsFilter;@Configurationpublic class CorsConfig { // 当前跨域请求最大有效时长。这里默认1天 private static final long MAX_AGE = 24 * 60 * 60; @Bean public CorsFilter corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration corsConfiguration = new CorsConfiguration(); corsConfiguration.addAllowedOrigin("*"); // 1 设置访问源地址 corsConfiguration.addAllowedHeader("*"); // 2 设置访问源请求头 corsConfiguration.addAllowedMethod("*"); // 3 设置访问源请求方法 corsConfiguration.setMaxAge(MAX_AGE); source.registerCorsConfiguration("/**", corsConfiguration); // 4 对接口配置跨域设置 return new CorsFilter(source); }} 六、前端跨域解决

request.js用来请求数据,封装的代码如下:

import axios from 'axios'const request = axios.create({baseURL: '/api', // 注意!! 这里是全局统一加上了 '/api' 前缀,也就是说所有接口都会加上'/api'前缀在,页面里面写接口的时候就不要加 '/api'了,否则会出现2个'/api',类似 '/api/api/user'这样的报错,切记!!! timeout: 5000})// request 拦截器// 可以自请求发送前对请求做一些处理// 比如统一加token,对请求参数统一加密request.interceptors.request.use(config => { config.headers['Content-Type'] = 'application/json;charset=utf-8'; // config.headers['token'] = user.token; // 设置请求头 return config}, error => { return Promise.reject(error)});// response 拦截器// 可以在接口响应后统一处理结果request.interceptors.response.use( response => { let res = response.data; // 如果是返回的文件 if (response.config.responseType === 'blob') { return res } // 兼容服务端返回的字符串数据 if (typeof res === 'string') { res = res ? JSON.parse(res) : res } return res; }, error => { console.log('err' + error) // for debug return Promise.reject(error) })export default request

vue.config.js:

// 跨域配置module.exports = { devServer: { //记住,别写错了devServer//设置本地默认端口 选填 port: 9876, proxy: { //设置代理,必须填 '/api': { //设置拦截器 拦截器格式 斜杠+拦截器名字,名字可以自己定 target: 'http://localhost:9999', //代理的目标地址 changeOrigin: true, //是否设置同源,输入是的 pathRewrite: { //路径重写 '^/api': '' //选择忽略拦截器里面的内容 } } } }}七、前后端都跨域 

如果后端设置了跨域配置,则使用下面的request.js 代码:

import axios from 'axios'const request = axios.create({baseURL: 'http://localhost:9090', // 注意!! 这里是全局统一加上了 后端接口前缀 前缀,后端必须进行跨域配置! timeout: 5000})// request 拦截器// 可以自请求发送前对请求做一些处理// 比如统一加token,对请求参数统一加密request.interceptors.request.use(config => { config.headers['Content-Type'] = 'application/json;charset=utf-8'; // config.headers['token'] = user.token; // 设置请求头 return config}, error => { return Promise.reject(error)});// response 拦截器// 可以在接口响应后统一处理结果request.interceptors.response.use( response => { let res = response.data; // 如果是返回的文件 if (response.config.responseType === 'blob') { return res } // 兼容服务端返回的字符串数据 if (typeof res === 'string') { res = res ? JSON.parse(res) : res } return res; }, error => { console.log('err' + error) // for debug return Promise.reject(error) })export default request⛵小结

以上就是对解决SpringBoot和前端Vue的跨域问题简单的概述,现在我们的项目就更加的趋于完美了,也提升了我们对于编程的能力和思维!

如果这篇文章有帮助到你,希望可以给作者点个赞👍,创作不易,如果有对后端技术、前端领域感兴趣的,也欢迎关注 ,我将会给你带来巨大的收获与惊喜💝💝💝!

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

上一篇:【微信小程序】自定义组件(一)(微信小程序在哪里打开)

下一篇:文本生成图像工作简述2--常用数据集分析与汇总(文本生成图像前景怎么样)

  • 小红书怎么绑手机账号(小红书上怎样绑定手机)

    小红书怎么绑手机账号(小红书上怎样绑定手机)

  • 为什么双击微信图标打不开 双击微信图标打不开的解决办法(打开微信)

    为什么双击微信图标打不开 双击微信图标打不开的解决办法(打开微信)

  • 研究生可以用苹果教育优惠吗(研究生可以用苹果优惠吗)

    研究生可以用苹果教育优惠吗(研究生可以用苹果优惠吗)

  • wifi信号强度标准dbm是多少(wifi信号强度标准和穿墙哪个好)

    wifi信号强度标准dbm是多少(wifi信号强度标准和穿墙哪个好)

  • 华为应用助手是干嘛的(华为应用助手是干什么的)

    华为应用助手是干嘛的(华为应用助手是干什么的)

  • 微信耳机发语音全是杂音滋滋(微信带着耳机语音,发语音手机会响吗)

    微信耳机发语音全是杂音滋滋(微信带着耳机语音,发语音手机会响吗)

  • 打电话给别人响一声提示正在通话是为什么(打电话给别人响几声自己挂了)

    打电话给别人响一声提示正在通话是为什么(打电话给别人响几声自己挂了)

  • 户户通001卫星直播节目信号中断怎么办(户户通直播卫星)

    户户通001卫星直播节目信号中断怎么办(户户通直播卫星)

  • excel数据整理的方法(excel怎么整理数据表)

    excel数据整理的方法(excel怎么整理数据表)

  • 拼多多工单能撤销吗(拼多多工单结束了还可以在投诉吗)

    拼多多工单能撤销吗(拼多多工单结束了还可以在投诉吗)

  • 手机抖屏怎么办(手机屏幕抖屏)

    手机抖屏怎么办(手机屏幕抖屏)

  • realme Q怎么隐藏虚拟导航键(realme怎么隐藏手机软件)

    realme Q怎么隐藏虚拟导航键(realme怎么隐藏手机软件)

  • 京东评价怎么删除(京东评价咋删除)

    京东评价怎么删除(京东评价咋删除)

  • 苹果手机照片右下角有个白圈(苹果手机照片右下角有个感叹号是什么意思)

    苹果手机照片右下角有个白圈(苹果手机照片右下角有个感叹号是什么意思)

  • xsmax几寸(苹果xsmax几寸)

    xsmax几寸(苹果xsmax几寸)

  • 抖音怎么视频和图片一起发(抖音怎么视频和图片一块发)

    抖音怎么视频和图片一起发(抖音怎么视频和图片一块发)

  • 怎么查信息拦截(怎么查信息拦截记录)

    怎么查信息拦截(怎么查信息拦截记录)

  • 猫眼电影迟到能取票吗(猫眼电影迟到能退票吗)

    猫眼电影迟到能取票吗(猫眼电影迟到能退票吗)

  • airpods设置界面在哪(airpods设置界面只有断开和忽略)

    airpods设置界面在哪(airpods设置界面只有断开和忽略)

  • 怎么设置微信自动运行(怎么设置微信自动添加好友)

    怎么设置微信自动运行(怎么设置微信自动添加好友)

  • 怎么查询淘金币到期(怎么查询淘金币什么时候过期)

    怎么查询淘金币到期(怎么查询淘金币什么时候过期)

  • 苹果x有悬浮球吗(苹果x悬浮球在哪设置关闭)

    苹果x有悬浮球吗(苹果x悬浮球在哪设置关闭)

  • 智联招聘如何取消投递(智联招聘如何取消面试邀请)

    智联招聘如何取消投递(智联招聘如何取消面试邀请)

  • Transformers 库的基本使用(transformers document)

    Transformers 库的基本使用(transformers document)

  • 安卓so ida动态调试(手机上动态调试apk)

    安卓so ida动态调试(手机上动态调试apk)

  • 交所得税用计提吗
  • 投资者减除费用和工资薪金减除费用
  • 行政单位调拨的固定资产申请报告
  • 小规模纳税人如何升级为一般纳税人
  • 2021小规模免税
  • 经营利润和营业利润的区别
  • 小规模纳税人与一般纳税人区别
  • 股东向企业借款属于关联交易吗
  • 软件和硬件可以用什么代名词
  • 汇总缴纳增值税的三级公司怎么汇总备案
  • 作为福利手段福利概念的三个条件是
  • 资本公积提取比例怎么算
  • 企业所得税营业税金及附加
  • 增值税发票抵扣联丢失怎么办
  • 出售固定资产要交哪些税
  • 企业接受固定资产投资
  • 发票上传出现手印怎么办
  • 增值税税率改革的意义
  • 是否有综合所得申报是什么意思
  • 临时工的个人所得税怎么算
  • 有业务往来的两家公司可以投一个公司吗
  • 经营租赁交什么税种
  • 12月计提税金
  • 农业合作社收到政府补贴做到其他收入里可以吗
  • 内部职工销售佣金计入
  • mac隔空投送文件位置
  • swupdtmr.exe - swupdtmr进程是什么意思 什么作用
  • 应如何做会计分录表
  • 民间非营利组织会计制度及操作实务
  • 如何输入特殊符号带圈数字11
  • php邮箱发送
  • 开启自动备份注册表
  • 公司给客户报销费用可以吗
  • 购买免税农产品可以抵扣进项税
  • 百家论坛是正规期刊吗
  • php中session什么意思
  • 职工教育经费可以以后年度结转吗
  • eslint不起作用
  • php正则替换函数怎么写
  • php自定义变量的方法是
  • php安装oci8
  • 固定资产清理应交增值税怎么算
  • php使用while循环计算1到100的和
  • 不免征个人所得税的是个人转让著作权所得
  • 计提 增值税
  • 有外币账户的企业叫什么
  • phpcms建站流程
  • 期初是什么
  • 送货运杂费属于什么收入
  • 公户直接转给私人账户违法么
  • 上月结余金额是什么的
  • mysql优化常用的几种方法
  • 分公司注销一般要多久
  • 出租车定额发票代码含义
  • 金税盘要交税吗
  • 购买的车位如何做账
  • 进口报关费入什么科目
  • 社保计入管理费用什么科目
  • 取得工程款发票计入什么会计科目里
  • 公司往来借款怎么做账
  • 营业成本包括三大费用如何称呼
  • 公司房屋租赁协议
  • 营业成本占营业收入的比重过高
  • Windows10下MySQL5.7.19安装教程 MySQL忘记root密码修改方法
  • innodb 结构
  • ubuntu20.04配置
  • WeatherEye.exe - WeatherEye 是什么进程
  • awk正则表达式中引入变量
  • 安卓游戏模拟游戏制作
  • javascript零基础学要学多久
  • 猫的所有视频
  • 基于JavaScript的图书管理系统
  • js拖拽生成页面
  • 基于python语言的项目
  • 个人出租商业用房开票税率
  • 餐饮专票可以抵扣吗
  • 桂林市临桂区有几所高中
  • 宁夏退休职工网上认证
  • 新税法折旧年限怎么算
  • 国家税务总局风险识别报告
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号