首页 > 解决方案 > 配置 CORS

问题描述

我有在 Spring Boot 中编写的 REST 服务器,然后我有 Web 服务器(在 Windows 上运行的 IIS,只有 html/css/js 和 web.config 文件)。应用程序只能在本地网络上运行,我不知道如何设置 CORS。

Web 服务器在 docmanager.com 上运行,REST 服务器在 docmanager.com:8443 上运行,两者都在同一台计算机上。问题是,我需要像这样设置 REST 服务器:

@Component
 @Order(Ordered.HIGHEST_PRECEDENCE)
public class CorsConfig implements Filter {

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

    }

        @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", "*");
            response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT");
            response.setHeader("Access-Control-Max-Age","3600");
            response.setHeader("Access-Control-Allow-Headers", "x-requested-with, authorization, content-type, access-control-alow-origin");

            if("OPTIONS".equalsIgnoreCase(request.getMethod())){
                response.setStatus(HttpServletResponse.SC_OK);
                response.setHeader("Access-Control-Allow-Origin", "*");
                response.setHeader("Access-Control-Allow-Origin", "*");
                response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT");
                response.setHeader("Access-Control-Max-Age","3600");
                response.setHeader("Access-Control-Allow-Headers", "x-requested-with, authorization, content-type, access-control-alow-origin");
            } else {
                chain.doFilter(req, res);
            }

      //      chain.doFilter(new XSSRequestWrapper((HttpServletRequest) request), response);
        }


        @Override
        public void destroy() {

        }
    }

当我使用而不是 Access-Control-Allow-Origin: * -> Acess-Control-Allow-Origin: docmanager.com:443 时,它不起作用。我也在同一台电脑上测试它。我应该如何设置这个与 CORS 相关的东西?我在开发过程中将它与“*”一起使用,但我需要让它准备好分发,但我不知道如何为这个本地网络设置 CORS ......我能否以某种方式避免使用我的设置完全设置 CORS(网络服务器,休息服务器等...)?

感谢帮助 :)

标签: spring-bootsecuritycors

解决方案


正如您提到的,您的 Web 服务器在不同的端口上,而 REST 服务器在不同的端口上

在这种情况下,CORS 肯定会出现。

配置看起来正确。

我认为问题在于您正在设置的域名

docmanager.com:443

不确定,但应该是这样的

https://docmanager.com

尝试检查浏览器并获得确切的值。

旁注

您正在做的是Filter为每个请求设置标题信息添加一个和。

由于您使用Spring-boot的是更清洁的方法

使用 WebMvcConfigurerAdapter

@Configuration
//@EnableWebMvc
public class CorsConfiguration extends WebMvcConfigurerAdapter
{
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("https://docmanager.com")
                .allowedMethods("GET", "POST");
    }
}

使用网络安全

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.cors().and()
            //other config
    }

    @Bean
    CorsConfigurationSource corsConfigurationSource()
    {
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(Arrays.asList("https://docmanager.com"));
        configuration.setAllowedMethods(Arrays.asList("GET","POST"));
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }
}

更多细节在这里这里

编辑1:

添加更多细节

1 您可以在数组列表中添加所有方法

2 OPTIONS(预请求请求)由 Spring 自动处理。

这是报价

CORS 请求(包括带有 OPTIONS 方法的预检请求)会自动分派到已注册的各种 HandlerMappings。由于 CorsProcessor 实现(默认为 DefaultCorsProcessor),它们处理 CORS 预检请求并拦截 CORS 简单和实际请求,以便添加相关的 CORS 响应标头(如 Access-Control-Allow-Origin)。CorsConfiguration 允许您指定应该如何处理 CORS 请求:允许的来源、标头、方法等。

更多细节在这里


推荐阅读