程序员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

(进入注册为作者充电)

  • SpringMVC

    • SpringMVC 入门
    • Spring MVC 数据接收
    • Spring MVC 数据返回
    • Spring MVC 路径匹配规则
    • Spring MVC 内容协商策略
    • Spring MVC 异步请求处理
    • Spring MVC 静态资源处理
    • Spring MVC 自定义格式化器
    • SpringMVC 自定义拦截器
    • SpringMVC 配置跨域(CORS)
      • 1. 使用 addCorsMappings 配置 CORS
      • 2. 处理跨域配置失效问题
      • 3. CORS 配置的注意事项
      • 4. 适用场景
    • Spring MVC 自定义视图控制器
    • Spring MVC 自定义视图解析器
    • Spring MVC 自定义方法参数解析器
    • Spring MVC 自定义返回值处理器
    • Spring MVC 自定义消息转换器
    • Spring MVC 消息转换器扩展
    • Spring MVC 自定义异常处理器
    • Spring MVC 自定义异常处理器扩展
  • SpringMVC
  • SpringMVC
scholar
2024-08-17
目录

SpringMVC 配置跨域(CORS)

# SpringMVC 配置跨域(CORS)

前言

在构建现代Web应用时,前后端分离架构常常需要处理跨域请求问题。Spring MVC 提供了灵活的方式来配置跨域资源共享(CORS),可以通过 WebMvcConfigurer 接口的 addCorsMappings 方法进行配置。同时,为了解决跨域配置可能失效的问题,通常还需要结合自定义过滤器来确保跨域设置生效。

# 1. 使用 addCorsMappings 配置 CORS

在 Spring MVC 中,最常见的跨域配置方式是通过实现 WebMvcConfigurer 接口并重写 addCorsMappings 方法:

@Configuration
public class MyWebConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        // 配置跨域请求处理的规则
        registry.addMapping("/**") // 对所有路径应用 CORS 规则
                .allowedOrigins("*") // 允许所有来源的请求
                .allowedHeaders("*") // 允许所有请求头
                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") // 允许的 HTTP 请求方法
                .allowCredentials(true) // 允许发送 Cookie 信息
                .maxAge(3600); // 预检请求的缓存时间为 3600 秒(1 小时)
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

关键配置参数:

  • addMapping("/**"):指定哪些路径需要进行跨域配置。"/**" 表示应用于所有路径。
  • allowedOrigins("*"):允许的请求来源,"*" 表示允许所有来源。如果你需要限制来源,可以将其设置为指定的域名列表。
  • allowedHeaders("*"):允许的请求头,"*" 表示接受所有请求头。如果你需要限制某些请求头,可以指定具体的头部信息。
  • allowedMethods("GET", "POST", ...):允许的请求方法,例如 GET、POST、PUT 等。
  • allowCredentials(true):是否允许发送凭证(如 Cookies、HTTP 认证信息等)。设置为 true 时,allowedOrigins 不应为 *,而应该指定具体的域名。
  • maxAge(3600):预检请求的缓存时间,单位为秒。浏览器会在指定时间内缓存预检请求的结果,从而避免每次发送跨域请求时都执行预检请求。

# 2. 处理跨域配置失效问题

在一些场景下,使用 addCorsMappings 进行跨域配置可能会失效,特别是在使用自定义拦截器的情况下。其原因是请求在进入跨域处理器之前可能被其他拦截器拦截,从而导致跨域响应头未被正确设置。

解决方案:

为了确保跨域配置始终生效,可以使用过滤器设置跨域允许信息。过滤器会在拦截器之前执行,因此无论拦截器如何处理请求,跨域设置都会生效。

@Bean
public FilterRegistrationBean<CorsFilter> corsFilter() {
    CorsConfiguration configuration = new CorsConfiguration();
    configuration.setAllowedOrigins(Arrays.asList("*")); // 允许所有来源
    configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS")); // 允许的请求方法
    configuration.setAllowedHeaders(Arrays.asList("*")); // 允许所有请求头
    configuration.setAllowCredentials(true); // 允许发送凭证

    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/**", configuration); // 应用到所有路径

    FilterRegistrationBean<CorsFilter> bean = new FilterRegistrationBean<>(new CorsFilter(source));
    bean.setOrder(Ordered.HIGHEST_PRECEDENCE); // 设置过滤器的执行顺序为最高优先级
    return bean;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

关键配置说明:

  • CorsConfiguration:用于定义跨域规则,包括允许的来源、请求方法、请求头等。
  • UrlBasedCorsConfigurationSource:根据 URL 路径配置跨域规则。
  • FilterRegistrationBean<CorsFilter>:注册跨域过滤器并设置其执行顺序为最高优先级,确保它在其他过滤器之前执行。

# 3. CORS 配置的注意事项

  • 预检请求(OPTIONS):跨域请求中,浏览器会先发送一个 OPTIONS 请求作为预检请求,以确定服务器是否允许实际请求。这种请求不会携带实际数据,但必须通过 CORS 验证。
  • allowCredentials(true) 与 allowedOrigins("*") 的冲突:如果设置了 allowCredentials(true),allowedOrigins 不应为 "*",而应该指定具体的域名,否则会导致浏览器拒绝请求。
  • 过滤器的优先级:跨域过滤器的优先级应设置为最高,以避免后续拦截器或过滤器在返回响应之前影响跨域设置。

# 4. 适用场景

  • 单点登录(SSO)系统:跨域共享认证信息和凭证。
  • 前后端分离架构:不同域名、端口之间的数据交互。
  • 第三方 API 集成:允许其他系统通过 CORS 访问你的服务。

通过以上配置,Spring MVC 能够灵活应对跨域请求,确保前端和后端在不同域之间的数据交换顺畅进行,同时保持良好的安全性。

编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08
SpringMVC 自定义拦截器
Spring MVC 自定义视图控制器

← SpringMVC 自定义拦截器 Spring MVC 自定义视图控制器→

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