SpringBoot+vue2/vue3解决跨域问题(详细步骤)

Vue3 (Proxy代理解决跨域) vue3中使用proxy代理机制解决跨域问题。 阅读详情

目录

1、前言

1.1、什么是跨域?

2、跨域解决

2.1、vue2+vue-cli的形式

2.2、vue3+vite的形式

3、后端如何解决跨域?

3.1、@CrossOrigin注解局部跨域(方式一)

3.2、实现WebMvcConfigurer接口全局跨域(方式二)

3.3、配置CorsFilter全局跨域(方式三)


1、前言

本篇文章使用的是vue2+vue-cli和vue3+vite组合的形式(vue3+vue-cli 3.0也可以,不过都用vue3了,为什么还要再用vue-cli,vite不香嘛),通过配置proxy解决跨域(开发环境可以生效,但是线上这种形式就不行了,需要使用Nginx进行反向代理,文章后面也会讲解)

1.1、什么是跨域?

应该不少小伙伴经常在开发中遇到一下问题吧,看到这串报错是不是瞬间头皮发麻

 Access to XMLHttpRequest at '......' from origin  '......' has been blocked by CORS policy: 

 No 'Access-Control-Allow-Origin' header is present on the requested resource.

这就是前后端分离项目最常见的跨域问题,违反了浏览器的同源策略。

跨域是指一个域下的文档或脚本尝试去请求另一个域下的资源时,由于浏览器同源政策的限制,而不能直接进行的行为。这里的“域”指的是协议、域名(或ip地址)和端口号三者组成的组合。

