web-services – 如何通过预检请求从javascript调用REST Web服务?

web-services – 如何通过预检请求从javascript调用REST Web服务?,第1张

概述我试图从 javascript本身调用另一个域中的服务.我能够请求跨域服务.但我无法从服务中检索信息.一些我如何被同一原始政策阻止.请帮我在代码中找到错误. 我的客户端Javascript代码: var requestJsonData;function crossDomainCall(){ ** It will be called by button click ** request 我试图从 javascript本身调用另一个域中的服务.我能够请求跨域服务.但我无法从服务中检索信息.一些我如何被同一原始政策阻止.请帮我在代码中找到错误.

我的客户端Javascript代码:

var requestJsonData;function crossDomainCall(){  ** It will be called by button click **    requestJsonData = createCORSRequest('POST','IPAddress/servicePath');    if (requestJsonData){        requestJsonData.onreadystatechange = handler;        requestJsonData.send();    }    else {        alert('Cross Domain Call is not invoked');    }}function handler(evtXHR) {    if(requestJsonData.readyState   ==  4) {        if(requestJsonData.status   ==  200) {            var response    =   requestJsonData.responseText;        }        else {            alert(" Invocation Errors Occured " + requestJsonData.readyState + " and the status is " + requestJsonData.status);        }    }    else {        alert("currently the application is at " + requestJsonData.readyState);    }}function createCORSRequest(method,url){    var xhr;        xhr = new XMLhttpRequest();    if ("withCredentials" in xhr){        xhr.open(method,url,true);        xhr.setRequestheader('X-PingOTHER','Pingpong');    } else if (typeof XDomainRequest != "undefined"){        xhr = new XDomainRequest();        xhr.open(method,url);    } else {        xhr = null;    }    return xhr;}

服务代码:

@OPTIONS@Path("/servicePath")@Produces("*/*")@Consumes("*/*")public Response corsRequest() {    Response response   =   null;    ResponseBuilder builder =   null;    builder =   Response.ok();    builder.header("Access-Control-Allow-headers","X-PingOTHER");    builder.header("Access-Control-Max-Age","1728000");    builder.header("Access-Control-Allow-Origin","Origin_Ip_Address");    builder.header("Access-Control-Allow-Methods","POST,GET,OPTIONS");    builder.header("Content-Type","text/plain");    builder.header("Connection","Keep-Alive");    response    =   builder.build();    System.out.println("Exited from Options method");    return response;}@POST@Path("/servicePath")@Produces("application/Json")public String drawRegions() {    System.out.println("Entered insIDe Post method");            // Some calculation to arrive JsonObject.    return JsonObject;}

从代码中,我收到了以下结果.

选项方法请求和响应标头

请求标题:

OPTIONS / SolartisGeoCodeLookUpService / Service / drawRegions http / 1.1

主持人:Cross_Domain_IP_Address

User-Agent:Mozilla / 5.0(X11; linux x86_64; rv:25.0)Gecko / 20100101 firefox / 25.0

接受:text / HTML,application / xhtml xml,application / xml; q = 0.9,/; q = 0.8

Accept-Language:en-US,en; q = 0.5

Accept-EnCoding:gzip,deflate

来源:Origin_IP_Address

访问控制请求方法:POST

Access-Control-Request-headers:x-Pingother

连接:保持活力

Pragma:没有缓存

缓存控制:无缓存

响应标题

http / 1.1 200好的

服务器:Apache-Coyote / 1.1

Access-Control-Allow-headers:X-PingOTHER

连接:保持活力

access-control-allow-origin:Origin_IP_Address

Access-Control-Max-Age:1728000

Access-Control-Allow-Methods:POST,OPTIONS

Content-Type:text / plain

内容长度:0

日期:星期四,2013年12月12日12:39:27 GMT

响应缓存标头

缓存中的响应标头

Access-Control-Allow-head … X-PingOTHER
Access-Control-Allow-Meth … POST,OPTIONS
Access-Control-Max-Age 1728000
连接保持活跃
内容长度0
内容类型文本/普通
日期:2013年12月12日星期四12:39:27 GMT
服务器Apache-Coyote / 1.1
access-control-allow-original Origin_IP_Address

POST方法请求和响应标头

请求标题

POST / servicePath http / 1.1

主持人:crossDomain_IP_Address

User-Agent:Mozilla / 5.0(X11; linux x86_64; rv:25.0)Gecko / 20100101 firefox / 25.0

接受:text / HTML,deflate

X-PingOTHER:乒乓球

来源:Origin_IP_Address

连接:保持活力

Pragma:没有缓存

缓存控制:无缓存

内容长度:0

响应标题

http / 1.1 200好的

服务器:Apache-Coyote / 1.1

Content-Type:text / Json

内容长度:128

日期:星期四,2013年12月12日12:39:27 GMT

附加信息
从JavaScript两次调用处理程序方法.在第一次,它出现了“当前应用程序是2” – readyState值.在第二次,它出现了“调用错误Occured 4(readyState值)和状态代码为0(响应状态代码)”.第二次回复清楚地说,调用服务已被相同的原始政策停止.但我不知道如何克服这个问题,必须访问资源.请纠正我的代码,帮助我.

解决方法 而不是在JavaScript中处理X域调用,为什么不在您的应用程序本地开发使用其他域中的Web服务的服务,然后您可以通过JavaScript调用本地服务.

我也建议您使用jquery执行跨域AJAX调用,请参阅此链接:http://www.pureexample.com/jquery/cross-domain-ajax.html.

没有必要直接处理XHR,因为你有jquery为你做.

希望这可以帮助,

问候.

总结

以上是内存溢出为你收集整理的web-services – 如何通过预检请求从javascript调用REST Web服务?全部内容,希望文章能够帮你解决web-services – 如何通过预检请求从javascript调用REST Web服务?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1138976.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-31
下一篇2022-05-31

发表评论

登录后才能评论

评论列表(0条)

    保存