Отсутствует заголовок set-cookie для метода POST - PullRequest
1 голос
/ 05 мая 2019

Когда я выполняю запрос с использованием метода HTTP POST от Angular, ответ приходит без заголовка set-cookie, в отличие от того, когда я выполняю запрос с использованием метода HTTP GET, ответ приходит с заголовком set-cookie.

Я знаю, чтокогда используется метод POST, браузер автоматически отправляет запрос предварительной проверки OPTIONS.Я ищу совет, что я могу сделать, чтобы после того, как клиент запроса метода POST получил заголовок set-cookie, поскольку он уже работает с методом GET?

Мой угловой запрос:

this.http.post<UserDto>("//localhost:8080/users", this.user, {withCredentials: true}).subscribe( user => {
  alert("User created successfully.");
});;

Это ответзаголовки, которые я получаю:

Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: content-type
Access-Control-Allow-Methods: POST,PUT,DELETE,GET,OPTIONS
Access-Control-Allow-Origin: http://localhost:4200
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Content-Length: 0
Date: Sun, 05 May 2019 09:22:55 GMT
Expires: 0
Pragma: no-cache
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

И заголовки моих запросов:

Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: pl-PL,pl;q=0.9,en-US;q=0.8,en;q=0.7
Access-Control-Request-Headers: content-type
Access-Control-Request-Method: POST
Connection: keep-alive
Host: localhost:8080
Origin: http://localhost:4200
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36

Конфигурация My Spring Security:

@Configuration
@EnableWebSecurity
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.
        cors().and().
                csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
                .and().addFilterBefore(
                new StatelessCSRFFilter(), CsrfFilter.class);
    }

    @Bean
    CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(ImmutableList.of("http://localhost:4200"));
        configuration.setAllowedMethods(Arrays.asList("POST","PUT","DELETE","GET","OPTIONS"));
        configuration.setAllowCredentials(true);

        configuration.setAllowedHeaders(ImmutableList.of("Authorization", "Cache-Control", "Content-Type"));
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }
}

Я нашел такой совет:

"Я заставил его работать, добавив фильтр ответов для запроса опций перед полетом, который работает без учетных данных.

<security-constraint>
        <display-name>No check for options</display-name>
        <web-resource-collection>
            <web-resource-name>All Access</web-resource-name>
            <url-pattern>/*</url-pattern>
            <http-method>OPTIONS</http-method>
        </web-resource-collection>
        <user-data-constraint>
            <transport-guarantee>NONE</transport-guarantee>
        </user-data-constraint>
    </security-constraint>

Я не уверен, как реализовать это решение весной.

Конфигурация CORS была правильно настроена на бэкэнде SpringFramework, так как методы выполняются должным образом, и Angular устанавливает файлы cookie для запросов GET.Это только операции POST, которые не завершаются успешно, если не предшествует HTTP.GETзапрос.

...