Spring реализация CORS не отвергает сообщения, когда я ожидал - PullRequest
0 голосов
/ 22 ноября 2018

В моем проекте maven есть аннотированный веб-сервис Spring @RestController, и я хочу добавить в него функциональность CORS.Мне наполовину удалось сделать это, но я получаю результаты, которых я не ожидаю.

Симптомы состоят в том, что я отправляю сообщение в свою службу, например, с номером порта 1111, но явключите CORS на сервере с конфигурацией, которая, как я полагал, должна отклонять порты 1111, как, например, 2222 в конфигурацииМой сервер установлен на порт 3333.

Я использую 5.1.1 версии spring-web, spring-webmvc, spring-security-web, spring-security-config и spring-context, если это помогает сузитьэто вниз.

Вот очень простая служба;

@RestController
public class MyService implements IMyService {

    IMyReqHandler requestHandler;

    public MyService (IMyReqHandler requestHandler) {

        this.requestHandler = requestHandler;
    }

    @PostMapping("/dothings")
    public void DoThings(@RequestBody MyMessageType msg) {

        requestHandler.processRequest(msg);
    }
}

Моя текущая конфигурация выглядит следующим образом:

@EnableWebSecurity
public class CORSConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.cors();
    }

    @Bean
    CorsConfigurationSource corsConfigurationSource() {

        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(Arrays.asList("http://localhost:2222"));
        configuration.setAllowedMethods(Arrays.asList("POST"));
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/dothings", configuration);
        return source;
    }

}

Я подтвердил, что код запускается во время запуска.

Точные заголовки ответа:

HTTP/1.1 200
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Access-Control-Allow-Origin: http://localhost:1111
Content-Length: 0
Date: Fri, 23 Nov 2018 12:48:06 GMT

Я ожидал, что 1111 в заголовках ответа будет 2222 из-за моей конфигурации.Почему это не так?Чего мне не хватает?

РЕДАКТИРОВАТЬ: Извиняюсь за то, что ввел в заблуждение, но оказывается, что я получаю эти заголовки из-за другого куска кода ... В методе службы у меня естьannotation;

@CrossOrigin(value = "http://localhost:1111")

Это объясняет 1111, но когда я удаляю эту строку, я вообще не добавляю связанные с CORS заголовки.Если я удаляю значение из него, я получаю заголовки CORS, но по умолчанию они «разрешают все», а это не то, что я хочу.

Я должен добавить, что я ВСЕХ не вижу заголовков, связанных с CORSкогда я удаляю эту оскорбительную строку кода.

Почему моя конфигурация не влияет на мои вызовы службы?Мне нужен способ динамически установить значение ...

1 Ответ

0 голосов
/ 27 ноября 2018

Я думаю, что контроль CORS присутствует.Управление CORS выполняется на основе заголовка Access-Control-Allow-Origin в respose и заголовка Origin, отправленного по запросу.Если они совпадают, вам разрешено вызывать ресурс.

Когда вы используете инструмент (другой браузер) для вызова ресурса, обычно заголовок Origin не добавляется.Или добавляется заголовок Origin с тем же доменом / ip вашего ресурса.

Фильтр Spring Security CORS не отправляет заголовок Access-Control-Allow-Origin, когда запрос сделан из того же домена сервера или запрос сделан из домена, который не находится в разрешенных источниках (setAllowedOrigins).Поскольку заголовок Access-Control-Allow-Origin отсутствует, браузер разрешает запрос только из того же домена.

Если вы вызываете службу из домена с разрешенными источниками (setAllowedOrigins), Access-Control-Allow-Origin будет возвращен в ответе с именем домена в заголовке Origin.

TEST

Я провел тест с тем же сервером и 2 разными портами (9797 и 9798)

Это мой класс конфигурации

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
            .allowedOrigins("http://localhost:9798")
            .allowedMethods("POST", "GET")
            .allowCredentials(true).maxAge(3600);
    }
}

Это заголовки ответа

Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: http://localhost:9798
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Content-Type: application/json;charset=UTF-8
Date: Wed, 28 Nov 2018 14:07:08 GMT
Expires: 0
Pragma: no-cache
Transfer-Encoding: chunked
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block

Я вызвал службу на локальном хосте: 9797 со страницы на локальном хосте: 9798, так как вы видите заголовок Access-Control-Allow-Origin: http://localhost:9798 присутствует.(Это 2 запроса, один с OPTIONS и один с POST). Если я вызываю службу со страницы в http://localhost:9797, то заголовок Access-Control-Allow-Origin отсутствует, но я могупозвоните в сервис без проблем.

...