JAX-RX - заблокирован политикой CORS: метод PATCH не разрешен Access-Control-Allow-Methods в ответе перед полетом - PullRequest
0 голосов
/ 07 ноября 2018

Я использую Spring boot с Джерси 2.1

и Ionic, чтобы разработать приложение, я пробовал все посты, которые нашел, но ни одна не решила эту проблему для меня, я получаю сообщение об ошибке, включая те, которые говорят о создании аннотации интерфейса @PATCH самостоятельно.

Итак, дело в том, что я получаю эту ошибку на стороне клиента при тестировании в браузере при выполнении запроса PATCH:

Доступ к XMLHttpRequest по адресу '' from origin 'http://localhost:8100' имеет был заблокирован политикой CORS: метод PATCH не разрешен Access-Control-Allow-Methods в предполетном ответе.

Фильтры, которые у меня есть для ответа, следующие, я не понимаю, почему я получаю это, если у меня есть PATCH в качестве разрешенного метода, и он отлично работает на Почтальоне:

Фильтр:

@Provider
public final class ResponseFilter implements ContainerResponseFilter {

    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
        MultivaluedMap<String, Object> headers = responseContext.getHeaders();

        headers.putSingle("Accept-Patch", "*");
        headers.putSingle("Access-Control-Allow-Origin", "*");
        headers.putSingle("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE, PATCH");
        headers.putSingle("Access-Control-Allow-Credentials", "true");
        headers.putSingle("Access-Control-Max-Age", "3600");
        headers.putSingle("Access-Control-Allow-Headers", "Content-Type, Accept, Authorization");
    }
}

Метод, который использует PATCH:

import javax.ws.rs.PATCH;


@PATCH
    @Path("/{username}")
@Produces(MediaType.APPLICATION_JSON)
    public Response actualizarPassword(@Valid @NotNull(message = "user must not be null") final UserDTO userDTO,
                                      @PathParam("username") final String username,
                                      @QueryParam("codigo") @NotNull(message = "codigo musnt be null") final String codigo) {
        userDTO.setUsername(username);
        this.usersService.actualizarPassword(this.userDTOMapper.map(userDTO), codigo);

        return Response.noContent().build();
    }

Как я уже сказал, я также пытался создать аннотацию с PATCH, как я читал в некоторых ответах, но этот http-метод должен быть включен в Jersey 2.1, и это действительно так, как можно увидеть в предыдущем фрагменте код, интерфейс, который я создал, был:

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@HttpMethod("PATCH")
public @interface PATCH {
}

И если я сделаю запрос POSTMAN, я получу следующие заголовки:

Accept-Patch →*
Access-Control-Allow-Origin →*
Access-Control-Allow-Methods →POST, PUT, GET, OPTIONS, DELETE, PATCH
Access-Control-Allow-Credentials →true
Access-Control-Max-Age →3600
Access-Control-Allow-Headers →Content-Type, Accept, Authorization
X-Content-Type-Options →nosniff
X-XSS-Protection →1; mode=block
Cache-Control →no-cache, no-store, max-age=0, must-revalidate
Pragma →no-cache
Expires →0
X-Frame-Options →DENY
Content-Type →application/json
Content-Length →54
Date →Wed, 07 Nov 2018 07:46:45 GMT

И если это как-то связано, это мой конфиг SpringSecurity:

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests().anyRequest().permitAll()
                .and()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .csrf().disable();
    }

    @Override
    public void configure(WebSecurity web ) throws Exception
    {
        web.ignoring().antMatchers( HttpMethod.OPTIONS, "/**" );
    }
}

ОБНОВЛЕНИЕ 1

Я напечатал код ответа и получил 200. Тем не менее, я продолжаю получать эту ошибку.

ОБНОВЛЕНИЕ 2

По запросу sideshowbarker, я сделал запрос OPTIONS с POSTMAN, и это заголовки:

Allow →HEAD,GET,OPTIONS,PUT,PATCH
Last-modified →Wed, 07 Nov 2018 10:07:57 GMT+01:00
Accept-Patch →*
Access-Control-Allow-Origin →*
Access-Control-Allow-Methods →POST, PUT, GET, OPTIONS, DELETE, PATCH
Access-Control-Allow-Credentials →true
Access-Control-Max-Age →3600
Access-Control-Allow-Headers →Content-Type, Accept, Authorization
Content-Type →application/vnd.sun.wadl+xml
Content-Length →1165
Date →Wed, 07 Nov 2018 09:07:57 GMT

ОБНОВЛЕНИЕ 3

Я проверил заголовки в инструментах разработки, как это было предложено, а метод PATCH отсутствует. Почему это? Почему это происходит, если я использую POSTMAN, но не с моим Ionic App?

enter image description here

Пожалуйста, помогите, я боролся с этим в течение нескольких дней ...

Спасибо

1 Ответ

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

Хорошо, я такой идиот, что даже сам не могу в это поверить. Я использовал этот плагин для Chrome

, который изменял заголовки из ответа. Заметил это благодаря @sideshowbarker. Это такая идиотская вещь, но держу пари, что это может случиться и с другими людьми.

Большое спасибо @ sideshowbarker.

...