简单实现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
用户评论
添加新评论