zoukankan      html  css  js  c++  java
  • 浏览器同源策略

    参考:

    1. 浏览器同源政策及其规避方法
    2. 跨域资源共享 CORS 详解
    3. cookie详解

    什么为同源?

    • 协议相同
    • 域名相同
    • 端口相同

    举例来说,http://www.example.com/dir/page.html这个网址,协议是http://,域名是www.example.com,端口是80(默认端口可以省略)。它的同源情况如下:

    • http://www.example.com/dir2/other.html:同源
    • http://example.com/dir/other.html:不同源(域名不同)
    • http://v2.www.example.com/dir/other.html:不同源(域名不同)
    • http://www.example.com:81/dir/other.html:不同源(端口不同)
    限制范围
    • Cookie、LocalStorage 和 IndexDB 无法读取。

    • DOM 无法获得。

    • AJAX 请求不能发送。

    Cookie详解

    如何跨域使用呢?
    • 仅子域名不一致的,设置 domain 为共同的那个域名。 JS中可以使用document.domain = 'example.com'; 设置为一级域名相同。
    • 域名一致的,将 path 设置为 /, 即该域名下的所有都可以访问。

    ajax跨域

    1. JSONP解决办法

      浏览器对于script,iframe等标签的src等属性,是没有同源策略限制的。而jsonp就很好的利用了这一点~在我们发起请求时,url后跟了一个名为func的参数,而这个参数就是之后需要用到的回调函数名称。

    2. CORS解决办法

    什么是CORS?

    CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。

    它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。

    具体实现

    浏览器将CORS请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)。

    1. 简单请求

       1. 请求方法是以下三种方法之一:
       
       	+ HEAD
       	+ GET
       	+ POST
       	
       2. HTTP的头信息不超出以下几种字段:
       
       	+ Accept
       	+ Accept-Language
       	+ Content-Language
       	+ Last-Event-ID
       	+ Content-Type:只限于三个值`application/x-www-form-urlencoded`、`multipart/form-data`、`text/plain`
      
        凡是不同时满足上面两个条件,就属于非简单请求。
      

      请求过程如下:

      1. 对于简单请求,浏览器直接发出CORS请求。具体来说,就是在头信息之中,增加一个Origin字段。
       
          如 `Origin: http://api.bob.com`
      
      2. 服务器端可以设置`Access-Control-Allow-Origin`字段来,如果为"*"为所有域名都可以
      
      3. Access-Control-Allow-Credentials:该字段可选。它的值是一个布尔值,表示是否允许发送Cookie。(**服务器端通过这个设置客户端才能发送cookie**)   
      JS 通过以下语句进行设置(**JS有的浏览器必须设置了才能发送,有些浏览器不设置也能发送**):
      
       var xhr = new XMLHttpRequest();
       xhr.withCredentials = true; //或者为false
      
      4. Access-Control-Expose-Headers:该字段可选。CORS请求时,XMLHttpRequest对象的getResponseHeader()方法只能拿到6个基本字段:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。如果想拿到其他字段,就必须在Access-Control-Expose-Headers里面指定。上面的例子指定,getResponseHeader('FooBar')可以返回FooBar字段的值。
      
    2. 非简单请求

      请求过程如下:

      1. 首先进行一次预检,"预检"请求用的请求方法是OPTIONS,表示这个请求是用来询问的。头信息里面,关键字段是Origin,表示请求来自哪个源。

      2. 非简单请求中的额外请求以及额外请求method通过预检以后,正式发送http请求。

      3. Access-Control-Max-Age:设置本次预检的有效期

  • 相关阅读:
    windows 远程连接报错
    这30类CSS选择器 你必须记在脑袋里!
    Print to the console in django without UnicodeEncodeErrors
    基于md5的解决js,css缓存问题for django
    Django开发经验
    vscode常用的插件
    点击时添加不同的类
    jQuery 点击空白,隐藏元素
    多功能日历插件:Kalendae
    jQuery中的data()方法
  • 原文地址:https://www.cnblogs.com/qiye5757/p/9428042.html
Copyright © 2011-2022 走看看