当前位置: 首页 > 知识库问答 >
问题:

在Spring Boot中全局启用CORS

公孙芷阳
2023-03-14

我试图像这样在全球范围内启用CORS:

@Configuration
@ComponentScan("com.example")
@EnableWebMvc
public class OriginFilter extends WebMvcConfigurerAdapter {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**").allowedMethods("GET", "POST", "PUT", "DELETE");
    }
}

我也尝试了这种方法:

@Configuration
public class OriginFilter implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("GET", "POST", "PUT", "DELETE", "HEAD")
                .allowCredentials(true);
    }
}

但这些都不适合我。

单个类的注释可以使用,但我想全局启用CORS。

共有3个答案

孙清野
2023-03-14

在不使用过滤器的情况下,使用WebMVCConfiguer为我提供的工作全局CORS配置

@Configuration
public class GlobalCorsConfiguration {

    public GlobalCorsConfiguration() {
        super();
    }

    /**
     * Bean to define global CORS.
     * 
     * @return
     */
    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**").allowedMethods("HEAD", "GET", "PUT", "POST", "DELETE", "PATCH");
            }
        };
    }
}

谢谢。

公孙霖
2023-03-14

我通过添加filterClass解决了这个问题

@Component
public class CORSFilter implements Filter {

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

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE, PATCH");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "Origin, Content-Type, Accept");
        response.setHeader("Access-Control-Expose-Headers", "Location");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {

    }
}
纪俊良
2023-03-14

正如您在回答中提到的,您确实可以定义自己的过滤器。Spring已经有了这样一个CorsFilter,所以您不必自己创建。只需将其注册为bean,它就可以工作:

@Bean
public CorsFilter corsFilter() {
    final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    final CorsConfiguration config = new CorsConfiguration();
    config.setAllowCredentials(true);
    // Don't do this in production, use a proper list  of allowed origins
    config.setAllowedOrigins(Collections.singletonList("*"));
    config.setAllowedHeaders(Arrays.asList("Origin", "Content-Type", "Accept"));
    config.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "OPTIONS", "DELETE", "PATCH"));
    source.registerCorsConfiguration("/**", config);
    return new CorsFilter(source);
}
 类似资料:
  • 如何启用此处列出的ExecutorServiceMetrics? https://github.com/micrometer-metrics/micrometer/blob/master/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/jvm/ExecutorServiceMetrics.java SpringB

  • 本文向大家介绍springboot全局异常处理详解,包括了springboot全局异常处理详解的使用技巧和注意事项,需要的朋友参考一下 一、单个controller范围的异常处理 说明: 在controller中加入被@ExceptionHandler修饰的类即可(在该注解中指定该方法需要处理的那些异常类) 该异常处理方法只在当前的controller中起作用 二、全部controller范围内起

  • 问题内容: 我正在尝试创建一个分页类,并使用该类外部的变量。 但这给了我致命错误“在非对象上调用成员函数query()”。 这是索引文件: 这是pagi.php文件: 是否可以在类内部使用该变量,而无需在类内部创建新变量? 问题答案: 解决此问题的正确方法是将数据库对象注入另一个类(依赖项注入): 解决该问题的另一种方法是将数据库类的实例注入使用它的方法中: 您选择哪种方法取决于情况。如果只有一个

  • 我有一个带post请求的控制器。我试图用一个简单的NotNull注释验证POJO。我正在使用ControllerAdvice来处理异常。 所以我尝试使用它,但当我启动应用程序时,我得到了以下信息: 因此,我想为BindException创建自己的处理程序,但当我为BindException类创建ExceptionHandler时,spring应用程序不会启动。如果我注释掉handleBindExc

  • 它永远不会结束,应用程序也不会响应: 我已经检查了以下几点: 我的应用程序扩展了SpringBootServletInitializer 我将初学者tomcat依赖项放在提供的中 war名为“EdgeCustomerOfferStorageWeb.war”,实例端口为10080,因此我使用:http://server:10080/EdgeCustomerOfferStorageWeb/It不响应,

  • 我正在尝试使用Spring Boot和Spring数据通过鉴别器实现多租户。 我创建了一个抽象类来表示多租户实体。类似于此: 如何全局启用多租户Hibernate过滤器?