JAX-RX-被CORS策略阻止:飞行前响应中Access-Control-Allow-Methods不允许使用方法PATCH

时间:2018-11-07 07:49:05

标签: java spring-boot cors jax-rs patch

我在Jersey 2.1

上使用Spring boot

和Ionic一起开发了一个应用程序,我已经尝试过发现的每一篇帖子,但是都没有为我解决这个问题,包括自己创建@PATCH接口注释的错误。

所以,事情是我在执行PATCH请求时在浏览器上进行测试时,在客户端出现此错误:

  

从来源“ http://localhost:8100”访问“”处的XMLHttpRequest具有   已被CORS政策阻止:方法PATCH不允许   飞行前响应中的Access-Control-Allow-Methods。

我用于响应的过滤器如下,如果我将PATCH作为允许的方法并且在Postman上完美运行,我不明白为什么得到这个过滤器:

过滤器:

@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的要求,我向POSTMAN发出了OPTIONS请求,这是标头:

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

请帮助,我已经为此苦苦挣扎了几天……

谢谢

2 个答案:

答案 0 :(得分:0)

好吧,我真是个白痴,我自己都不敢相信。我正在使用this plugin for Chrome

正在修改响应中的标题。感谢@sideshowbarker注意到它。这是一个白痴,但我敢打赌,其他人也可能会发生。

非常感谢@sideshowbarker。

答案 1 :(得分:0)

我也有同样的问题。我为 CORS 启用了 chrome CORS 插件,似乎它在发出请求之前修改了标头。禁用它只是有效,这样的错误:)