【发布时间】: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: *”始终存在。
【问题讨论】:
-
用 chrome 测试? - stackoverflow.com/a/10892392/775715
-
@JoakimErdfelt 不,不仅如此。浏览器有 Safari、Chrome 和 Firefox
标签: rest jetty http-post restangular grizzly