zoukankan      html  css  js  c++  java
  • 跨域

    跨域

    跨域是指从一个域请求另一个域的资源。跨域是由于浏览器的同源策略导致的,跨域限制主要是为了用户信息的安全考虑,防止恶意网站窃取数据

    只要协议、域名、端口其中的一个不同,都会被当成不一样的域,之间的相互请求就是跨域。

    • DOM同源策略:禁止对不同页面的DOM进行操作,主要场景是iframe跨域请求,不同域的iframe之间限制访问
    • XMLHttpRequest同源策略:禁止使用不同的XHR对象向不同源的服务器地址发送http请求

    解决方法

    1.跨域资源共享(CORS)

    推荐阮一峰跨域资源共享CORS

    CORS跨域资源请求分为简单请求和非简单请求

    1. 简单请求
      简单请求必须同时满足以下两个条件
      (1)请求方式必须是以下三种

      • post
      • get
      • head

      (2)HTTP的头部信息不能超出以下字段

      • Accept
      • Accept-Language
      • Conten-Language
      • Last-Event-ID
      • Content-Type //只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain
    2. 非简单请求
      凡是不同时满足以上两个条件的都成为非简单请求

    非简单请求会在正式通信之前增加一次HTTP查询请求,成为“预检”请求,通过预检请求之后,以后的每次请求就像简单请求一样

    2.JSONP

    原理是动态插入<script>标签,通过<script>标签动态引入一个js文件,文件载入成功后就会执行url中传递的函数,并且会把我们需要的json数据作为参数传入。但是JSONP的缺点就是适合于GET请求。

    3.设置document.domain共享cookie

    cookie是服务器写入浏览器的一小段信息,只有同源的网页才能共享。但是两个网页一级域名相同,只是二级域名不相同,浏览器就允许通过设置document.domain来共享cookie

    • 但是这种方法只适用于cookieiframeLocalStorageIndexDB无法通过这种方法规避同源政策
    • 一个页面框架(iframe/frame)之间(包括父子或同辈),能够获取彼此的window对象,但是这个window对象不能获取方法和属性

    4.使用window.name进行跨域

    浏览器窗口有window.name属性,这个属性的最大的特点就是:在一个窗口的生命周期内,窗口载入的所有页面都共享一个window.name,每个页面都对它有读写的权利,window.name是持久的存在于窗口载入的所有页面中的,不会因为新的窗口的载入而被重置。

    • window.name的容量很大,可以放置很长的字符串

    5.使用postMessage进行跨域

    HTML5引入了一个跨文档通信API,这个API为window对象新增了一个window.postMessage方法,允许垮窗口通信,不论这两个窗口是否同源

    比如:父窗口http://a.com向子窗口http://b.com发消息,只需调用postMessage方法

    var p = window.open("http://b.com","title");
    p.postMessage("hello","http://b.com");
    

    postMessage的第一个参数是需要传递的具体信息内容,第二个参数是接收消息窗口的源。也可以设为“*”,表示不限制域名,可以向所有窗口发送。

  • 相关阅读:
    python 文件目录/方法
    python文件
    python模块
    python数据结构
    python函数
    python迭代器和生成器
    python循环语句
    python控制语句 if
    python数字
    个人课程总结
  • 原文地址:https://www.cnblogs.com/Pvision/p/8410876.html
Copyright © 2011-2022 走看看