zoukankan      html  css  js  c++  java
  • Django之corsheaders[跨域设置]

    跨域请求

    概述

    在 HTML 中,<a>, <form>, <img>, <script>, <iframe>, <link> 等标签以及 Ajax 都可以指向一个资源地址,
    而所谓的跨域请求就是指:当前发起请求的域与该请求指向的资源所在的域不一样。这里的域指的是这样
    的一个概念:我们认为若协议 + 域名 + 端口号均相同,那么就是同域。

    安全问题

    ​ 通常,浏览器会对上面提到的跨域请求作出限制。浏览器之所以要对跨域请求作出限制,是出于安全方面

    的考虑,因为跨域请求有可能被不法分子利用来发动 CSRF攻击。

    跨域解决方法

    JSONP

    原理:
    • JSONP 是一种非官方的跨域数据交互协议
    • JSONP 本质上是利用 <script><img><iframe> 等标签不受同源策略限制,可以从不同域加载并执行资源的特性,来实现数据跨域传输。
    • JSONP由两部分组成:回调函数和数据。回调函数是当响应到来时应该在页面中调用的函数,而数据就是传入回调函数中的JSON数据。
    • JSONP 的理念就是,与服务端约定好一个回调函数名,服务端接收到请求后,将返回一段 Javascript,在这段 Javascript 代码中调用了约定好的回调函数,并且将数据作为参数进行传递。当网页接收到这段 Javascript 代码后,就会执行这个回调函数,这时数据已经成功传输到客户端了。
    优缺点:

    JSONP 的优点是:它不像XMLHttpRequest对象实现的Ajax请求那样受到同源策略的限制;它的兼容性更好,在更加古老的浏览器中都可以运行。

    JSONP 的缺点是:它只支持 GET 请求,而不支持 POST 请求等其他类型的 HTTP 请求

    CORS

    跨源资源共享 Cross-Origin Resource Sharing(CORS) 是一个新的 W3C 标准,它新增的一组HTTP首部字段,允许服务端其声明哪些源站有权限访问哪些资源。换言之,它允许浏览器向声明了 CORS 的跨域服务器,发出 XMLHttpReuest 请求,从而克服 Ajax 只能同源使用的限制。

    ​ 另外,规范也要求对于非简单请求,浏览器必须首先使用 OPTION 方法发起一个预检请求(preflight request),从而获知服务端是否允许该跨域请求,在服务器确定允许后,才发起实际的HTTP请求。对于简单请求、非简单请求以及预检请求的详细资料可以阅读HTTP访问控制(CORS)

    与 JSONP 的比较
    • JSONP 只能实现 GET 请求,而 CORS 支持所有类型的 HTTP 请求
    • 使用 CORS ,开发者可以是使用普通的 XMLHttpRequest 发起请求和获取数据,比起 JSONP 有更好的错误处理
    • 虽然绝大多数现代的浏览器都已经支持 CORS,但是 CORS 的兼容性比不上 JSONP,一些比较老的浏览器只支持 JSONP

    Django 中如何解决跨域请求

    安装 django-cors-headers
    pip install django-cors-headers

    注册应用

    INSTALLED_APPS = (
    ...
    'corsheaders',
    ...
    )

    中间层设置

    MIDDLEWARE = [  
        ...
        'corsheaders.middleware.CorsMiddleware',
        'django.middleware.common.CommonMiddleware',
        ...
    ]

    添加白名单

    # CORS 设置跨域域名
    CORS_ORIGIN_WHITELIST = (
    '127.0.0.1:8080',
    'localhost:8080',
    'www.xxxx.com:8080',
    'api.xxxx.com:8000'
    )
    CORS_ALLOW_CREDENTIALS = True # 允许携带cookieALLOWED_HOSTS = ['www.xxxx.com:8080','api.xxxx.com:8000','127.0.0.1']# 前端需要携带cookies访问后端时,需要设置withCredentials: true

    设置允许访问的方法

    CORS_ALLOW_METHODS = (
    'GET',
    'POST',
    'PUT',
    'PATCH',
    'DELETE',
    'OPTIONS'
    )

    设置允许的header

    CORS_ALLOW_HEADERS = (
    'x-requested-with',
    'content-type',
    'accept',
    'origin',
    'authorization',
    'x-csrftoken'
    )
    不论你在什么时候开始,重要的是开始之后就不要停止。 不论你在什么时候结束,重要的是结束之后就不要悔恨。
  • 相关阅读:
    [考试反思]1108csp-s模拟测试105: 傀儡
    [考试反思]1107csp-s模拟测试104: 速度
    联赛前的咕咕咕(小计划)
    [考试反思]1106csp-s模拟测试103: 渺茫
    csp-s模拟测试101的T3代码+注释
    [考试反思]1105csp-s模拟测试102: 贪婪
    [考试反思]1105csp-s模拟测试101: 临别
    [考试反思]1104csp-s模拟测试100: 终结
    [考试反思]1103csp-s模拟测试99: 美梦
    [考试反思]1102csp-s模拟测试98:苟活
  • 原文地址:https://www.cnblogs.com/yunhgu/p/14133603.html
Copyright © 2011-2022 走看看