zoukankan      html  css  js  c++  java
  • 跨域请求

    跨域请求

    同源

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

    如果有其中一个不同,就会被浏览器的同源策略阻止。

    同源策略

    同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。 可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。

    不受同源策略限制的

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

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

    同源策略限制跨域发送ajax请求。

    CORS解决跨域问题

    CORS简介

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

    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

     解决简单请求

    from django.utils.deprecation import MiddlewareMixin
    
    
    class CorsMiddleware(MiddlewareMixin):
    
        def process_response(self, request, response):
            # 给响应头加上 Access-Control-Allow-Origin 字段 并简单的设置为 * 就解决了
            response['Access-Control-Allow-Origin'] = '*'
            return response

    非简单请求

    我们开发中常用到的那些请求方法是PUT或DELETE,或者Content-Type字段的类型是application/json的都是非简单请求。对于非简单请求,浏览器通常都会在请求之前发送一次 OPTIONS 预检 请求。该请求会像后端服务询问是否允许从当前源发送请求并且询问允许的 请求方法 和 请求头字段

    举个例子:

    我们前端使用axios向后端发送PUT请求,结果:

     

    解决办法

    from django.utils.deprecation import MiddlewareMixin
    
    
    class CorsMiddleware(MiddlewareMixin):
    
        def process_response(self, request, response):
            # 给响应头加上 Access-Control-Allow-Origin 字段 并简单的设置为 *
            response['Access-Control-Allow-Origin'] = '*'
            if request.method == 'OPTIONS':
                # 允许发送 PUT 请求
                response['Access-Control-Allow-Methods'] = 'PUT, DELETE'
                # 允许在请求头中携带 Content-type字段,从而支持发送json数据
                response['Access-Control-Allow-Headers'] = 'Content-type'
            return response

    django-cors-headers解决跨域

    我们这个中间件确实能解决目前的CORS跨域问题,但是我们的土方法肯定是不够严谨的,已经有人造好轮子-- django-cors-headers 了。

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

    安装

    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项目

  • 相关阅读:
    poj 2411 Mondriaan's Dream 骨牌铺放 状压dp
    zoj 3471 Most Powerful (有向图)最大生成树 状压dp
    poj 2280 Islands and Bridges 哈密尔顿路 状压dp
    hdu 3001 Travelling 经过所有点(最多两次)的最短路径 三进制状压dp
    poj 3311 Hie with the Pie 经过所有点(可重)的最短路径 floyd + 状压dp
    poj 1185 炮兵阵地 状压dp
    poj 3254 Corn Fields 状压dp入门
    loj 6278 6279 数列分块入门 2 3
    VIM记事——大小写转换
    DKIM支持样本上传做检测的网站
  • 原文地址:https://www.cnblogs.com/lxfpy/p/11097492.html
Copyright © 2011-2022 走看看