我不确定问题是涉及的技术还是我对技术的理解。
我有一个用javascript和html编写的html5应用程序,托管在apache 2.2服务器上。
我有一个使用Jetty,Guice,Jackson,Jersey用Java编写的Java应用程序,它承载一个简单的REST服务。
这两个应用程序都在同一个盒子上运行,一个在端口80上运行(纯html5应用程序托管在apache上),另一个在8080上运行(纯Java应用程序托管在jetty
/ guice上)。
我相信答案在即时通讯回传的标头中。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);
}
}
我认为问题出在我的向导配置中,因为我没有地方设置响应头。
我使用的是嵌入式码头服务器,因此我发现开发人员模式会绕过整个检查,但我可能是错的。
感谢您的任何建议。
按照我的应用程序的特定要求进行操作。服务器需要与客户端完全隔离。客户端应该能够通过它可以使用的任何方法连接到通信服务器。
由于此应用程序的第一个实现将由REST驱动,因此我需要能够从任何地方接受休息。
另外,我想要一个完全没有xml的配置,因此我将Guice与嵌入式Jetty服务器一起使用。由于我没有web.xml文件,因此我无法弄清楚如何设置标头以允许CORS。
经过大量的试验和错误,并阅读了guice文档,我发现了如何将CORS标头添加到离开服务器的响应中。
Guice ServletModule类使您可以向Servlet上下文添加过滤器。这使我可以使所有请求都通过给定的servlet。
由于我试图构建一个响应CORS请求的rest应用程序,因此我需要一个过滤器,该过滤器将cors标头添加到任何请求的响应中。
因此,为了使用guice在嵌入式服务器中启用cors,我构建了一个过滤器,如下所示:
@Singleton
public class CorsFilter implements Filter{
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) throws IOException, ServletException {
if(response instanceof HttpServletResponse){
HttpServletResponse alteredResponse = ((HttpServletResponse)response);
addCorsHeader(alteredResponse);
}
filterChain.doFilter(request, response);
}
private void addCorsHeader(HttpServletResponse response){
//TODO: externalize the Allow-Origin
response.addHeader("Access-Control-Allow-Origin", "*");
response.addHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE, HEAD");
response.addHeader("Access-Control-Allow-Headers", "X-PINGOTHER, Origin, X-Requested-With, Content-Type, Accept");
response.addHeader("Access-Control-Max-Age", "1728000");
}
@Override
public void destroy() {}
@Override
public void init(FilterConfig filterConfig)throws ServletException{}
}
Guice提供了一个抽象类,允许您配置Guice Servlet。
配置模块如下所示:
public class RestModule extends ServletModule{
@Override
protected void configureServlets() {
bind(MyServiceClass.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>();
serve("/*").with(GuiceContainer.class, guiceContainerConfig);
filter("/*").through(CorsFilter.class);
}
}
现在,guice将在每个响应中添加cors标头。无论在哪里提供服务,都允许我的纯HTML 5应用程序与之对话。
问题内容: 我正在使用Sencha Touch 2应用程序(包装在PhoneGap中)到远程PHP服务器。 服务器的响应如下: XMLHttpRequest无法加载http://nqatalog.negroesquisso.pt/login.php。原产地不被访问控制允许来源允许的。 我该如何解决这个问题? 问题答案: 不久前,我写了一篇有关此问题的文章Cross Domain AJAX 。 如果
问题内容: 我正在Ajax.request使用Sencha Touch 2应用程序(包装在PhoneGap中)到远程PHP服务器。 服务器的响应如下: XMLHttpRequest无法加载http://nqatalog.negroesquisso.pt/login.php。原产地不被访问控制允许来源允许的。 我该如何解决这个问题? 问题答案: 如果您控制响应服务器,最简单的方法是为以下项添加响应标
问题内容: XMLHttpRequest cannot load http://localhost:8080/api/test. Origin http://localhost:3000 is not allowed by Access-Control-Allow-Origin. 我阅读了有关跨域Ajax请求的信息,并了解了潜在的安全问题。就我而言,有2台服务器在本地运行,并且希望在测试期间启用跨
null 服务器的响应如下: XMLHttpRequest无法加载http://nqatalog.negroesquisso.pt/login.php。Access-Control-Allow-Origin不允许Origin 。 如何解决此问题?
问题内容: 我是Ajax的新手,只是受过此跨域调用的任务。我们的网页上有一个文本框,用户可用来执行公司名称搜索。通过单击文本框旁边的按钮,将请求Ajax调用。不幸的是,Web服务位于单独的域中,因此自然会引起问题。 以下是我使这项工作的最佳尝试。我还要注意,此调用的目的是以XML格式返回结果,该结果将在请求的一部分中进行解析。 这又是错误消息: 对于解决方法,我不知所措,将不胜感激任何想法。 问题
问题内容: 我制作了一个小的xslt文件,以使用以下代码创建一个名为weather.xsl的html输出: 我想将html输出加载到html文件中的div中,我正在尝试使用jQuery进行如下操作: 但是我收到以下错误:Access-Control-Allow-Origin不允许使用Origin null。 我已经读过有关向xslt添加标头的信息,但是我不确定如何做到这一点,因此将不胜感激,并且如