我也想知道同样的事情,所以经过一番研究后,我发现最简单的方法就是使用 JAX-RS ContainerResponseFilter 添加相关的 CORS 标头。这样您就不需要用 CXF 替换整个 Web 服务堆栈(Wildfly 使用 CXF 是某种形式,但它看起来不像它用于 JAX-RS 可能只有 JAX-WS)。
无论您是否使用此过滤器,它都会将标头添加到每个 REST Web 服务。
package com.yourdomain.package;
import java.io.IOException;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.ext.Provider;
@Provider
public class CORSFilter implements ContainerResponseFilter {
@Override
public void filter(final ContainerRequestContext requestContext,
final ContainerResponseContext cres) throws IOException {
cres.getHeaders().add("Access-Control-Allow-Origin", "*");
cres.getHeaders().add("Access-Control-Allow-Headers", "origin, content-type, accept, authorization");
cres.getHeaders().add("Access-Control-Allow-Credentials", "true");
cres.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");
cres.getHeaders().add("Access-Control-Max-Age", "1209600");
}
}
然后,当我使用 curl 进行测试时,响应包含 CORS 标头:
$ curl -D - "http://localhost:8080/rest/test"
HTTP/1.1 200 OK
X-Powered-By: Undertow 1
Access-Control-Allow-Headers: origin, content-type, accept, authorization
Server: Wildfly 8
Date: Tue, 13 May 2014 12:30:00 GMT
Connection: keep-alive
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Transfer-Encoding: chunked
Content-Type: application/json
Access-Control-Max-Age: 1209600
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS, HEAD
我的理解是 @Provider 注释告诉 JAX-RS 运行时使用过滤器,没有注释什么都不会发生。
我从Jersey example 得到了使用ContainerResponseFilter 的想法。