2015-06-08 80 views
1

我正在开发一个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服务,它们工作正常。

+0

您的包扫描错误“”。这'jersey.config.server.provider.packages'应该是'com.sun.jersey.config.property.packages' –

+0

@peeskillet感谢您的回复,但我不认为是这样,因为我说的web服务工作正常与来自android – DjBuddy

+0

的请求如果你的应用程序正在使用init-param(这是错误的),可能你的整个web.xml是无用的。尝试将'@ Provider'添加到CORS过滤器。在日志中是否还有任何例外,还是所有的信息日志? –

回答

-1

对于跨域,您需要使用JSONP而不是JSON作为类型。确保将其作为服务器端代码支持。

变化

dataType:'json', 

dataType: 'jsonp' 

这里指的差价 Difference between dataType jsonp and JSON

+0

我之前做过这个,不是解决方案 – DjBuddy

0

我通过使用军团库解决了这个问题。 阅读更多在dzhuvinov,同样的问题,像我的here

问题解决了,但我不知道为什么,真的很想知道(寻找它),如果有人知道请评论。