Включение CORS глобально в Spring Boot

Я попытался включить 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);
    }
}

Но у меня ничего из этого не сработало.

Аннотации @CrossOrigin для отдельного класса работают, но я хотел включить CORS глобально.

Вы можете использовать CorsConfigurationSource, как описано в эта ветка.

nyxz 08.10.2019 09:33
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
18
1
24 183
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Я решил эту проблему, добавив 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() {

    }
}

Спасибо, что разместили это как ответ!

g00glen00b 07.08.2018 09:33
Ответ принят как подходящий

Вы действительно можете определить свой собственный Filter, как вы упомянули в своем ответе. В 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);
}

Спасибо, я протестировал его, и он работает. Это лучший подход, вы правы.

Moler 07.08.2018 09:48

Но где именно вы разместите приведенный выше код? Нам нужно создать новый фильтр с помощью вышеуказанного метода?

Henry 02.01.2020 07:42

@henry Это не просто метод, этот метод возвращает фильтр (CorsFilter реализует Filter). Этот метод должен быть помещен в класс конфигурации (либо класс с аннотацией @Configuration, либо основной класс).

g00glen00b 02.01.2020 11:32

Это задокументировано здесь

lcnicolau 14.02.2020 22:03

Рабочая глобальная конфигурация CORS с использованием WebMvcConfigurer для меня без использования фильтра.

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

Спасибо.

Вы также можете сделать следующее, чтобы глобально включить CORS в приложении Spring Boot. Однако обратите внимание, что WebMvcConfigurerAdapter устарел.

@SuppressWarnings("deprecation")
@SpringBootApplication(exclude = org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class)
public class SpringbootMongodbDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootMongodbDemoApplication.class, args);
    }
    @Bean
        public WebMvcConfigurer corsConfigurer() {
            return new WebMvcConfigurerAdapter() {
                @Override
                public void addCorsMappings(CorsRegistry registry) {
                    registry.addMapping("/**").allowedOrigins("*");
                }
            };
        }

Также в Контроллере добавьте следующее:

@PostMapping("/addfeedback")
@CrossOrigin(origins = "*")
public FeedbackForResolution addFeedback(@RequestBody FeedbackForResolution feedback) {
.
.
.
}

У меня тоже были проблемы с этой проблемой, и я попытался использовать некоторые из решений, перечисленных на этой странице, но мне это не удалось. Я использую весеннюю загрузку версии 2.1.2.RELEASE.

Это решило это для меня,

import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
blah
blah


    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true); 
        config.addAllowedOrigin("http://localhost:4200");
        config.addAllowedHeader("*");
        config.addAllowedMethod("GET");
        config.addAllowedMethod("PUT");
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }

Где бла-бла - остальная часть моего кода.

Я понятия не имею, почему этот метод работал у меня, а у других - нет, он позволил моему приложению машинописного текста устанавливать соединения с localhost: 4200 для подключения к моему приложению загрузки Spring, работающему на localhost: 8080

вот решение для вашего подхода. это работает нормально, как и ожидалось. может быть уже слишком поздно. но кому-то будет полезно.

есть два способа включить глобально.

1. Один из них - создание bean-компонента. 2. другой - через аннотацию

1-й метод:

@Configuration
public class CorsConfiguration {
    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**").allowedMethods("GET", "POST", "PUT", "DELETE")
                .allowedOrigins("*")
                .allowedHeaders("*");
            }
        };
    }
}

2-й способ:

добавив аннотацию @CrossOrigin в верхнюю часть класса контроллера.

но первые два метода не работают для запроса PUT для меня. Для метода Put вы можете использовать следующий подход.

Следующий подход будет работать для всех типов запросов.

@Configuration
public class CorsConfig {

    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);
        config.addAllowedOrigin("*");
        config.addAllowedHeader("*");
        config.addAllowedMethod("OPTIONS");
        config.addAllowedMethod("GET");
        config.addAllowedMethod("POST");
        config.addAllowedMethod("PUT");
        config.addAllowedMethod("DELETE");
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }

}

Это не выглядит правильным. Как можно иметь implements WebMvcConfigurer, но не реализовать метод addCorsMappings()?

rineez 25.06.2020 09:53

пожалуйста, проверьте код правильно. Я реализовал addCorsMappings в первом методе.

karthick S 25.06.2020 15:33

Привет, я недавно столкнулся с этой проблемой (глобальная конфигурация не работала)! и я нашел кое-что полезное.

Мы должны НЕТ добавить обратную косую черту в конце, как это http://localhost:4200/ В основном это должен быть http://localhost:4200 (без обратной косой черты в конце)

Другие вопросы по теме