在现代的Web开发中,前后端分离的架构变得越来越流行。前端应用通常会运行在不同的域名或端口上,而后端API则可能部署在另一台服务器上。这种情况下,就会涉及到跨域资源共享(CORS)的问题。Spring Boot作为一个流行的Java开发框架,提供了一系列的解决方案来处理CORS问题。本文将详细介绍Spring Boot 3中的跨域方案,以及如何轻松告别CORS的烦恼。

什么是CORS

CORS(跨域资源共享)是一种机制,允许浏览器向不同于所请求资源的域发送HTTP请求。这样一来,前端可以安全地请求后端API而不必担心安全问题。浏览器在跨域请求时,会做一些限制,必须通过设置相应的HTTP头(如Access-Control-Allow-Origin)来允许跨域访问。

Spring Boot 3中的CORS解决方案

在Spring Boot 3中,我们可以通过几种方式来配置CORS。

1. 使用@CrossOrigin注解

这是最简单的方式,只需在Controller类或方法上添加@CrossOrigin注解。例如:

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

@RestController
@CrossOrigin(origins = "http://localhost:3000") // 允许来自指定源的请求
public class MyController {

    @GetMapping("/api/data")
    public String getData() {
        return "Hello from the backend!";
    }
}

在这个示例中,我们允许来自http://localhost:3000的请求访问/api/data接口。你也可以使用allowedHeadersallowedMethods等参数来进一步配置CORS策略。

2. 全局CORS配置

如果需要全局配置CORS,可以创建一个实现WebMvcConfigurer接口的配置类。这样可以避免在每个Controller上都添加注解。示例如下:

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://localhost:3000") // 允许的源
                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") // 允许的请求方法
                .allowCredentials(true) // 允许携带凭证
                .maxAge(3600); // 预检请求的有效期
    }
}

在这个配置中,我们允许从http://localhost:3000源发出的所有请求,这对API的统一管理非常有用。

3. 使用Filter方式

除了使用注解或全局配置外,我们还可以通过定义一个Filter来处理CORS。这种方式适合需要复杂处理逻辑的场景。

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.HttpServletResponse;
import java.io.IOException;

public class CustomCORSFilter implements Filter {

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) 
            throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        response.setHeader("Access-Control-Allow-Origin", "http://localhost:3000");
        response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
        response.setHeader("Access-Control-Allow-Headers", "Origin, Content-Type, Accept");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        chain.doFilter(req, res);
    }

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

    @Override
    public void destroy() { }
}

然后在@Configuration类中注册这个Filter:

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean<CustomCORSFilter> corsFilter() {
        FilterRegistrationBean<CustomCORSFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new CustomCORSFilter());
        registrationBean.addUrlPatterns("/*");
        return registrationBean;
    }
}

总结

以上介绍了Spring Boot 3中处理CORS的几种方式,包括使用@CrossOrigin注解、全局配置和自定义Filter。根据项目需求,你可以选择最适合的方案来实现CORS。通过合理的CORS配置,你可以轻松地告别CORS带来的烦恼,为你的前后端分离架构提供良好的支持。希望这些示例和讲解能帮助你更好地理解和应对跨域问题。

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部