Как установить заголовок в весенних загрузочных корсах?

Я хочу включить CORS при весенней загрузке 2. Я сделал это следующим образом:

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("*")
                .allowedHeaders("*");
    }
}

Это отлично работает в большинстве запросов, но в некоторых специальных запросах мне нужно установить заголовок Access-Control-Allow-Origin в ответ. Как мне это сделать?

response.header ("Доступ-Контроль-Разрешить-Происхождение", "*");

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

Ответы 3

Есть много способов сделать это, например, с помощью фильтра, перехватчика или аспектов. Вы также можете использовать 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.

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