Я попытался включить 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 глобально.




Я решил эту проблему, добавив 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() {
}
}
Спасибо, что разместили это как ответ!
Вы действительно можете определить свой собственный 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);
}
Спасибо, я протестировал его, и он работает. Это лучший подход, вы правы.
Но где именно вы разместите приведенный выше код? Нам нужно создать новый фильтр с помощью вышеуказанного метода?
@henry Это не просто метод, этот метод возвращает фильтр (CorsFilter реализует Filter). Этот метод должен быть помещен в класс конфигурации (либо класс с аннотацией @Configuration, либо основной класс).
Это задокументировано здесь
Рабочая глобальная конфигурация 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()?
пожалуйста, проверьте код правильно. Я реализовал addCorsMappings в первом методе.
Привет, я недавно столкнулся с этой проблемой (глобальная конфигурация не работала)! и я нашел кое-что полезное.
Мы должны НЕТ добавить обратную косую черту в конце, как это http://localhost:4200/
В основном это должен быть http://localhost:4200 (без обратной косой черты в конце)
Вы можете использовать CorsConfigurationSource, как описано в эта ветка.