同源政策(Same-origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少这个约定,浏览器很容易受到XSS、CSRF等攻击。所以,它限定了从一个源加载的文档或脚本如何与另一个源的资源进行交互。它能帮助阻止恶意文档,减少可能窃取数据的安全威胁。


具体来说,当协议、域名(或ip地址)和端口号中的一项不同,就会被视为跨域,例如:
- `http://www.example.com` 与 `https://www.example.com`:协议不同,是跨域。
- `http://www.example.com` 与 `http://www.example.org`:域名不同,是跨域。
- `http://www.example.com:8080` 与 `http://www.example.com:8081`:端口号不同,是跨域。


跨域资源共享(CORS)是一种机制,它使用额外的HTTP头来告诉浏览器,让运行在一个源上的Web应用被准许访问不同源上指定的资源。在某些情况下,例如API的调用,跨域请求是必要的,此时就需要正确地设置CORS策略来允许跨域请求。

2、跨域解决

2.1、vue2+vue-cli的形式

用到vue-cli脚手架,我们需要在vue.config.js这个配置文件进行配置proxy代理,如下:

module.exports = {
    outputDir: path.resolve(__dirname, `./dist`),//打包后的dist存放在当前目录下
    publicPath: './', //生产环境的项目前缀
    productionSourceMap: false,
    devServer: {
        open: true, //启动项目是否自动弹出浏览器
        port: 8080, //开发服务器的端口号
        host: 'localhost',  //开发服务器的主机名
        proxy: {
          '/api': {
            target: 'http://localhost:8085', // 目标服务器地址,也就是后端服务地址
            changeOrigin: true, // 是否改变源地址
            pathRewrite: {
              '^/api': '' // 重写路径
            }
          }
       }
    }
}

在axios创建时,加上baseUrl,这里需要判断一下是否为生产环境,如果为生产环境,将baseUrl改为api-prod,为的就是和开发环境区分开

let baseUrl = "/api";
//判断是否生成/开发环境
if(process.env.NODE_ENV === 'production'){
    //是生产环境
    baseUrl = '/api-prod';
}
const service = axios.create({
    baseURL: baseUrl,  
    timeout: 200000  // 请求后期时间(毫秒)
});

在生产环境中,这样配置是不生效的,需要借助Nginx反向代理来解决跨域问题,在linux服务器安装Nginx后,先把前端项目打包dist后上传至nginx目录下,找到nginx.conf配置文件,进行编译

server{
  listen 80;

  location /{
     root  /usr/share/nginx/dist;
	 try_files $uri $uri/ /index.html;
	 index index.html index.htm;	      
  }

  location /api-prod/ {
	 proxy_pass http:localhost:8085/;     
  }
}

2.2、vue3+vite的形式

如果用vite脚手架进行开发,需要在vite.config.ts配置文件进行配置,语法与vue-cli有一点不一样

export default defineConfig({
  root:process.cwd(),  //项目根路径
  base: '/', //生产环境服务的公共基础路径
  publicDir: resolve(__dirname, './dist'),
  build: {
    outDir: 'dist', // 构建输出目录
    assetsDir:'static',//指定静态资源存放路径
    minify: true, // 是否压缩代码
    sourcemap: true, // 是否生成 source map
  },
  plugins: [
    vue(),
  ],
  resolve: {
    alias: {
      '@': fileURLToPath(new URL('./src', import.meta.url))
    }
  },
  server: {
    port: 8085,  //开发环境端口号
    open: true,  //是否自动弹出浏览器
    proxy: {
      '/api': {
        target: 'http://localhost:8085',  //需要代理到的目的服务器地址
        changeOrigin: true,   //是否改变源地址
        rewrite: (path) => path.replace(/^\/api/, ''), //注意这里的语法和vue-cli不一样
      }
    }
  }
})

在创建axios时,设置baseUrl

const BASE_URL = process.env.NODE_ENV === 'production' ? '/api-prod' : '/api'
const httpInstance = axios.create({
    baseURL: BASE_URL,  // 基地址
    timeout: 5000    // 超时器
})

同样的,上面这些配置只适用于开发环境,如果生产环境的话,需要借助Nginx进行反向代理,

打包前端项目为dist,在nginx进行配置

server{
  listen 80;

  location /{
     root  /usr/share/nginx/dist;
	 try_files $uri $uri/ /index.html;
	 index index.html index.htm;	      
  }

  location /api-prod/ {
	 proxy_pass http:localhost:8085/;     
  }
}

3、后端如何解决跨域?

上面介绍了这么多,都是前端进行解决的,那么后端如何解决跨域问题呢?

进行CORS配置,有三种方式

3.1、@CrossOrigin注解局部跨域(方式一)

最简单也是最方便的方法就是在类上或者方法上加上@CrossOrigin注解进行局部跨域

@RestController
@RequestMapping("/user")
@CrossOrigin
public class UserController {
    @Autowired
    private UserService userService;

    @RequestMapping("/login")
    public Result<LoginVo> login(@RequestBody  LoginDto loginDto) {
        LoginVo loginVo = userService.login(loginDto);
        return Result.success(loginVo,"登录成功!");
    }

}

3.2、实现WebMvcConfigurer接口全局跨域(方式二)

但是这样有一个问题,如果控制层太多,那岂不是一个个的加,所有有一个全局配置的方式,就是实现WebMvcConfigurer接口,重写addCorsMappings方法

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class MyWebMvcConfig implements WebMvcConfigurer {
    private static final String ORIGINS[] = new String[]{"GET", "POST", "PUT", "DELETE", "OPTIONS"};

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**") // 所有的当前站点的请求地址,都支持跨域访问。
                .allowedOriginPatterns("*") // 所有的外部域都可跨域访问。 如果是localhost则很难配置,因为在跨域请求的时候,外部域的解析可能是localhost、127.0.0.1、主机名
                .allowCredentials(true) // 是否支持跨域用户凭证
                .allowedMethods(ORIGINS) // 当前站点支持的跨域请求类型是什么
                .maxAge(3600); // 超时时长设置为1小时。 时间单位是秒。
    }
}

3.3、配置CorsFilter全局跨域(方式三)

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;

@Configuration
public class CorsConfig {

    @Bean
    public CorsFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        // 设置允许跨域请求的域名
        config.addAllowedOrigin("*");
        // 设置允许跨域请求的请求头
        config.addAllowedHeader("*");
        // 设置允许跨域请求的请求方法
//        config.addAllowedMethod("*");  放行所有请求方法
        config.addAllowedMethod("GET");
        config.addAllowedMethod("POST");
        config.addAllowedMethod("PUT");
        config.addAllowedMethod("DELETE");
        // 是否携带cookies
        // config.setAllowCredentials(true);

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        // 对所有路径进行跨域配置
        source.registerCorsConfiguration("/**", config);

