Java-Spring引导:访问控制-允许源站不工作

Java-Spring引导:访问控制-允许源站不工作,java,spring,spring-boot,spring-security,cross-origin-read-blocking,Java,Spring,Spring Boot,Spring Security,Cross Origin Read Blocking,我尝试在spring boot中使用少量教程实现访问控制-允许源代码,但无法实现 为了实现这一点,在application.properties文件中,我在下面一行添加了 endpoints.cors.allowed-origins=https://example.com 这可能意味着除了URL,没有其他端点可以调用任何API。但它不起作用,我仍然可以在下图中看到相应的*。我的API可以访问其他域中的哪些MENA。那么如何预防呢 在控制器中尝试此注释@Crossorigin(*”)。您可以根据

我尝试在spring boot中使用少量教程实现
访问控制-允许源代码
,但无法实现

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

endpoints.cors.allowed-origins=https://example.com
这可能意味着除了URL,没有其他端点可以调用任何API。但它不起作用,我仍然可以在下图中看到相应的
*
。我的API可以访问其他域中的哪些MENA。那么如何预防呢


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

端点。cors。Spring boot 1的允许原点
或管理的允许原点。Spring boot 2的允许原点用于将cors应用于执行器端点,它不适用于您定义的控制器端点

实际上,默认情况下Spring boot不会设置任何CORS头。如果您看到带有值(例如通配符)的
访问控制Allow Origin
,则表示您正在自己的代码中的某个地方配置该值。验证您是否在控制器上使用
@CrossOrigin
,或者是否使用某种
过滤器(例如
CorsFilter

在Spring boot中全局配置CORS的一种方法是定义
CorsFilter
bean,例如:

@Bean
公共公司过滤器{
最终UrlBasedCorsConfigurationSource=新UrlBasedCorsConfigurationSource();
最终公司配置配置=新公司配置();
config.setAllowCredentials(true);
config.setAllowedOrigins(列表https://example.com"));
config.setAllowedHeaders(List.of(“来源”、“内容类型”、“接受”));
config.setAllowedMethods(List.of(“GET”、“POST”、“PUT”、“OPTIONS”、“DELETE”、“PATCH”));
source.registerCorsConfiguration(“/**”,config);
返回新的过滤器(来源);
}

对于其他可能性,您可以检查。请注意,只有找到导致设置
访问控制允许原点的原因,此选项才能正常工作。

您可以像这样为项目定义自定义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() {
}

}

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

@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");
        }
    };
}
因此,最终的应用程序类看起来与此类似

@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");
        }
    };
   }
}

我有10多个控制器。你真的认为把它分别放在每个控制器中是一种好的做法吗?另外,我不想要“*”,我只想为交叉源添加选定的域。这样就没有其他域可以访问我的API