跨域总结

跨域定义

协议、端口号、域名有一个不同就是跨域。
主域名相同,子域名不同也是跨域,emial.aa.com和time.aa.com就是主域名相同,子域名不同的跨域
协议不同或者端口号不同造成的跨域,前端无法解决

跨域解决方法

1. jsonp(Get请求的跨域,安全性低)

1. 生成唯一函数名callback_uuid,在window对象上注册这个函数,window[callback_uuid] = function(){}
2. 将函数名callback_uuid发送到后端,后端生成数据JSON,拼装js文档callback_uuid(JSON),返回给客户端
3. 客户端将script标签插入到文档中,浏览器解析script标签,自动执行callback_uuid方法
4. 真正的callback函数是在callback_uuid中调用,而不是直接调用
代码实现如下:

var jsonp = (function () {
    var num = 0;
    function foo(options) {
        let { url, params, callback } = options;
        num++;
        //通过闭包内的自增数字生成唯一的函数名
        var jsonCallback = ‘jsoncallback_‘ + num;
        //注册函数到全局对象上
        window[jsonCallback] = function (data) {
            //清理回调函数名
            window[jsonCallback] = null;
            //清理script标签
            removeElement(jsonCallback);
            //调用真正的回调函数
            callback && callback(data);
        }
        //插入script标签
        var queryString = Object.keys(params).reduce((pre, cur) => {
                return pre + ‘&‘ + cur + ‘=‘ + option.params[cur];
        }, ‘‘);
        url += ‘callback=‘ + jsonCallback + queryStirng;
        var script = document.createElement(‘script‘);
        script.src = url;
        script.id = jsonCallback;
        document.getElementByTagName(‘head‘)[0].appendChild(script);
    }
    function removeElement(id) {
        var ele = document.getElementById(id),
            parent = ele.parentNode;
        if (parent && parent.nodeType != 11) {
            parent.removeChild(ele);
        }
    }
    return foo;
}());

2. CORS(各种请求均可,IE8,9只能是GET和POST请求,通用性好)
3. iframe(传统POST的最佳选择)

将<form>表单通过一个iframe来submit,将form的target属性设置为iframe的name,这样form的action URL就会在
iframe中打开,服务器返回的数据就会输出到iframe中。通过主页面和iframe的交互,完成对数据的读取。
举例:

<form action="http://www.b.com/io.php" method="POST" enctype="multipart/form-data" target="upload">
    <input type="file" name="upload_file" />
    <input type="hidden" name="backurl" value="http://www.a.com/receive" /> //注意这里!
    <input type="submit" value="开始上传" />
</form>
<iframe name="upload" id="upload" style="display:none"></iframe> //name和id都设置为upload

提交到后端之后,直接通过302跳转的backurl,将返回结果加到backurl的查询字符串里面。backurl必须是和提交的页面
是同域的页面。这样iframe里面的页面可以通过window.top.callback(查询字符串参数)来调用父页面的方法,或者读取iframe
的src中的查询字符串

4. postmessage

postmessage和iframe配合可以实现向后端跨域post数据,并且将返回值传递给主页面。

5. 后端代理或nginx代理

时间: 2024-12-24 14:08:13

跨域总结的相关文章

js跨域

第一次写博客,好紧张,不知道能写成啥样,哈哈哈. 自己的一知片解,有错请多多指教,嘻嘻嘻. 一.何为跨域? 只要协议.域名.端口后任何一个不同,就是跨域. 举个例子: http://www.example.com 协议不同 https://www.example.com http://www.example.com 域名不同 http://www.test.com http://www.example.com 端口不同 http://www.example.com:81 注意:ip相同,域名不同

实现AJAX跨域访问方式一

1.添加pom依赖 <dependency> <groupId>com.thetransactioncompany</groupId> <artifactId>cors-filter</artifactId> <version>2.6<ersion> <!--<scope>runtime</scope>--> </dependency> 2.在web.xml 中增加配置 &l

原生jsonp跨域

<script> // jsonp跨域原生写法 var script = document.createElement('script'); script.src = 'http://192.168.7.16/kuayu/test02.php?callback=aa'; document.body.appendChild(script); //aa('后台数据') function aa(res) { alert(res.website); } </script>

跨域cors方法(jsonp,document.domain,document.name)及iframe性质

这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被当作是不同的域. 下表给出了相对 http://store.company.com/dir/page.html 同源检测的结果: 要解决跨域的问题,我们可以使用以下几种方法: 1.通过jsonp跨域[解决ajax跨域] 在js中,我们直接用XMLHttpRequest请求不同域上的数据时,是不可以的

什么是跨域?怎么解决跨域问题?

什么是跨域? 跨域,指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制. 所谓同源是指,域名,协议,端口均相同,不明白没关系,举个栗子: http://www.123.com/index.html 调用 http://www.123.com/server.PHP (非跨域) http://www.123.com/index.html 调用 http://www.456.com/server.php (主域名不同:123/456,跨域)

AJAX跨域实现

原理:在同域中建立一个用于请求 别的域的代理程序,并将返回的内容发给客户端,客户端指向同域的这个代理程序 1. 客户端编写 // 其它部分都一样 //2.注册回调方法 callback xmlhttp.onreadystatechange = callback; //获取客户端内容 var userName = document.getElementById("UserName").value; //进行编码解决 中文乱码 userName = encodeURI(encodeURI(

1.NET Core Web Api跨域问题

官方说明 CORS means Cross-Origin Resource Sharing. Refer What is "Same Origin" Part Detailed Procedure 具体实践 需要引入 Microsoft.AspNetCore.Mvc.Cors 包 Cors配置 Startup.cs文件ConfigureServices方法中,将Cors服务放到容器中 services.AddCors(options); 传一个options,指定名字并配置它,这个时候

跨域问题解决方案

一.跨域问题存在的原因 二.跨域解决对比 JSONP对比CORS jsonp和cors都能解决 Ajax直接请求普通文件存在跨域无权限访问的问题 JSONP只能实现GET请求,而CORS支持所有类型的HTTP请求 使用CORS,开发者可以使用普通的XMLHttpRequest发起请求和获得数据,比起JSONP有更好的错误处理 JSONP主要被老的浏览器支持,它们往往不支持CORS,而绝大多数现代浏览器都已经支持了CORS 三.CORS跨域解决方案 1.普通Servlet跨域问题解决 http:/

说一说javascript跨域和jsonp

同源策略 在浏览器的安全策略中“同源策略”非常如雷贯耳,说的是协议.域名.端口相同则视为同源,域名也可换成IP地址,不同源的页面脚本不能获取对方的数据. 要是想使用XMLHttpRequest或者常规的AJAX请求获取另一个站点的数据,浏览器会告诉你“XXXX is not allowed by Access-Control-Allow-Orign”. 因为同源策略的存在,防止了跨域访问的安全问题,但同时也损失了方便获取资源的便利. 跨域的src属性 世事又非绝对,浏览器还是允许几个元素跨域访问

iframe跨域访问

js跨域是个讨论很多的话题.iframe跨域访问也被研究的很透了. 一般分两种情况: 一. 是同主域下面,不同子域之间的跨域: 同主域,不同子域跨域,设置相同的document.domian就可以解决; 父页访问子页,可以document.getElementById("myframe").contentWindow.document来访问iframe页面的内容:如果支持contentDocument也可以直接document.getElementById("myframe&