【发布时间】:2015-08-22 23:54:42
【问题描述】:
我正在开发一个 Cordova/PhoneGap 应用程序,用于与现有的 Restful Web 服务 (Jersey) 通信。 Web 服务很好,因为我已经开发了我的应用程序的 Android 版本并且它工作正常。现在我正在开发基于 iOS 的 Cordova。我已经阅读了有关 CORS 的内容以及有关跨域 AJAX 调用的相关内容。但是发送 AJAX 请求会导致以下错误:
XMLHttpRequest 无法加载 http://xxxx:xxxx/api/v1/general/authenticate1。不 请求中存在“Access-Control-Allow-Origin”标头 资源。因此不允许访问 Origin 'null'。
此外,在服务器端日志中,每个 AJAX 调用都会使用以下消息创建一堆日志:
信息:找不到类的语法元素 com.test.database.PeopleAuth 2015 年 6 月 8 日下午 5:49:07 com.sun.jersey.server.wadl.generators.AbstractWadlGeneratorGrammarGenerator 附加类型
请检查以下代码并告诉我这里有什么问题。
这是我在客户端的 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);
}
});
这是我为 CORS 标头内容添加的 Web 服务过滤器
@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 扩展)测试了 Web 服务,它们工作正常。
【问题讨论】:
-
您的包裹扫描
<init-param>错误。这个jersey.config.server.provider.packages应该是com.sun.jersey.config.property.packages -
@peeskillet 感谢您的回复,但我认为情况并非如此,因为正如我所说的那样,webservices 可以很好地处理来自 android 的请求
-
如果您的应用程序正在使用 init-param(这是错误的),那么您的整个 web.xml 可能毫无用处。尝试将
@Provider添加到 CORS 过滤器。日志中还有任何异常还是全部是信息日志? -
@peeskillet,我会测试你说的,日志都是INFO日志
-
我已将@Provider 添加到 CORSFilter,但什么也没发生,结果相同
标签: ajax cordova rest jersey cors