zoukankan      html  css  js  c++  java
  • 浏览器的同源策略及CORS跨域解决方案 DRF

    一个源的定义

    如果两个页面的协议,端口(如果有指定)和域名都相同,则两个页面具有相同的

    举个例子:

    下表给出了相对http://a.xyz.com/dir/page.html同源检测的示例: 

    URL结果原因
    http://a.xyz.com/dir2/other.html 成功  
    http://a.xyz.com/dir/inner/another.html 成功  
    https://a.xyz.com/secure.html 失败 不同协议 ( https和http )
    http://a.xyz.com:81/dir/etc.html 失败 不同端口 ( 81和80)
    http://a.opq.com/dir/other.html 失败 不同域名 ( xyz和opq)

    同源策略

    同源策略是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源。所以xyz.com下的js脚本采用ajax读取abc.com里面的文件数据是会被拒绝的。

    同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的重要安全机制。

    不受同源策略限制的

    1. 页面中的链接,重定向以及表单提交是不会受到同源策略限制的。

    2. 跨域资源的引入是可以的。但是js不能读写加载的内容。如嵌入到页面中的<script src="..."></script>,<img>,<link>,<iframe>等。

    CORS解决跨域问题

    CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。它允许浏览器向跨源服务器发出XMLHttpRequest请求,从而解决AJAX只能同源使用的限制。

    CORS简介

    CORS需要浏览器和服务器同时支持。目前基本上主流的浏览器都支持CORS。所以只要后端服务支持CORS,就能够实现跨域。

    简单请求和非简单请求介绍

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

    一个请求需要同时满足以下两大条件才属于简单请求。

    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
    

    使用django-cors-headers解决目前的CORS跨域问题

    我们只需要安装这个包,然后按需要配置一下就可以了。

    安装

     pip install django-cors-headers

    注册APP

     INSTALLED_APPS = [
        ...
        'app01.apps.App01Config',
        'corsheaders',  # 将 corsheaders 这个APP注册
    ]

    添加中间件

    必须放在最前面,因为要先解决跨域的问题。只有允许跨域请求,后续的中间件才会正常执行。

    MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware', # 添加中间件
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ]

    配置

    你可以选择不限制跨域访问

     CORS_ORIGIN_ALLOW_ALL = True

    或者你可以选择设置允许访问的白名单

     CORS_ORIGIN_ALLOW_ALL = False
    CORS_ORIGIN_WHITELIST = (
        # '<YOUR_DOMAIN>[:PORT]',
        '127.0.0.1:8080'
    )

    更多详细配置详细请查看django-cors-headers项目

  • 相关阅读:
    Ajax组件(wagang版)
    动画组件(wagang版)之基础篇:跳帧与延时
    Ajax组件(wagang版)之无依赖化
    ✍23 postgresql批量删除表
    ✍20 samba共享服务
    ✍16 asyncio异步IO
    ✍19 Tensonfow(GPU)使用
    ✍25 mysqlclient 安装(linux,mac)
    ✍17 aiohttp模块的使用
    ✍18 Linnux上安装node.js
  • 原文地址:https://www.cnblogs.com/niuli1987/p/10252214.html
Copyright © 2011-2022 走看看