AJAX POST To Jersey启用了RESTful Webservice Cross Domain

时间:2015-06-08 13:29:12

标签: ajax cordova rest jersey cors

我正在开发一个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控制台(谷歌浏览器扩展程序)测试了网络服务,他们的工作正常。

2 个答案:

答案 0 :(得分:0)

我通过使用CORPS库解决了这个问题。 在dzhuvinov阅读更多内容,与我的here相同的问题。

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

答案 1 :(得分:-1)

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

更改

dataType:'json',

dataType: 'jsonp'

请参阅此处了解差异 Difference between dataType jsonp and JSON