在Spring Boot项目中,跨域问题是一个常见的困扰,尤其是在前后端分离的架构中。跨域请求是指在某个域下的网页去请求另一个域下的资源,这在浏览器中是被限制的,造成了“同源政策”(Same-Origin Policy)。为了让我们的Spring Boot应用能够接受跨域请求,我们可以有多种方式来解决这个问题。以下是四种常见的解决方案:

1. 使用@CrossOrigin注解

Spring提供的@CrossOrigin注解是解决跨域问题的一个简单而有效的方法。我们可以直接在Controller层的方法或类上添加该注解,来允许跨域请求。

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")  // 允许来自http://localhost:3000的请求
public class DemoController {

    @GetMapping("/api/data")
    public String getData() {
        return "跨域请求成功!";
    }
}

2. 全局配置CORS策略

除了在Controller上使用@CrossOrigin注解外,我们还可以通过全局配置CORS策略来解决跨域问题。这种方式适用于整个应用程序或所需所有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") // 允许的方法
                .allowedHeaders("*") // 允许所有请求头
                .allowCredentials(true); // 允许带上用户凭证
    }
}

3. 使用Filter配置CORS

另一种方法是通过自定义的Filter来处理跨域请求。这种方式提供了更大的灵活性,可以根据需要对每个请求进行控制。

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;

@Component
public class CORSFilter implements Filter {

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

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

    @Override
    public void destroy() {}
}

4. 使用Spring Security进行CORS配置

如果项目中使用了Spring Security,那么可以通过Security的配置来处理CORS问题。配置中会强调跨域请求的安全性。

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.cors().and()  // 允许CORS
            .authorizeRequests()
            .anyRequest().authenticated();  // 所有请求需要认证
    }
}

以上是四种在Spring Boot项目中解决跨域问题的常用方法。通过合适的方式配置跨域,可以在保证安全的前提下,实现前后端的顺畅通信。选择哪种方式可以根据项目的需求及复杂度来决定。

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部