【发布时间】:2012-04-13 06:29:24
【问题描述】:
我想使用 CORS(跨域资源共享)制作跨域 REST Web 服务。我正在使用 Jersey 图书馆提供服务。
我需要知道
从服务器端的角度来看,我需要做哪些代码/配置更改?
如何从 HTML5/js 调用此服务。
谢谢
【问题讨论】:
标签: rest cross-domain jersey cors
我想使用 CORS(跨域资源共享)制作跨域 REST Web 服务。我正在使用 Jersey 图书馆提供服务。
我需要知道
从服务器端的角度来看,我需要做哪些代码/配置更改?
如何从 HTML5/js 调用此服务。
谢谢
【问题讨论】:
标签: rest cross-domain jersey cors
我用来在基于 Jersey 的嵌入式 Jetty 应用程序中启用 CORS 过滤器的步骤。
jetty-servlet 版本 - 2.12
<dependency>
<groupId>com.thetransactioncompany</groupId>
<artifactId>cors-filter</artifactId>
<version>2.1.2</version>
</dependency>
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.NO_SESSIONS);
context.addFilter(CORSFilter.class, "/*", EnumSet.of(DispatcherType.INCLUDE,DispatcherType.REQUEST));
server.setHandler(context);//set handle to your server
【讨论】:
我选择通过在 Jersey 容器级别提供服务器 CORS 响应来解决此问题。这可能会为某些应用程序提供更多便利,因为它可以应用来自容器的所有响应,而无需修改资源处理代码。
首先必须创建一个容器响应过滤器,该过滤器将注入适当的标头。例如,对于任何响应都指示 Access-Control-Allow-Origin:* 的容器:
class CORSFilter implements ContainerResponseFilter {
@Override
public ContainerResponse filter(ContainerRequest request, ContainerResponse response) {
response.getHttpHeaders().add("Access-Control-Allow-Origin", "*");
return response;
}
}
然后必须将过滤器添加到 Jersey 响应过滤器链中。这可以通过应用程序使用的资源配置来完成。
...
DefaultResourceConfig rc = new ClasspathResourceConfig();
rc.getContainerResponseFilters().add(new CORSFilter());
// now create a simple lightweight server using this resource config.
HttpServer server = HttpServerFactory.create(uri,rc);
...
【讨论】:
您的服务器端配置的所有信息都可以在enable-cors.org 找到。
无需更改任何代码客户端,但我建议在使用 CORS 之前检查浏览器功能。可以找到测试代码,例如here。
【讨论】: