我正在开发一个Cordova / PhoneGap应用程序,用于通信现有的Restful web-services(Jersey)。网络服务很好,因为我已经开发了我的应用程序的Android版本,它工作正常。现在我正在开发基于iOS的Cordova。我已经阅读了有关CORS和有关跨域AJAX调用的相关内容的内容。但是发送AJAX请求会导致以下错误:
XMLHttpRequest无法加载 HTTP:// XXXX:XXXX / API / V1 /一般/ authenticate1。没有 '访问控制允许来源'标题出现在请求的上 资源。起源' null'因此不允许访问。
同样在服务器端日志中,每个AJAX调用都会使用以下消息创建一堆日志:
信息:无法找到课堂上的语法元素 com.test.database.PeopleAuth 2015年6月8日下午5:49:07 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);
}
});
这是我为WebS服务器过滤器添加的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控制台(谷歌浏览器扩展程序)测试了网络服务,他们的工作正常。
答案 0 :(得分:0)
答案 1 :(得分:-1)
对于跨域,您需要使用JSONP而不是JSON作为类型。确保这也支持作为服务器端代码。
更改
dataType:'json',
到
dataType: 'jsonp'