惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

IT之家
IT之家
T
Tailwind CSS Blog
V
V2EX
阮一峰的网络日志
阮一峰的网络日志
H
Help Net Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
腾讯CDC
GbyAI
GbyAI
酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Last Week in AI
Last Week in AI
A
About on SuperTechFans
L
LangChain Blog
Engineering at Meta
Engineering at Meta
F
Fortinet All Blogs
G
Google Developers Blog
The Cloudflare Blog
云风的 BLOG
云风的 BLOG
D
Docker
博客园 - 聂微东
博客园 - 司徒正美
Recent Announcements
Recent Announcements
MyScale Blog
MyScale Blog
U
Unit 42

Lanke

Google 账号地区是日本,ChatGPT 订阅为什么还是美元? 在 Flutter 项目里折腾苹果的液态玻璃效果 从“宅斗庶女”看极端女权 一期一会 关于梦 用 Vercel AI Gateway 给博客做一个 AI 摘要服务 Claude 搜索网页报错:Unable to verify if domain is safe to fetch 的解决方法 Flutter输入面板布局优化:键盘、表情面板与@联想的丝滑切换 再谈语言和思维 还有人记得 在2026年拥有自己的博客 为 Astro 博客添加 llms.txt 使用 LLM Wiki 作为 Hermes Agent 的记忆系统 使用Obsidian 作为 Hermes Agent 的记忆数据库 流畅的下滑关闭页面 遇到的一起生产事故 好看的鼠标样式 拖了很久的更新,还是来了 Linux · 常用日志查询命令 面试 · Java面试二 面试 · Java面试一 如何实现验证码及校验 在电脑上共存MySQL 三道前端题 「随便来点」失语症 一些碰到的面试问题 关于博客主题的自问自答 重装电脑后恢复MySQL数据 如何畅玩旮旯game之软件篇--串流 欢迎来到实力至上主义教室
前后端跨域问题
Lanke · 2025-03-23 · via Lanke

前后端跨域问题

前后端对接的时候,很容易出现跨域问题。从前端和后端都可以解决

前端

这是典型的跨域(CORS)问题。当浏览器从一个源(Origin)请求资源时,如果目标资源不在同一个源,就会触发 CORS 策略。

解决方案

方案一:在 Spring Boot 中添加 CORS 配置

创建一个 CORS 配置类:

java

package com.lanke.config;

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 CorsConfig implements WebMvcConfigurer {

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**")
                        .allowedOrigins("http://localhost:3000") // 允许的前端源
                        .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") // 允许的 HTTP 方法
                        .allowedHeaders("Content-Type", "Authorization") // 允许的请求头
                        .allowCredentials(true) // 允许携带 Cookie
                        .maxAge(3600); // 预检请求的有效期(秒)
            }
        };
    }
}

方案二:使用注解(适用于特定接口)

在需要跨域的控制器类或方法上添加 @CrossOrigin 注解:

java

@RestController
@RequestMapping("/user")
@CrossOrigin(origins = "http://localhost:3000", allowedHeaders = "Authorization")
public class UserController {
    // 接口方法
}

关键配置说明

配置项说明
allowedOrigins允许的前端源(如 http://localhost:3000),支持 * 表示所有源
allowedMethods允许的 HTTP 方法(如 GET, POST
allowedHeaders允许的请求头(如 Content-Type, Authorization
allowCredentials是否允许携带 Cookie,设为 trueallowedOrigins 不能为 *
maxAge预检请求(OPTIONS)的缓存时间,单位秒

前端请求验证

确保前端在请求中正确设置跨域相关的头信息(例如携带 Authorization):

javascript

// JavaScript 示例(Axios)
axios.post(
  'http://localhost:8080/user/login',
  {
    username: 'lanke',
    password: '123456',
  },
  {
    headers: {
      Authorization: 'Bearer YOUR_TOKEN',
    },
  },
)

常见问题

  1. 预检请求(OPTIONS)

    • 浏览器会先发送 OPTIONS 请求进行预检,确保后端正确响应 200 OK 并包含 Access-Control-Allow-* 头。
    • 如果 OPTIONS 请求失败,检查后端是否拦截了该方法。
  2. 携带 Cookie

    • 若需携带 Cookie,需同时设置 allowCredentials: trueallowedOrigins 为具体源(不能为 *)。
  3. 路径匹配

    • 确保 addMapping("/**") 覆盖所有需要跨域的接口路径。

前端与后端的联系

前端到底是怎么访问到后端 api 呢?

主要是依靠我们的 vite.config.ts 中的配置

ts

server: {
            host: '0.0.0.0',
            port: 3000, // 设置默认启动端口为 3000
            open: true,
            proxy: {
                '/api': {
                    target: env.VITE_APP_BASE_API,
                    changeOrigin: true,
                    rewrite: (path) => path.replace(/^\/api/, ''),
                },
            },
        }

我们通过代理配置,将有 /api 有关的链接都拼接成后端的地址,这样我们就能访问成功了。

所以你可以在后端统一使用前缀 /api 也可以自己在前端,把各个接口都进行代理

文章标题:前后端跨域问题

文章作者:Lanke

文章链接:https://blog.blueke.top/posts/792079[复制]

最后修改时间:


商业转载请联系站长获得授权,非商业转载请注明本文出处及文章链接,您可以自由地在任何媒体以任何形式复制和分发作品,也可以修改和创作,但是分发衍生作品时必须采用相同的许可协议。
本文采用CC BY-NC-SA 4.0进行许可。