欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

同源跨域问题

程序员文章站 2022-05-21 17:07:11
[TOC] 1.跨域 2.解决跨域:CORS 3.跨域时,发送了2次请求? 在跨域时,发送的请求会分为两种: 简单请求,发一次请求。 复杂请求,发两次请求。 预检 请求 4.总结 1. 由于浏览器具有“同源策略”的限制,所以在浏览器上跨域发送Ajax请求时,会被浏览器阻止。 2. 解决跨域 不跨域 ......

1.跨域

由于浏览器具有“同源策略”的限制。
如果在同一个域下发送ajax请求,浏览器的同源策略不会阻止。
如果在不同域下发送ajax,浏览器的同源策略会阻止。

2.解决跨域:cors

cors,跨站资源共享,本质:设置响应头。

from django.shortcuts import render,httpresponse

def json(request):
    response = httpresponse("jsonasdfasdf")
    response['access-control-allow-origin'] = "*"
    return response
    

3.跨域时,发送了2次请求?

在跨域时,发送的请求会分为两种:

  • 简单请求,发一次请求。

    设置响应头就可以解决
    from django.shortcuts import render,httpresponse
    
    def json(request):
        response = httpresponse("jsonasdfasdf")
        response['access-control-allow-origin'] = "*"
        return response
    
  • 复杂请求,发两次请求。

  • 预检

  • 请求

    @csrf_exempt
    def put_json(request):
        response = httpresponse("json复杂请求")
        if request.method == 'options':
            # 处理预检
            response['access-control-allow-origin'] = "*"
            response['access-control-allow-methods'] = "put"
            return response
        elif request.method == "put":
            return response
条件:
    1、请求方式:head、get、post
    2、请求头信息:
        accept
        accept-language
        content-language
        last-event-id
        content-type 对应的值是以下三个中的任意一个
                                application/x-www-form-urlencoded
                                multipart/form-data
                                text/plain
 
注意:同时满足以上两个条件时,则是简单请求,否则为复杂请求

4.总结

  1. 由于浏览器具有“同源策略”的限制,所以在浏览器上跨域发送ajax请求时,会被浏览器阻止。
  2. 解决跨域
    • 不跨域
    • cors(跨站资源共享,本质是设置响应头来解决)。
      • 简单请求:发送一次请求
      • 复杂请求:发送两次请求,先options请求做预检,然后再发送真正请求