zoukankan      html  css  js  c++  java
  • 跨域问题

    跨域问题

    一、同源策略

    只允许当前页面朝当前域下发请求,如果向其他域发请求,请求可以正常发送,数据也可以拿回,但是被浏览器拦截了

    只有IP和端口号都相同才是同一个域

    二、CORS(跨域资源共享)

    整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。

    只要服务器实现了CORS接口,就可以跨源通信。

    CORS在服务端做允许访问的中间件设置

    三、CORS两种请求(简单请求与非简单请求)

    # 原理
    def test(request):
        import json
        obj=HttpResponse(json.dumps({'name':'lqz'}))
        # obj['Access-Control-Allow-Origin']='*'
        obj['Access-Control-Allow-Origin']='http://127.0.0.1:8004'
        return obj
    

    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
    

    凡是不同时满足上面两个条件,就属于非简单请求。

    2、非简单请求(两次请求)

    一次预检(OPTION请求),只有服务端允许发请求,才能继续发第二次正常请求,即一次真正的请求

    四、CORS在Django中的应用

    1、简单请求

    (1)定义一个中间件

    from django.utils.deprecation import MiddlewareMixin
    
    class MyCorsMiddle(MiddlewareMixin):
        def process_response(self,request,response):
            # 允许http://127.0.0.1:8001域向我发请求
            # response['Access-Control-Allow-Origin']='http://127.0.0.1:8001'
            # 允许所有人向我发请求
            response['Access-Control-Allow-Origin'] = '*'
            return response
    

    (2)注册中间件

    MIDDLEWARE = [
        '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',
        'app01.MyMiddle.MyCorsMiddle'
    ]
    

    2、非简单请求

    (1)定义一个中间件

    from django.utils.deprecation import MiddlewareMixin
    
    class MyCorsMiddle(MiddlewareMixin):
        def process_response(self,request,response):
            # 处理简单请求:
            response['Access-Control-Allow-Origin'] = '*'
            # 处理非简单请求
            if request.method == 'OPTIONS':
                # 所有的头信息都允许
                response['Access-Control-Allow-Headers'] = '*'
            return response
    

    (2)注册中间件

    MIDDLEWARE = [
        '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',
        'app01.MyMiddle.MyCorsMiddle'
    ]
    
    • 允许的域可以在配置文件中配置

  • 相关阅读:
    Flink sql 写 Hbase 忽略空列
    python协程系列(一)——生成器generator以及yield表达式详解
    Python中可迭代对象,迭代器和生成器的异同点
    Python生成器: send函数、close函数与yield关键字协作
    sqlalchemy的基本用法
    Windows10激活后又提示未激活解决办法
    parseaddr函数和formataddr函数的用法
    VisualStudio Code Remote 调试方法(错误Containers Docker version 17.12.0 or later required.)
    SpringBoot Jar Windows CMD 运行卡顿
    使用Aspose.cells(java)将excel转为图片等
  • 原文地址:https://www.cnblogs.com/9527mwz/p/11200610.html
Copyright © 2011-2022 走看看