RSS

简单实现javascript AJAX跨域POST远程访问的问题

发布日期:2022/11/12 11:05

其实问题很简单,可以POST请求,服务器也返回响应了,是现代浏览器的安全机制导致本地javascript无法处理响应。调试控制台显示:

Access to XMLHttpRequest at 'https://ip.taotu.org/' from origin 'null' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

问题是如果你本地页面Post,浏览器会自动加一个header,Origin:null,返回响应时如果服务器没有添加响应标头Access-Control-Allow-Origin:*,或者服务端返回的标头value和你发出的标头中Origin不匹配,浏览器客户端便不将响应数据交给javascript处理,产生错误。

解决:其实很简单,服务器后端代码,我们只需检测post的数据是否含有指定信息(相当于我们自己用的密码),是的话,添加Access-Control-Allow-Origin:*,这样客户端就能正确处理。

总结就是AJAX跨域请求默认不允许,浏览器会禁止,服务端判断情况是否需要,返回一个Access-Control-Allow-Origin:*响应标头就OK了。

请求页面javascript代码:

var xhttp = new XMLHttpRequest();

xhttp.onreadystatechange = function () {

if (this.readyState == 4 && this.status == 200) {

document.getElementById("queryipinfo").innerHTML =

this.responseText;

}

};

xhttp.open("POST", "https://ip.taotu.org", true);

xhttp.send(‘XX来自远程请求XX’+ipdomain); //重点代码 添加的前面字符串相当于我们自己的密码

服务端处理代码:

Stream oPostData = Request.InputStream;

byte[] bPostByte=new byte[oPostData.Length];

oPostData.Read(bPostByte, 0, (int)oPostData.Length);

string sPostIPDomain=Encoding.UTF8.GetString(bPostByte);

bool bFromRemote;

if (sPostIPDomain.StartsWith("XX来自远程请求XX")) //重点代码

{

bFromRemote=true;

sPostIPDomain = Regex.Replace(sPostIPDomain,"XX来自远程请求XX(.*)", "$1");

********省略的代码********

if (bFromRemote) //重点代码 判断是否返回标头

Response.AddHeader("Access-Control-Allow-Origin", "*"); //重点代码

附带说下,正常的解决办法是在服务器响应标头中设置Access-Control-Allow-Origin:*,允许所有跨域请求,或者Access-Control-Allow-Origin:https://taotu.org,允许指定域发出的请求,这是正常网络开发所使用的,但如果需求是像我在家里本地发出的请求域是IP地址,并且不是固定IP,这是没法长期解决的,所以我用了这个简单方法解决。

我的目的是家里本地电脑浏览器设置一个静态.html文件,并且设为默认首页,每次打开浏览器,通过java发送一个post请求到远程服务器,返回我的外网IP并显示。静态页面上还有一些我常用网址链接,还有三合一搜索引擎。

这是我搞的一个小网页,欢迎访问或设为首页:https://ip.taotu.org

简单实现javascript AJAX跨域POST远程访问的问题

用户评论

添加新评论

验证码

188金宝博 - 亚洲最佳体育滚球首选平台