SpringBoot 如何解决跨域问题?

本文我们详细探讨了 Spring Boot解决跨域问题的三种方法,包括全局配置、使用注解和自定义过滤器。
首页 新闻资讯 行业资讯 SpringBoot 如何解决跨域问题?

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

37030b5411073c1add5831350fb6cf589686d7.jpg

一、跨域问题

1.什么是跨域

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

2.同源策略

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

3.CORS

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

二、Spring Boot如何解决跨域?

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

  • 全局配置CORS

  • 使用@CrossOrigin注解

  • 自定义过滤器

1.全局配置CORS

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

importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.web.servlet.config.annotation.CorsRegistry;importorg.springframework.web.servlet.config.annotation.WebMvcConfigurer;@ConfigurationpublicclassWebConfigimplementsWebMvcConfigurer{@OverridepublicvoidaddCorsMappings(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): 预检请求的缓存时间。

2.使用@CrossOrigin注解

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

importorg.springframework.web.bind.annotation.CrossOrigin;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RestController;@RestControllerpublicclassMyController{@CrossOrigin(origins="http://example.com")@GetMapping("/greet")publicStringgreet(){return"Hello World";}}

代码分析:

  • @CrossOrigin(origins = "http://example.com"): 指定允许跨域的来源。

  • 可以在类级别使用@CrossOrigin,应用于该类的所有请求方法。

3.自定义过滤器

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

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

importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;importorg.springframework.stereotype.Component;@ComponentpublicclassCorsFilterimplementsCorsFilter{@OverridepublicvoiddoFilter(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);}@Overridepublicvoidinit(FilterConfig filterConfig)throws ServletException{}@Overridepublicvoiddestroy(){}}

代码分析:

  • 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。我们希望允许来自"https://yuanjava.com"的跨域请求。

1.项目结构

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

2.代码实现

  • WebConfig.java: 全局配置CORS

  • MyController.java: 使用@CrossOrigin注解

  • CorsFilter.java: 自定义过滤器

3.测试跨域请求

可以使用Postman或编写简单的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));

4.验证

  • 启动Spring Boot应用程序。

  • 通过浏览器或Postman测试API。

  • 确认跨域请求成功,并在控制台或日志中查看请求和响应。

四、总结

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

  • 全局配置: 适用于需要统一配置跨域策略的应用。

  • @CrossOrigin注解: 适合于特定控制器或方法的跨域配置。

  • 自定义过滤器: 提供更灵活的跨域处理方式。

37    2024-10-29 16:41:24    SpringBoot 跨域 Java