首页
学习
活动
专区
圈层
工具
发布

尝试从Github API + Spring Boot获取到Angular时出现CORS错误

CORS(跨域资源共享)错误通常是由于浏览器的同源策略引起的。当你尝试从一个域名访问另一个域名的资源时,浏览器会阻止这种行为,除非目标服务器明确允许这种跨域请求。

要解决这个问题,你需要在Spring Boot应用中配置CORS策略,允许来自Angular应用的跨域请求。以下是一些常见的解决方案:

方法一:全局CORS配置

你可以在Spring Boot应用中添加一个全局的CORS配置,允许特定的域名访问你的API。

  1. 创建一个配置类:
代码语言:javascript
复制
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 CorsConfig {

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**")
                        .allowedOrigins("http://localhost:4200") // 允许Angular应用的域名
                        .allowedMethods("GET", "POST", "PUT", "DELETE")
                        .allowedHeaders("*")
                        .allowCredentials(true);
            }
        };
    }
}
  1. 在控制器中应用CORS配置(可选):

如果你只想在特定的控制器或方法上应用CORS配置,可以使用@CrossOrigin注解。

代码语言:javascript
复制
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://localhost:4200")
    @GetMapping("/data")
    public String getData() {
        return "Hello, CORS!";
    }
}

方法二:使用Filter配置CORS

你也可以通过实现一个自定义的Filter来处理CORS。

  1. 创建一个CORS Filter:
代码语言:javascript
复制
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;

public class CorsFilter implements Filter {

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        HttpServletRequest request = (HttpServletRequest) req;
        response.setHeader("Access-Control-Allow-Origin", "http://localhost:4200");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, Content-Length, X-Requested-With");

        if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
            response.setStatus(HttpServletResponse.SC_OK);
        } else {
            chain.doFilter(req, res);
        }
    }

    @Override
    public void init(FilterConfig filterConfig) {
    }

    @Override
    public void destroy() {
    }
}
  1. 注册Filter:

在Spring Boot应用中注册这个Filter。

代码语言:javascript
复制
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<CorsFilter> corsFilter() {
        FilterRegistrationBean<CorsFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new CorsFilter());
        registrationBean.addUrlPatterns("/*");
        return registrationBean;
    }
}

方法三:使用Spring Security配置CORS

如果你使用了Spring Security,可以在安全配置中添加CORS配置。

代码语言:javascript
复制
import org.springframework.context.annotation.Bean;
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;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.cors().and().csrf().disable();
    }

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**")
                        .allowedOrigins("http://localhost:4200")
                        .allowedMethods("GET", "POST", "PUT", "DELETE")
                        .allowedHeaders("*")
                        .allowCredentials(true);
            }
        };
    }
}

注意事项

  • 确保你允许的域名(例如http://localhost:4200)与你的Angular应用的运行地址一致。
  • 如果你在生产环境中部署应用,记得将http://localhost:4200替换为你的实际域名。
  • 如果你使用的是HTTPS,确保所有涉及的域名都支持HTTPS。

通过以上方法之一配置CORS后,你应该能够解决从Angular应用访问Spring Boot API时的CORS错误。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券