最近实习中遇到了一个跨域访问的问题,在今天终于解决了,在这里记录一下吧。也可以整理一下自己当中遇到的问题以及解决办法。
调用一个LDAP接口进行身份验证。我尝试通过AJAX请求进行身份的验证,其中就涉及了一个跨域访问的问题,默认情况下,XHR对象只能访问与包含它的页面位于同一域中的资源。
首先说说跨域产生的原因:
浏览器同源策略的限制,何为同源策略,即:不同域名、不同端口、不同的协议不循序共享资源。保障浏览器安全。
跨域问题的解决方案:
1、修改浏览器的设置
不建议,因为你不可能让你的每一个用户都去修改用户的浏览器设置
2、修改请求方式:jsonp
条件:需要前后端合作
JSONP通过动态
function handleResponse(response){
alert("You are at IP address" +response.ip +", which is in " +response.city +", "+response.region_name);
}
var script = document.createElement("script");
script.src = "http://freegeoip.net/json/?callback=handleResponse";
document.body.insertBefore(script,document.body.firstChild);
其中需要后端允许callback,前后端协商确定回调函数的名字,即这里的handleResponse
缺点:JSONP支支持GET请求
3、CORS
修改浏览器设置
CORS
背后思想:使用自定义的HTTP头部让浏览器与服务器进行沟通(就像人进行暗号对接一样,只是这里是在浏览器与服务器之间),从而决定请求或响应是应该成功还是应该失败。
如一个简单的使用GET或是POST发送的请求,他没有定义的头部,而主题内容是text/plian。在发送该请求时,需要给它附加额外的origin头部。其中包含请求页面的辕信息(协议、域名和端口),以便服务器根据这个头部信息来决定是否给予相应。如果服务器认为请求可以接受,就在Access-Control-Allow-Origin头部中发回相同的源信息。
如果没有这个头部信息,或者有头部信息但是不匹配,浏览器就会驳回请求。
附上觉得写的比较好的关于跨域的解答:
https://blog.csdn.net/cuixiaogang110/article/details/81948173