1

我尝试Access-Control- Allow-Origin使用一些教程和此链接在 Spring Boot 中实现,但无法实现。

为了实现这一点,在application.properties文件中,我添加了以下行

endpoints.cors.allowed-origins=https://example.com

这可能意味着除了 URL https://example.com之外,没有其他端点可以调用任何 API。但它不起作用,我仍然可以*在下图中看到响应。来自其他域的哪些menas,我的 API 是可访问的。那么如何预防呢?

在此处输入图像描述

4

4 回答 4

1

endpoints.cors.allowed-origins对于 Spring boot 1 或management.endpoints.web.cors.allowed-originsSpring boot 2 用于将 CORS 应用于 Actuator 端点,它不适用于您定义的控制器端点。

实际上,默认情况下 Spring boot 不会设置任何 CORS 标头。如果您看到Access-Control-Allow-Origin一个值(例如通配符),这意味着您正在自己的代码中的某个地方配置它。验证您是否在@CrossOrigin控制器上使用,或者您正在使用某种Filter(例如CorsFilter)。

在 Spring Boot 中全局配置 CORS 的一种方法是定义一个CorsFilterbean,例如:

@Bean
public CorsFilter corsFilter() {
    final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    final CorsConfiguration config = new CorsConfiguration();
    config.setAllowCredentials(true);
    config.setAllowedOrigins(List.of("https://example.com"));
    config.setAllowedHeaders(List.of("Origin", "Content-Type", "Accept"));
    config.setAllowedMethods(List.of("GET", "POST", "PUT", "OPTIONS", "DELETE", "PATCH"));
    source.registerCorsConfiguration("/**", config);
    return new CorsFilter(source);
}

对于其他可能性,您可以检查这个问题。请注意,这只有在您找出导致Access-Control-Allow-Origin设置的原因时才能正常工作。

于 2019-12-12T09:39:52.467 回答
1

您可以像这样为您的项目定义自定义 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.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Component
public class CustomeCORSFilter implements Filter {

private final Logger log = LoggerFactory.getLogger(CustomeCORSFilter.class);

public CustomeCORSFilter() {
    log.info("CustomeCORSFilter init");
}

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;


    response.setHeader("Access-Control-Allow-Credentials", "true");
    response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS,PUT, DELETE");
  response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
    response.setHeader("Access-Control-Max-Age", "");
    response.setHeader("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With,");

    chain.doFilter(request, response);
}

@Override
public void init(FilterConfig filterConfig) {
}

@Override
public void destroy() {
}

}
于 2019-12-12T12:12:38.830 回答
0

最后,我通过在我的应用程序类中添加以下内容解决了这个问题。

@Bean
public WebMvcConfigurer corsConfigurer() {

    return new WebMvcConfigurer() {
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**")
                    .allowedOrigins("https://example.com",
                            "https://www.example.com",
                            "http://192.168.1.12:3000",
                            "http://localhost:3000");
        }
    };
}

所以最终的 Application 类看起来与此类似

@SpringBootApplication
@EnableScheduling
@EnableAsync
public class ExampleApplication {

public static void main(String[] args) {
    SpringApplication.run(ExampleApplication.class, args);
}

@Bean
public WebMvcConfigurer corsConfigurer() {

    return new WebMvcConfigurer() {
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**")
                    .allowedOrigins("https://example.com",
                            "https://www.example.com",
                            "http://192.168.1.12:3000",
                            "http://localhost:3000");
        }
    };
   }
}
于 2021-02-16T07:55:30.070 回答
0

在您的控制器中尝试此注释@Crossorigin("*")。您可以根据需要更改注释中的参数

于 2019-12-12T09:10:37.127 回答