Django框架12 /同源、跨域、CORS

Django框架12 /同源、跨域、CORS

1. 同源策略

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

  2. 同源是指:域名,协议,端口相同。

  3. 如果非同源,那么在请求数据后,浏览器得到非同源的响应数据时会在控制台中报一个异常,提示拒绝访问。

2. 跨域

  • 当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域。

  • 由于浏览器具有“同源策略”的限制。

  • 如果在同一个域下发送ajax请求,浏览器的同源策略不会阻止。

  • 如果在不同域下发送ajax请求,浏览器的同源策略会阻止。

3. 解决跨域:CORS/跨域资源共享

  • 本质在数据返回值设置响应头

    from django.shortcuts import render,HttpResponse
    
    def json(request):
        response = HttpResponse("JSONasdfasdf")
        response['Access-Control-Allow-Origin'] = "*"
        return response
    
  • 在跨域时,发送的请求会分为两种

    1.简单请求,发一次请求

    # 设置响应头就可以解决
    from django.shortcuts import render,HttpResponse
    
    def json(request):
        response = HttpResponse("JSONasdfasdf")
        response['Access-Control-Allow-Origin'] = "*"
        return response
    

    2.复杂请求,发两次请求,先进行预检/再发送请求

    预检: 其实做检查,检查如果通过则允许传输数据,检查不通过则不再发送真正想要发送的消息

    @csrf_exempt
    def put_json(request):
        response = HttpResponse("JSON复杂请求")
        if request.method == 'OPTIONS':
            # 处理预检
            response['Access-Control-Allow-Origin'] = "*"
            response['Access-Control-Allow-Methods'] = "PUT"
        	response['Access-Control-Allow-Headers'] = 'content-type,application/json'
            return response
        elif request.method == "PUT":
            return response
    
    # 条件:
    1、请求方式:HEAD、GET、POST
    2、请求头信息:
        Accept
        Accept-Language
        Content-Language
        Last-Event-ID
        Content-Type 
        # Content-Type对应的值是以下三个中的任意一个
        application/x-www-form-urlencoded
        multipart/form-data
        text/plain
    
    # 注意:同时满足以上两个条件时,则是简单请求,否则为复杂请求
    
posted @ 2019-10-17 23:02  LBZHK  阅读(132)  评论(0编辑  收藏  举报