        return new CorsFilter(source);
    }
}

好了,文章到这里就结束了,相信大家看完这篇文章后,对跨域问题有一些新的见解,点赞关注支持一下哟~

vue2-vue项目中你是如何解决跨域的? Proxy:代理(proxy)也称网络代理,是一种特殊的网络服务,允许一个(一般为客户端)通过这个服务与另一个网络终端(一般成为服务端)进行非直接的连接。一定要注意跨域是浏览器的限制,你用抓包工具抓取接口数据,是可以看到接口已经把数据返回回来了,只是浏览器的限制,你获取不到数据,用postman请求接口能够请求到数据。同源策略(sameoriginpolicy),是一种约定,它是浏览器最核心也是最基本的安全功能。反之非同源请求,也就是协议,端口,主机其中一项不相同的时候,这个时候就会产生跨域。 阅读详情

相关推荐

SpringBoot+VUE跨域问题

场景及问题描述: 项目为前后端分离,后端项目使用Maven多模块项目+SpringBoot,前端使用 VUE。 后端在登录接口保存当前用户信息到session,前端请求后端接口,后端拦截器无法从session中获取当前登录的用户,前端出现以下跨域报错 错误信息: The value of the 'Access-Control-Allow-Origin' header in the ...

github_39325328的博客 1万+

Vue2解决跨域的3种方式

1、什么是同源请求,什么是跨域请求? 客户端和服务器进行数据交互请求时,请求协议、请求的url地址、请求的端口,这三项设定如果都相同称为同源请求,这三项设定如果有一项不同称为跨域请求。 2、相对路径都是同源请求,可以获取响应体数据。 3、服务器为了保护数据安全,只允许同源请求获取响应体数据,如果是跨域请求,不能正确的获取响应体数据,会有跨域访问报错。

Mjjie_的博客 6556

Vue3全局配置Axios并解决跨域请求问题示例详解

在这里,我们自定义axois实例化对象,配置了默认的访问i后端ip和端口等,并在末尾使用export 导出api配置,便于在其他单文件中引入 request.ts.对于前后端分离项目,前端和后端端口不能重复,否则会导致前端或者后端服务起不来。这里提供两种解决方案,都是基于后端跨域访问的配置,前端不作任何允许跨域访问的设置,因为试过无效。(1)axios 是一个基于promise的HTTP库,支持promise所有的API。在项目根目录下,也就是src目录下创建文件夹api/,并创建。

aaa123aaasqw的博客 1万+

Vue2怎么解决跨域问题

vue2实现跨域请求该怎么做,axios请求跨域怎么办?解决跨域

qq_57423665的博客 7655

SpringBoot+Vue完美解决跨域问题

本人做后端用springboot,同时前端用vue,遇到了跨域问题,以下为解决方案和心得 1、浏览器同源策略 什么是浏览器同源策略? 简单的来说,如果两个页面的协议,域名和端口(如有)都相同,则两个页面具有相同的源。 2、前端对跨域的设置 前端对跨域的设置仅仅需要在request中添加一个属性值withCredentials withCredentials=flase 或 withCrede...

yuanyaunlv的博客 2842

Vue 2.0 跨域代理解决方案

然而,在开发 Vue.js 应用程序时,我们经常需要与不同域上的 API 进行通信,因此跨域问题是我们常常需要处理的问题之一。通过简单的配置,我们可以将 API 请求转发到另一个域,以避免浏览器的跨域限制。首先,我们需要创建一个 Vue 项目。在创建项目的过程中,可以选择手动配置特性,确保选择了 Babel 和 Vue Router。在开发服务器启动后,你应该能够在浏览器中访问项目,并且 API 请求会被代理到指定的目标域。现在我们可以在 Vue 组件中发起 API 请求,并使用代理来避免跨域问题。

ZujbMl的博客 1145

cors 前后端分离跨域问题_前后端分离开发,Vue 如何处理跨域问题?

