跨域

作者: 李小白呀 | 来源:发表于2021-01-28 10:11 被阅读0次

    1. 同源策略:

    协议 域名 端口 ,三者完全相同为同源。任意一个不同就是跨域。

    2. 解决方案

    2.1 cors:

    (跨资源共享) 后台服务器提供接口时,设置允许谁访问,用什么方式访问
    设置项如下:

    access-control-allow-origin    //允许哪些站点访问,限制访问的主机源
    access-control-allow-methods  //允许哪些请求方法通过
    access-control-allow-methods  //允许哪些请求方法通过
    
    

    options类型的请求是做什么用的?
    做请求预检,向服务器发起请求询问是否支持当前这次跨域请求。

    什么时候发起options类型的请求?
    如果是简单请求,不需要发起options预检请求,非简单请求则需要。

    什么是简单请求?

    1. 请求类型 get post header三种之一,其他的类型视为非简单请求。
    2. 请求的头字段中有这几个字段 content-type accept accep-language content-length,如果超过这几个字段,比如加上了一些自定义的请求头则会被视为非简单请求。
    3. 请求的数据类型content-type的值text/plain application/x-www-form-urlencoded multipart/form-data这3种之外的其他类型视为非简单请求。
    2.2 jsonp:(json + padding:包裹的json 请求)
    1. 仅能支持 get 方法的跨域
    2. 前端发起请求时在请求路径上告诉后台返回的函数名字,如 http://www.a.com/api/users?callback=fn 的 callback 参数,后台返回时会使用 fn 包裹 json 数据
    3. 在前端代码中定义 fn 函数
    function fn(data) {
        // 使用data数据,定义业务逻辑
    }
    
    // 前端使用script标签/ajax发起请求,请求返回`fn({a:1,b:2})`, 会执行上面定义好的fn函数,前端在函数内收到从服务器返回的数据,完成了跨域数据传输
    
    
    2.3 反向代理:

    1.名词解释:
    正向:如果软件代理的是用户的请求,那么它就是正向代理。
    反向:如果软件代理的是后台处理程序,那么它就是正向代理。

    2. iframe + window.name

    1. 比如在www.a.com/abc页面下向www.b.com发起跨域请求,接口地址www.b.com/api/users

    2. www.a.com/abc页面1下嵌入一个iframe,iframe的地址是www.b.com/cde页面2,页面2发起接口请求,此时没有跨域的限制,当拿到接口的结果时,重置iframe的页面的src路径,把iframe的页面地址重置成www.a.com/aaa页面3,重置的同时把接口数据写入到window.name上,页面3加载完成后,读取window.name,写入到页面3的某个dom节点上。页面1监听iframe的加载事件,在事件处理函数中去读取页面3的dom元素,获取到数据

    3. iframe + window.hash
    3. onMessage+postMessage:ie67不支持

    相关文章

      网友评论

          本文标题:跨域

          本文链接:https://www.haomeiwen.com/subject/rudttltx.html