使用CORS和JavaScript时出错

时间:2014-07-02 16:32:34

标签: javascript cors

我一直在阅读关于stackoverflow关于CORS实现的问题几周,但我仍然坚持几个错误。任何正确方向的指针都会很棒。提前谢谢。

以下是我所拥有的:

服务器设置

public void doOptions(HttpServletRequest request, HttpServletResponse response)
throws IOException {
//The following are CORS headers. Max age informs the 
//browser to keep the results of this call for 1 day.
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "GET, POST");
response.setHeader("Access-Control-Allow-Headers", "Content-Type");
response.setHeader("Access-Control-Max-Age", "86400");
//Tell the browser what requests we allow.
response.setHeader("Allow", "GET, HEAD, POST, TRACE, OPTIONS");

CLIENTSIDE Javascript               OLVM测试页面     

<SCRIPT language="JavaScript">

function setMessage(){

msg = "";
var xmlHttp;
msg = msg + "110@@@B@~20@OLVM-GL-ACCOUNT@~20";
xmlHttp=new XMLHttpRequest();
xmlHttp.open("POST","http://MYSITE.ceco.com:2900/OLVM/OLVMGateway",false);
xmlHttp.setRequestHeader("Content-Type","text/xml");
xmlHttp.send(msg);
alert(xmlHttp.responseText);
return;
}


</SCRIPT>
</head>
<body bgcolor="#FFFFFF">
<p>&nbsp;</p>
<p align="left"><font face="Arial" size="6"><b>OLVM - PBF </b></font></p>
<input type="button" name="submit" value="Submit To Server" onClick= "setMessage()" >
</body>
</html>

我在调试时看到的选项HEADER信息

Request URL:http://MYSITE.ceco.com:2900/OLVM/OLVMGateway
Request Method:OPTIONS
Status Code:200 OK
Request Headersview source
Accept:*/*
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Access-Control-Request-Headers:content-type
Access-Control-Request-Method:POST
Connection:keep-alive
Host:MYSITE.ceco.com:2900
Origin:null
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36
Response Headersview source
Access-Control-Allow-Headers:Content-Type
Access-Control-Allow-Methods:GET, POST
Access-Control-Allow-Origin:*
Access-Control-Max-Age:86400
Allow:GET, HEAD, POST, TRACE, OPTIONS
Content-Length:0
Date:Wed, 02 Jul 2014 12:13:41 GMT

我在调试时看到的POST HEADER信息

Request URL:http://MYSITE.ceco.com:2900/OLVM/OLVMGateway
Request Method:POST
Status Code:200 OK
Request Headersview source
Accept:*/*
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Content-Length:337
Content-Type:text/xml
Host:MYSITE.ceco.com:2900
Origin:null
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)  Chrome/35.0.1916.153 Safari/537.36

请求有效负载     110 @@@乙@〜20 @ OLVM-GL-ACCOUNT @〜20     响应标题来源     内容长度:7     内容类型:text / html的    日期:2014年7月2日星期三12:13:41 GMT

我知道的错误 XMLHttpRequest无法加载http://MYSITE.ceco.com:2900/OLVM/OLVMGateway。 No&#39; Access-Control-Allow-Origin&#39;标头出现在请求的资源上。 起源&#39; null&#39;因此不允许访问。 OLVM_V5.html:59

Uncaught NetworkError:无法执行&#39;发送&#39; on&#39; XMLHttpRequest&#39;:无法加载&#39; http://MYSITE.ceco.com:2900/OLVM/OLVMGateway&#39;。

1 个答案:

答案 0 :(得分:0)

您只是将标题添加到OPTIONS响应中。

但是,要成功请求,您必须在OPTIONS和POST响应中设置这些标头。

另请注意,您的代码无法在IE8中运行,因为它需要专有的XDomainRequest对象,您可以在HTML5Rocks.com example中看到:

function createCORSRequest(method, url) {
  var xhr = new XMLHttpRequest();
  if ("withCredentials" in xhr) {

    // Check if the XMLHttpRequest object has a "withCredentials" property.
    // "withCredentials" only exists on XMLHTTPRequest2 objects.
    xhr.open(method, url, true);

  } else if (typeof XDomainRequest != "undefined") {

    // Otherwise, check if XDomainRequest.
    // XDomainRequest only exists in IE, and is IE's way of making CORS requests.
    xhr = new XDomainRequest();
    xhr.open(method, url);

  } else {

    // Otherwise, CORS is not supported by the browser.
    xhr = null;

  }
  return xhr;
}

var xhr = createCORSRequest('GET', url);
if (!xhr) {
  throw new Error('CORS not supported');
}