我不确定问题是所涉及的技术,还是我对这些技术的理解。
我有一个用 javascript 和 html 编写的 html5 应用程序,托管在 apache 2.2 服务器上。
我有一个用 java 编写的 java 应用程序,使用 jetty、guice、jackson、jersey 托管一个简单的 REST 服务。
两个应用程序在同一个机器上运行,一个在端口 80(托管在 apache 上的纯 html5 应用程序),另一个在 8080(托管在 jetty/guice 上的纯 java 应用程序)
我相信答案就在我发回的标题中。CORS 标头告诉浏览器您允许外部应用程序访问您的 api。我似乎无法弄清楚如何配置我的 Jetty、Guice 服务器以返回正确的 CORS 标头。
我使用的是嵌入式 Jetty 服务器,所以我没有 web.xml 文件来添加标题。
这也可能与 HTML5 应用程序服务器(在本例中为 apache 2.2)如何为应用程序提供服务有关。
apache httpd.conf 文件具有以下条目:
LoadModule headers_module modules/mod_headers.so
<IFModule mod_headers>
Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, DELETE, HEAD
Header add Access-Control-Allow-Headers: X-PINGOTHER
Header add Access-Control-Max-Age: 1728000
</IfModule>
在我的 guice servlet 配置中,我有以下内容:
public class RestModule extends ServletModule{
@Override
protected void configureServlets() {
bind(QuestbookService.class);
// hook Jersey into Guice Servlet
bind(GuiceContainer.class);
// hook Jackson into Jersey as the POJO <-> JSON mapper
bind(JacksonJsonProvider.class).in(Scopes.SINGLETON);
Map<String, String> guiceContainerConfig = new HashMap<String, String>();
guiceContainerConfig.put(ResourceConfig.PROPERTY_RESOURCE_FILTER_FACTORIES,
HttpStatusCodeMetricResourceFilterFactory.class.getCanonicalName());
serve("/*").with(GuiceContainer.class, guiceContainerConfig);
}
}
我认为问题出在我的 guice 配置中,因为我没有地方设置响应标头。
我正在使用嵌入式码头服务器,因此我认为开发模式会绕过整个检查,但我可能是错的。
谢谢你的任何建议。