SpringBoot 如何解决跨域问题?

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: 本文深入探讨了Spring Boot解决跨域问题的方法,包括全局配置CORS、使用@CrossOrigin注解和自定义过滤器,提供了详细的代码示例和分析,帮助开发者有效应对Web开发中的跨域挑战。

跨域问题是Web开发中常见的问题之一,特别是在前后端分离的项目中。Spring Boot作为一个流行的Java后端框架,提供了多种方式来解决跨域问题。本文将深入探讨Spring Boot如何解决跨域问题,包括原理分析、代码实现和示例展示。

跨域问题

什么是跨域

跨域是指浏览器出于安全考虑,对来自不同域名、协议或端口的请求进行限制。通常,当一个网页发起的请求目标是与其来源不同的域时,就会发生跨域问题。浏览器采用同源策略(Same-Origin Policy)来阻止某些不安全的请求。

同源策略

同源策略是浏览器的一个安全特性,用于防止恶意网站读取另一个网站的敏感信息。只有当协议、域名和端口号都相同时,浏览器才允许请求通过。

CORS

CORS,全称 Cross-Origin Resource Sharing 翻译为跨域资源共享,它使用额外的 HTTP头来告诉浏览器允许 Web应用从不同的域进行请求。CORS是 W3C的一个标准,允许服务器声明哪些源站点可以访问它的资源。

Spring Boot如何解决跨域?

整理来说,Spring Boot解决跨域问题的方法有三种:

  1. 全局配置CORS
  2. 使用@CrossOrigin注解
  3. 自定义过滤器

全局配置CORS

在Spring Boot中,可以通过实现WebMvcConfigurer接口来全局配置CORS。

java

代码解读

复制代码

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

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("http://example.com")
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                .allowedHeaders("*")
                .allowCredentials(true)
                .maxAge(3600);
    }
}

代码分析

  • addMapping("/**"): 允许所有路径的请求。
  • allowedOrigins("http://example.com"): 允许的跨域请求来源。
  • allowedMethods("GET", "POST", "PUT", "DELETE"): 允许的HTTP方法。
  • allowedHeaders("*"): 允许的请求头。
  • allowCredentials(true): 是否允许发送Cookie。
  • maxAge(3600): 预检请求的缓存时间。

使用@CrossOrigin注解

Spring提供了@CrossOrigin注解用于简化跨域配置。可以在控制器类或方法级别使用。

java

代码解读

复制代码

import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {

    @CrossOrigin(origins = "http://example.com")
    @GetMapping("/greet")
    public String greet() {
        return "Hello World";
    }
}

代码分析

  • @CrossOrigin(origins = "http://example.com"): 指定允许跨域的来源。
  • 可以在类级别使用@CrossOrigin,应用于该类的所有请求方法。

自定义过滤器

通过自定义过滤器,可以更灵活地处理跨域请求。

如下示例代码,自定义过滤器 CorsFilter 实现 Filter,从而允许https://yuanjava.com 作为跨域的来源。

java

代码解读

复制代码

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

import org.springframework.stereotype.Component;

@Component
public class CorsFilter implements CorsFilter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletResponse res = (HttpServletResponse) response;
        res.setHeader("Access-Control-Allow-Origin", "https://yuanjava.com");
        res.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
        res.setHeader("Access-Control-Allow-Headers", "Content-Type");
        res.setHeader("Access-Control-Allow-Credentials", "true");
        
        if ("OPTIONS".equalsIgnoreCase(((HttpServletRequest) request).getMethod())) {
            res.setStatus(HttpServletResponse.SC_OK);
            return;
        }

        chain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void destroy() {
    }
}

代码分析:

  • setHeader("Access-Control-Allow-Origin", "https://yuanjava.com"): 设置允许跨域的来源。
  • setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE"): 设置允许的HTTP方法。
  • setHeader("Access-Control-Allow-Headers", "Content-Type"): 设置允许的请求头。
  • setHeader("Access-Control-Allow-Credentials", "true"): 允许发送Cookie。
  • 对于OPTIONS预检请求,直接返回状态码200。

示例展示

假设我们有一个简单的 Spring Boot应用程序,它提供一个 RESTful API。我们希望允许来自"yuanjava.com"的跨域请求。

项目结构

css

代码解读

复制代码

src
└── main
    ├── java
    │   └── com
    │       └── yuanjava
    │           ├── CorsFilter.java
    │           ├── MyController.java
    │           └── WebConfig.java
    └── resources
        └── application.properties

代码实现

  • WebConfig.java: 全局配置CORS
  • MyController.java: 使用@CrossOrigin注解
  • CorsFilter.java: 自定义过滤器

测试跨域请求

可以使用Postman或编写简单的JavaScript代码来测试跨域请求。

javascript

代码解读

复制代码

fetch('http://localhost:8080/greet', {
    method: 'GET',
    headers: {
        'Content-Type': 'application/json'
    },
    credentials: 'include'
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));

验证

  • 启动Spring Boot应用程序。
  • 通过浏览器或Postman测试API。
  • 确认跨域请求成功,并在控制台或日志中查看请求和响应。

总结

通过本文,我们详细探讨了 Spring Boot解决跨域问题的三种方法,包括全局配置、使用注解和自定义过滤器。每种方法都有其优缺点,选择哪种方式取决于应用的具体需求和复杂性。

  • 全局配置: 适用于需要统一配置跨域策略的应用。
  • @CrossOrigin注解: 适合于特定控制器或方法的跨域配置。
  • 自定义过滤器: 提供更灵活的跨域处理方式。


转载来源:https://juejin.cn/post/7431007636047003657

相关文章
|
6月前
|
人工智能 JSON 前端开发
Spring Boot解决跨域问题方法汇总
Spring Boot解决跨域问题方法汇总
|
6月前
|
Java
springboot+cors跨域处理
springboot+cors跨域处理
58 0
|
6月前
|
Java
Springboot文件下载跨域问题解决方案
Springboot文件下载跨域问题解决方案
|
1月前
|
JavaScript 前端开发 Java
解决跨域问题大集合:vue-cli项目 和 java/springboot(6种方式) 两端解决(完美解决)
这篇文章详细介绍了如何在前端Vue项目和后端Spring Boot项目中通过多种方式解决跨域问题。
356 1
解决跨域问题大集合:vue-cli项目 和 java/springboot(6种方式) 两端解决(完美解决)
|
1月前
|
Java 数据库连接 API
springBoot:后端解决跨域&Mybatis-Plus&SwaggerUI&代码生成器 (四)
本文介绍了后端解决跨域问题的方法及Mybatis-Plus的配置与使用。首先通过创建`CorsConfig`类并设置相关参数来实现跨域请求处理。接着,详细描述了如何引入Mybatis-Plus插件,包括配置`MybatisPlusConfig`类、定义Mapper接口以及Service层。此外,还展示了如何配置分页查询功能,并引入SwaggerUI进行API文档生成。最后,提供了代码生成器的配置示例,帮助快速生成项目所需的基础代码。
|
5月前
|
前端开发 安全 JavaScript
Spring Boot2 系列教程(十四)CORS 解决跨域问题
Spring Boot2 系列教程(十四)CORS 解决跨域问题
|
3月前
|
安全 前端开发 Java
Web端系统开发解决跨域问题——以Java SpringBoot框架配置Cors为例
在Web安全上下文中,源(Origin)是指一个URL的协议、域名和端口号的组合。这三个部分共同定义了资源的来源,浏览器会根据这些信息来判断两个资源是否属于同一源。例如,https://www.example.com:443和http://www.example.com虽然域名相同,但由于协议和端口号不同,它们被视为不同的源。同源(Same-Origin)是指两个URL的协议、域名和端口号完全相同。只有当这些条件都满足时,浏览器才认为这两个资源来自同一源,从而允许它们之间的交互操作。
Web端系统开发解决跨域问题——以Java SpringBoot框架配置Cors为例
|
6月前
|
JSON 安全 前端开发
跨域详解及Spring Boot 3中的跨域解决方案
本文介绍了Web开发中的跨域问题,包括概念、原因、影响以及在Spring Boot 3中的解决方案。跨域是由浏览器的同源策略限制引起的,阻碍了不同源之间的数据传输。解决方法包括CORS、JSONP和代理服务器。在Spring Boot 3中,可以通过配置CorsFilter来允许跨域请求,实现前后端分离项目的正常运行。
312 3
 跨域详解及Spring Boot 3中的跨域解决方案
|
4月前
|
前端开发 JavaScript Java
使用Spring Boot实现跨域资源共享(CORS)
使用Spring Boot实现跨域资源共享(CORS)
|
4月前
|
前端开发 JavaScript Java
使用Spring Boot实现跨域资源共享(CORS)
使用Spring Boot实现跨域资源共享(CORS)
下一篇
无影云桌面