【问题标题】:CORS headers created by Grizzly not always recognised by clientGrizzly 创建的 CORS 标头并不总是被客户端识别
【发布时间】:2016-10-19 17:24:20
【问题描述】:

Grizzly 服务器在 localhost:8080 上运行,它使用 Jersey 提供 REST 接口。

CorsFilter 类负责创建 CORS 标头。它被添加到 GrizzlyServer 的资源配置中:

final ResourceConfig rc = new ResourceConfig()
                          .packages("my.application.api.rest")
                          .register(new CorsFilter());
GrizzlyHttpServerFactory.createHttpServer(uri, rc); // uri defined earlier

这是在另一篇文章中找到的 CorsFilter 类:

@Provider
public class CorsFilter implements ContainerResponseFilter {

    private final String HEADERS = "Origin, Content-Type, Accept";
    @Override
    public void filter(ContainerRequestContext request, ContainerResponseContext response) throws IOException {
        response.getHeaders().add("Access-Control-Allow-Origin", "*");
        response.getHeaders().add("Access-Control-Allow-Headers", HEADERS);
        response.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");
    }
}

有两个类代表 REST 处理程序: my.application.api.rest.A.class my.application.api.rest.B.class

资源 A 和 B 都有一个 POST 处理程序:

@Path("/A")
public class A {
    @POST
    @Produces(MediaType.APPLICATION_JSON)
    public Response handlePost()
    {
        Object payload = getPayload();
        return Response.ok(payload).build();
    }
}

B 看起来与 A 相似。

客户端是一个基于 AngularJS 的 Web 应用程序,托管在来自 localhost:3000 的本地节点服务器上。 /A 和 /B 的 POST 是使用 Restangular 完成的:

Restangular.all('A').post({
    key: value
});

虽然所有可用浏览器(Chrome、Safari、Firefox)都执行对 A 的 POST,但由于以下错误,不会执行对 B 的相同 POST:

XMLHttpRequest cannot load http://localhost:8080/myapplication/B. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3000' is therefore not allowed access. The response had HTTP status code 500.

我假设 CorsFilter 添加的标头在某处丢失了。

使用 Postman 到 A 和 B 的 POST 运行良好,并且标题“Access-Control-Allow-Origin: *”始终存在。

【问题讨论】:

标签: rest jetty http-post restangular grizzly


【解决方案1】:

我不得不使用customPOST() 方法,而不是使用restangular 的post() 方法。

【讨论】:

    猜你喜欢
    • 2019-02-06
    • 1970-01-01
    • 2020-06-01
    • 2018-03-22
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    • 2018-11-04
    • 1970-01-01
    相关资源
    最近更新 更多