我正在开发一个Cordova/PhoneGap应用程序通信现有的Restful Web服务(泽西岛)。 Web服务很好,因为我已经开发了我的应用的Android版本,并且工作正常。现在我正在开发基于iOS的Cordova。我读过关于CORS和关于跨域AJAX调用的相关内容的东西。但发送在下面的错误AJAX请求的结果:AJAX POST泽西启用REST风格的Web服务跨域
在服务器端日志XMLHttpRequest cannot load http://xxxx:xxxx/api/v1/general/authenticate1. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.
而且每一个AJAX调用创建与此消息一帮日志:
INFO: Couldn't find grammar element for class com.test.database.PeopleAuth Jun 08, 2015 5:49:07 PM com.sun.jersey.server.wadl.generators.AbstractWadlGeneratorGrammarGenerator attachTypes
请检查下面的代码,并告诉我什么这里错了。
这是在客户端AJAX我的代码:
var j = {IMEI: ximei, IMSI: ximsi};
var d = JSON.stringify(j);
console.log(d);
$.ajax({
url:baseurl,
contentType: "application/json; charset=utf-8",
dataType:'json',
type:'POST',
crossDomain: true,
data: d,
success:function(callbak) {
console.log(callbak);
},
error:function(XMLHttpRequest,textStatus, errorThrown) {
console.log(XMLHttpRequest);
//console.log(textStatus);
//console.log(errorThrown);
}
});
,这是我的web服务的过滤器增加了对CORS标头的东西
@Provider
public class CORSResponseFilter implements ContainerResponseFilter {
@Override
public ContainerResponse filter(ContainerRequest requestContext, ContainerResponse responseContext) {
responseContext.getHttpHeaders().putSingle("Access-Control-Allow-Origin", "*");
//responseContext.getHttpHeaders().putSingle("Access-Control-Allow-Credentials", "true");
responseContext.getHttpHeaders().putSingle("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, OPTIONS, HEAD");
responseContext.getHttpHeaders().putSingle("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With");
return responseContext;
}
}
也web.xml中
<servlet>
<servlet-name>TEST REST Service</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.test.pckg</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.api.container.ContainerResponseFilters</param-name>
<param-value>com.test.webservices.CORSResponseFilter</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
更新#1: 我已经使用Rest Console(Google Chrome Extention)测试了Web服务,它们工作正常。
您的包扫描错误“”。这'jersey.config.server.provider.packages'应该是'com.sun.jersey.config.property.packages' –
@peeskillet感谢您的回复,但我不认为是这样,因为我说的web服务工作正常与来自android – DjBuddy
的请求如果你的应用程序正在使用init-param(这是错误的),可能你的整个web.xml是无用的。尝试将'@ Provider'添加到CORS过滤器。在日志中是否还有任何例外,还是所有的信息日志? –