Я хочу включить CORS при весенней загрузке 2. Я сделал это следующим образом:
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("*")
.allowedHeaders("*");
}
}
Это отлично работает в большинстве запросов, но в некоторых специальных запросах мне нужно установить заголовок Access-Control-Allow-Origin в ответ. Как мне это сделать?




Есть много способов сделать это, например, с помощью фильтра, перехватчика или аспектов. Вы также можете использовать WebFilter, если используете Spring 5.
Один из способов сделать это - использовать перехватчики. Вот примерный код.
public class AccessControlInterceptor implements HandlerInterceptor {
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
if (somecondition) {
response.setHeader("Access-Control-Allow-Origin", "your_value");
}
}
}
И зарегистрируйте этот перехватчик с пружиной вот так
@Configuration
public class MyConfig extends WebMvcConfigurerAdapter{
@Override
public void addInterceptors(InterceptorRegistry registry){
registry.addInterceptor(new AccessControlInterceptor ()).addPathPatterns("/**");
}
}
Из документации Spring https://spring.io/guides/gs/rest-service-cors/
Включение CORS Метод контроллера Конфигурация CORS Чтобы веб-служба RESTful включила в свой ответ заголовки управления доступом CORS, вам просто нужно добавить аннотацию @CrossOrigin к методу обработчика:
@RestController
public class GreetingController {
@CrossOrigin(origins = "http://localhost:9000")
@GetMapping("/greeting")
public Greeting greeting(@RequestParam(required=false, defaultValue = "World") String name) {
System.out.println("==== in greeting === = ");
return new Greeting(counter.incrementAndGet(),String.format(template, name));
}
Эта аннотация @CrossOrigin разрешает запросы из разных источников только для этого конкретного метода. По умолчанию он разрешает все источники, все заголовки, методы HTTP, указанные в аннотации @RequestMapping, и используется maxAge 30 минут. Вы можете настроить это поведение, указав значение одного из атрибутов аннотации: origin, methods, allowedHeaders, visibleHeaders, allowCredentials или maxAge. В этом примере мы разрешаем только http: // локальный: 9000 отправлять запросы из разных источников.
также можно добавить эту аннотацию на уровне класса контроллера, чтобы включить CORS для всех методов обработчика этого класса.
В настоящее время вы устанавливаете Access-Control-Allow-Origin на *, что является подстановочным знаком и соответствует всем источникам.
Если ваш запрос содержит данные, связанные с учетными данными, например установив XMLHttpRequest.withCredentials на true:
Access-Control-Allow-Origin не должен иметь значение *.
Ожидается дополнительный заголовок ответа Access-Control-Allow-Credentials со значением true.
response.header ("Доступ-Контроль-Разрешить-Происхождение", "*");