SpringBoot中解决跨域问题

一、使用@CrossOrigin注解
@CrossOrigin注解是Spring Boot提供的一个简单而直观的解决方案,它可以直接应用于控制器类或方法上。这种方式适合对特定接口或控制器进行跨域配置。

示例代码

@RestController
@RequestMapping("/api")
public class UserController {

    // 允许所有域名跨域访问该方法
    @CrossOrigin(origins = "*")
    @GetMapping("/getUser")
    public User getUser() {
        return new User("Alice", 25);
    }

    // 仅允许特定域名跨域访问
    @CrossOrigin(origins = "http://example.com")
    @PostMapping("/saveUser")
    public void saveUser(@RequestBody User user) {
        // 保存用户逻辑
    }
}

二、全局配置CORS
如果项目中的所有接口都需要支持跨域,全局配置CORS是一种更优雅的解决方案。我们可以通过实现WebMvcConfigurer接口来完成全局跨域配置。

示例代码

@Configuration
public class GlobalCorsConfig implements WebMvcConfigurer {
    @Override	
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**") // 允许所有路径的请求
                .allowedOrigins("http://example.com") // 允许的来源
                .allowedMethods("GET", "POST", "PUT", "DELETE") // 允许的HTTP方法
                .allowedHeaders("*") // 允许的请求头
                .allowCredentials(true) // 是否允许发送Cookie
                .maxAge(3600); // 预检请求的缓存时间(秒)
    }
}

三、通过CorsFilter实现跨域
CorsFilter是Spring提供的另一种实现跨域的方式,它通过过滤器来处理跨域请求。这种方式同样可以实现全局跨域配置。

示例代码

@Configuration
public class CorsConfig {
    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true); // 是否允许发送Cookie
        config.addAllowedOrigin("http://example.com"); // 允许的来源
        config.addAllowedHeader("*"); // 允许的请求头
        config.addAllowedMethod("*"); // 允许的HTTP方法
        source.registerCorsConfiguration("/**", config); // 应用于所有路径
        return new CorsFilter(source);
    }
}

四、通过自定义过滤器实现跨域
如果需要更灵活的跨域处理逻辑,可以自定义一个过滤器来实现跨域支持。这种方式允许我们在过滤器中编写复杂的逻辑,以满足特定的业务需求。

示例代码

@Component
public class CustomCorsFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletResponse res = (HttpServletResponse) response;
        res.addHeader("Access-Control-Allow-Origin", "http://example.com");
        res.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
        res.addHeader("Access-Control-Allow-Headers", "Content-Type");
        res.addHeader("Access-Control-Allow-Credentials", "true");
        if ("OPTIONS".equalsIgnoreCase(((HttpServletRequest) request).getMethod())) {
            res.setStatus(HttpServletResponse.SC_OK);
        } else {
            chain.doFilter(request, response);
        }
    }
}

五、使用Nginx解决跨域问题
除了在Spring Boot中直接处理跨域问题,我们还可以通过Nginx来解决跨域问题。这种方式将跨域处理逻辑从后端代码中分离出来,由Nginx代理完成跨域支持。

示例配置

server {
    listen 80;
    server_name example.com;

    location /api {
        proxy_pass http://localhost:8081; // 后端服务地址
        add_header 'Access-Control-Allow-Origin' 'http://example.com';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';
        add_header 'Access-Control-Allow-Headers' 'Content-Type';
        add_header 'Access-Control-Allow-Credentials' 'true';

        if ($request_method = 'OPTIONS') {
            add_header 'Access-Control-Max-Age' 1728000;
            add_header 'Content-Type' 'text/plain charset=UTF-8';
            add_header 'Content-Length' 0;
            return 204;
        }
    }
}
### Spring Boot 3 中解决 CORS 问题的配置方法 Spring Boot 3 提供了灵活的方式来处理资源共享(CORS)。以下是两种常见且有效的解决方案:使用 `@CrossOrigin` 注解和全局配置 CORS。 --- #### 方法一:使用 `@CrossOrigin` 注解 `@CrossOrigin` 是一种简便的方式,适用于单个控制器或某个特定方法级别的需求。该注解可以直接应用于类级别或方法级别。 ```java import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/api") @CrossOrigin(origins = "http://example.com") // 指定允许的前端名 public class MyController { @GetMapping("/data") public String getData() { return "Data from backend"; } } ``` 在此示例中,`@CrossOrigin` 注解指定了允许的前端名 `http://example.com` 访问 `/api/data` 接口[^1]。 如果需要允许多个来源,可以传递多个 URL 或者使用 `"*"` 表示允许所有来源(不推荐在生产环境使用)。 --- #### 方法二:全局配置 CORS 对于更复杂的场景,建议通过全局配置来管理 CORS 策略。这可以通过实现 `WebMvcConfigurer` 接口或注册自定义过滤器来完成。 ##### 方式 1:通过 `WebMvcConfigurer` 实现全局 CORS 配置 这是最常用的一种方式,适合于整个应用都需要统一的 CORS 支持。 ```java 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") // 允许的 HTTP 方法 .allowedHeaders("*") // 允许的请求头 .allowCredentials(true); // 是否支持携带 Cookie 凭证 } } ``` 在这个例子中,`addCorsMappings` 方法定义了一个全局适用的 CORS 策略,涵盖了所有路径 (`/**`) 和指定的前端名 `http://example.com`[^2]。 ##### 方式 2:通过 Filter 进行细粒度控制 另一种方式是通过自定义过滤器来增强灵活性,尤其适用于需要针对不同路径设置不同策略的场景。 ```java import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import org.springframework.stereotype.Component; import org.springframework.web.filter.OncePerRequestFilter; @Component public class CorsFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { response.setHeader("Access-Control-Allow-Origin", "http://example.com"); // 允许的前端名 response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE"); // 允许的 HTTP 方法 response.setHeader("Access-Control-Max-Age", "3600"); // 缓存时间 response.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization"); // 允许的请求头 if ("OPTIONS".equalsIgnoreCase(request.getMethod())) { // 处理预检请求 response.setStatus(HttpServletResponse.SC_OK); } else { filterChain.doFilter(request, response); } } } ``` 这种方式更加底层,能够精确控制每个请求的行为,特别适合复杂的应用场景。 --- ### 总结 以上介绍了两种主流的 CORS 配置方式:局部配置(`@CrossOrigin` 注解)和全局配置(`WebMvcConfigurer` 或自定义过滤器)。开发者可以根据实际需求选择合适的方案。通常情况下,全局配置更适合大型项目,而局部配置则更为轻量级,便于快速实现。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值