程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • 后端开发

    • Spring Boot多模块项目开发
    • Spring Boot图片资源返回
    • Spring Boot文件上传
    • Spring Boot文件下载
    • 对接第三方文件上传
    • Servlet 原生API
    • HttpServletResponse 和 ResponseEntity
    • 后端解决跨域问题
      • 一、使用 @CrossOrigin 注解
      • 二、实现 WebMvcConfigurer 接口进行全局配置
      • 三、自定义 CorsFilter
      • 四、三种方式的对比
    • 后端拦截器
    • SpringBoot+Vue实现邮件发送与验证码验证
    • 谷歌验证码
    • 利用hutool工具类实现图片验证码
    • 统一返回格式
    • 通用 普通 登录模块
    • 通用 JWT 登录认证模块
    • 通用 普通 注册模块
    • 基于 MyBatis curd
    • 基于 MyBatis-Plus curd
    • Java 常见对象模型
    • 开发枚举的使用
    • MyBatis与MyBatis-Plus日期类型处理
    • 接口日志拦截基础版
    • 接口日志拦截进阶版
    • 文件操作工具类
    • Spring Boot 数据校验
    • 幂等性
  • 前端开发

  • 开发笔记
  • 后端开发
scholar
2024-12-27
目录

后端解决跨域问题

# Spring Boot 中处理跨域的几种方式

前言

在 Spring Boot 中,跨域资源共享(CORS, Cross-Origin Resource Sharing)是一个常见问题。默认情况下,浏览器出于安全考虑,阻止前端对不同源(协议、域名或端口)的请求。为了允许跨域请求,我们可以通过多种方式在后端进行配置。

# 一、使用 @CrossOrigin 注解

@CrossOrigin 注解是最简单的一种跨域配置方式,通常用于局部接口的跨域处理。

适用场景:需要对某个特定的控制器或方法进行跨域配置。

代码示例:

@RestController
@RequestMapping("/api")
@CrossOrigin(origins = "http://example.com", maxAge = 3600) // 允许来自指定来源的跨域请求
public class ExampleController {

    @GetMapping("/data")
    public String getData() {
        return "This is a cross-origin response.";
    }
}
1
2
3
4
5
6
7
8
9
10

关键配置项:

  • origins = "http://example.com":指定允许的跨域来源。
  • maxAge = 3600:指定预检请求的缓存时间(单位:秒),减少跨域请求的预检次数。

优点:简单快捷,适合对单个控制器或方法进行配置。

缺点:配置分散,不适合需要统一管理跨域规则的场景。


# 二、实现 WebMvcConfigurer 接口进行全局配置

WebMvcConfigurer 接口提供了更灵活的跨域配置方式,可以对整个应用进行统一的跨域设置。

适用场景:需要全局统一配置跨域规则,或者对部分路径进行跨域处理。

代码示例:

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

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        // 配置允许跨域的路径
        registry.addMapping("/**")
                // 允许的跨域来源
                .allowedOrigins("http://example.com")
                // 允许的请求头
                .allowedHeaders("*")
                // 允许的请求方法
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                // 是否允许携带 Cookie
                .allowCredentials(true)
                // 预检请求的有效期,单位为秒
                .maxAge(3600);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

关键配置项:

  • addMapping("/**"):配置允许跨域的路径,"/**" 表示应用于所有路径。
  • allowedOrigins("http://example.com"):指定允许跨域的来源。
  • allowedHeaders("*"):允许的请求头,"*" 表示允许所有请求头。
  • allowedMethods("GET", "POST", "PUT", "DELETE"):允许的请求方法。
  • allowCredentials(true):是否允许携带 Cookie,注意与 allowedOrigins("*") 不能同时使用。
  • maxAge(3600):预检请求的有效期。

优点:全局配置,便于统一管理跨域规则。

缺点:配置需要在代码层面实现,灵活性较高,但不如注解简单。


# 三、自定义 CorsFilter

自定义 CorsFilter 是一种底层的跨域处理方式,通过过滤器对所有请求进行跨域配置,适合更复杂的场景。

适用场景:需要更精细的跨域控制,如在过滤器中动态设置跨域规则。

代码示例:

package com.example.common.config;

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() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        
        // 配置跨域规则
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedOrigin("*"); // 允许所有来源
        corsConfiguration.addAllowedHeader("*"); // 允许所有请求头
        corsConfiguration.addAllowedMethod("*"); // 允许所有方法
        corsConfiguration.setAllowCredentials(true); // 允许携带 Cookie
        
        // 对所有路径应用跨域配置
        source.registerCorsConfiguration("/**", corsConfiguration);
        
        return new CorsFilter(source);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

关键配置项:

  • addAllowedOrigin("*"):允许所有来源。生产环境下,建议明确配置允许的来源。
  • addAllowedHeader("*"):允许所有请求头。
  • addAllowedMethod("*"):允许所有请求方法。
  • setAllowCredentials(true):允许携带 Cookie,注意此配置与 allowedOrigins("*") 不能同时使用。

优点:适用于需要更精细化控制的跨域场景,可以通过编程方式动态调整跨域规则。

缺点:实现复杂度较高,通常用于更复杂的跨域控制需求。


# 四、三种方式的对比

方式 优点 缺点 适用场景
@CrossOrigin 注解 简单快捷,适合局部配置 配置分散,难以统一管理跨域规则 需要对单个控制器或方法进行跨域配置时
实现 WebMvcConfigurer 接口 全局配置,灵活性高 配置在代码层面实现,灵活性高但复杂度也较高 需要全局统一配置跨域规则时
自定义 CorsFilter 底层控制,适合复杂的跨域需求 实现复杂度较高,需要处理更多细节 需要动态调整跨域规则或更精细化控制时

总结

  1. 对于简单的跨域需求,如只针对单个控制器或方法,使用 @CrossOrigin 注解即可。
  2. 如果项目中所有接口都需要支持跨域,推荐通过实现 WebMvcConfigurer 接口进行全局配置。
  3. 如果需要更精细化或动态的跨域控制,可以自定义 CorsFilter 来实现。
编辑此页 (opens new window)
上次更新: 2025/03/16, 22:19:39
HttpServletResponse 和 ResponseEntity
后端拦截器

← HttpServletResponse 和 ResponseEntity 后端拦截器→

Theme by Vdoing | Copyright © 2019-2025 程序员scholar
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式