松哥原创的 Spring Boot 视频教程已经杀青,感兴趣的小伙伴戳这里-->Spring Boot+Vue+微人事视频教程Spring Boot + Vue 这一对技术栈目前看来可以说是非常的火热,关于 Spring Boot 松哥已经写过多篇教程,如:40 篇原创干货,带你进入 Spring Boot 殿堂!前后端分离的文章也写过好几篇了,例如:一个Java程序猿眼中的前后端...

weixin_36304806的博客 838

Outlook总是提示登录微软,怎么办?

Outlook 2021反复弹出Microsoft登录窗口,可能是由于Modern Authentication身份验证机制或凭据问题导致。解决方案包括:1)通过注册表关闭Modern Authentication(适用于本地Exchange);2)清理Windows凭据管理器中的旧认证信息;3)手动配置Exchange服务器地址;4)通过注册表阻止Microsoft登录窗口弹出(适用于非M365环境)。建议按顺序尝试,尤其前两步通常能解决问题。经测试,步骤1和2已有效解决该问题。

剪刀石头布 4661

SpringBoot与Vue交互解决跨域问题【亲测已解决】

Hello,你好呀,我是灰小猿,一个超会写bug的程序猿! 最近在利用springboot+vue整合开发一个前后端分离的个人博客网站,所以这一篇总结一下在开发中遇到的一个问题,关于解决在使用vue和springboot在开发前后端分离的项目时,如何解决跨域问题。在这里分别分享两种方法,分别在前端vue中解决和在后台springboot中解决。 浏览器同源策略 为什么会出现跨域问题? 首先一个定义一定要了解,就是浏览器的同源策略, 什么是浏览器的同源策略, 简单来说就是浏览器发送请求的协议、域名和端口要和

累计发表博客60余万字,优快云 博客专家、Java 领域优质创作者、华为云享专家、阿里云专家博主。专注分享 Java 优质文章,毕设实战项目开发,全网粉丝10W+ 1万+

SAP ABAP开发避坑:BAPI_MATVAL_PRICE_CHANGE调用报‘估价未维护’的完整解决流程

本文深入解析SAP ABAP开发中调用BAPI_MATVAL_PRICE_CHANGE函数时遇到的'估价未维护'错误,提供从基础配置检查到CKML_PRICE_SEND表维护的完整解决方案。通过实战案例和代码示例,帮助开发者快速定位问题并实现批量价格更新的自动化处理,提升开发效率。

weixin_28705087的博客 424

Windows加域迁移避坑指南:Profwiz工具实战中的5个常见问题与解决方案

本文详细解析了使用Profwiz工具进行Windows加域迁移时的5个常见问题及解决方案,包括临时配置文件生成、密码策略冲突、SID冲突等。通过实战案例和优化技巧,帮助IT运维团队高效完成账户配置文件迁移,确保Active Directory环境下的数据完整性和权限无缝衔接。

q9r0s的博客 512

Vue Axios之生产/开发环境跨域问题解决

Vue Axios开发环境、生产环境跨域问题解决 一、前置知识 首先要了解几个Vue-cli的几个配置参数。另:从 Vue CLI 3.3 起baseUrl已弃用,请使用publicPath 1. publicPath 它是部署你的应用包时的基本URL。默认为 '/'。Vue Cli默认项目是被部署在域名的根路径下。比如你要把打包生成的文件部署在https://www.lhch.com下,那么采用默认设置就行。 那如果我们是部署在https://www.lhch.com/test/路径下呢?那么此时可以

进无止进 8090

Android开发中StateFlow与LiveData的5个关键区别及实战避坑指南

本文深度解析了Android开发中StateFlow与LiveData的5个核心区别,包括设计哲学、生命周期管理、值更新策略、线程模型及协程生态整合。通过实战代码对比,为开发者在现代MVVM架构下的状态管理选型提供清晰的决策指南和避坑建议,帮助构建更健壮、可测试的应用。

weixin_29012677的博客 402

解决SpringBoot和前端Vue的跨域问题

要了解什么是跨域,我们先说一下同源的概念。同源,是指协议、域名、端口都相同。例如:http://192.168.0.1:8080与https://192.168.3.1:8080不是同源,因为协议不同,第一个冒号前面的为协议,中间的为域名,第二个冒号后面的为端口,只要满足有一处不同,则就不是同源。所谓跨域就是从 A 向 B 发请求,如若他们的地址协议、域名、端口都不相同,直接访问就会造成跨域问题,跨域是非常常见的现象!请求是跨域的但并不一定会报错,普通的图片请求。css文件请求是不会报错的。

不愧是暮言的博客 4529

msfvenom制作windows/linux/android/ios木马

msfvenom选项如下 -p, --payload<payload> 指定 payload(攻击荷载)。如果使用自定义payload,请使用'-'或者stdin指定。 -l, --list [module_typel列出指定模块的所有可用资源。模块类型包括:payloads, encoders, nops, all -n, --nopsled <length>为payload预先指定一个NOP滑动长度。 -f, --format <format>指定输出格式(使

Cwillchris的博客 2732

算法 | A*算法实现最优路径规划

启发式探索是利用问题拥有的启发信息来引导搜索,达到减少探索范围、降低问题复杂度的目的。A*寻路算法是启发式探索的一个典型实践,在寻路搜索的过程中,给每个节点绑定了一个估计值(即启发式),在对节点的遍历过程中采取估计值优先原则,估计值更优的节点会被优先遍历。...

不断学习,不断进步,提高自己 6629

vue2/3,Spring Boot以及生产环境跨域解决方案

Vue CLI为Webpack项目提供了简单的代理配置方式。你可以通过创建或编辑项目的根目录下的确保你的前端请求都通过/api。

m0_50742275的博客 2331

【光斑定位】空间激光通信、光斑定位、CCD、光斑定位——13000字

0.完整源码获得方式 订阅MATLAB/FPGA教程,免费获得教程案例以及任意2份完整源码 ----------------------------------------------------------------- 空间激光通信是指以光波作为载波进行数据传输的一种通信方式。目前,空间激光通信己成为人们关注的焦点。在空间激光通信系统中,光斑定位是是一项关键技术。 本论文首先对国内外空间激光通信系统的研究现状进行了阐述,论述了空间激光通信的理论只是,并对CCD成像原理,...

FPGA/MATLAB学习教程/源码/项目合作开发 1288

跨域问题(vue2 + springboot)

跨域问题的前后端解决方式

qq_38923350的博客 1771

YOLOv11改进 | 细节涨点篇 | DySample一种最新的轻量化动态上采样算子(效果完爆CARAFE)

本文给大家带来的最新改进机制是一种号称超轻量级且有效的动态上采样器——DySample。与传统的基于内核的动态上采样器相比,DySample采用了一种基于点采样的方法,相比于以前的基于内核的动态上采样器,DySample具有更少的参数、浮点运算次数、GPU内存和延迟。此外,DySample在包括语义分割、目标检测、实例分割、全景分割和单目深度估计在内的五个预测任务中,性能均优于其他上采样器(截至目前最有效的上采样算子),

Snu77的博客 4208

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

vue项目前端解决跨域问题

在前后端分离项目中,跨域是一定会出现的问题,本文主要介绍跨域问题的解决思路,以及在vue项目中如何使用代理的方式在前端解决跨域问题,同时提供一个后段解决的方案。

baidu_40120883的博客 9129

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

SpringBoot+Vue使用axios解决跨域问题

最近在学习VUE,学到发送请求这个阶段了   推荐上B站  上面好多大神的教学视频 由于 vue更新到2.0之后vue-resource不再更新,强烈推荐使用axios发送请求,因此入手了axios 使用非常简单,直接查看官方文档就行:https://github.com/axios/axios 这个是中文文档:https://www.kancloud.cn/yunye/axios/2348...

一名准程序员 4278

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

SpringBoot+Vue:一站式解决跨域问题

跨域问题(CORS,Cross-Origin Resource Sharing)是由于浏览器的同源策略导致的一种安全限制。当一个请求的域名、协议或端口与当前页面不一致时,就会触发跨域问题。

3460

springboot+vue前后端分离跨域问题

这是我springbooot+vue前后端分离学习遇到跨域问题的解决方案,欢迎参考。

qq_57585993的博客 3565
上一篇: Nginx中proxy_pass的斜杠问题(最详细讲解)
下一篇: SpringBoot+Vue3+SSE实现实时消息语音播报
程序员along
博客等级 码龄5年 6085粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值