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

    成因:浏览器的同源策略会阻止域名或端口不同的源地址发送的请求,前后端都能收到请求,但是浏览器会报错,这是为了防止出现安全问题,就像xss攻击一样,对方可能发送的是一个方法名加(),如果直接接受的话就会执行这个方法,造成一些不可控的后果。

    跨域请求还分为两种:简单请求和复杂请求

    简单请求:

    Http方法是GET/POST/HEAD之一
    HTTP头信息不超出以下几种字段
      Accept, Accept-Language, Content-Language, Last-Event-ID
      Content-Type只能是下列类型中的一个
        application/x-www-from-urlencoded
        multipart/form-data
        text/plain

    不满足任何一个条件就是复杂请求。复杂请求会先发送一个OPTIONS请求进行预检

    一、jsonp方式

    浏览器的同源策略会阻止ajaxa请求,但不阻止src。

    jsonp方式其实是利用了<script>标签可以直接跨域的性质,在body中生成一个<script>标签,然后通过个这标签发送请求并拿到数据。

    但是这样的方式不能发送post请求,也不能自定义请求头。

    <script>
    
        $.ajax({
            url:"xxxxxxx",
            type:"GET",
            dataType:"jsonp",
            jsonp:"callbacks"           #给跨域的返回数据的键
            //jsonpCallbacks:"xxx"   #给定的返回函数的函数名
            success:function(arg){
                 console.log(arg)
            }
        })
    </script>

    二、cors方式

    跨域的两种原因:域名不同或端口不同,或是默认发送请求时只发送了一个响应体,cores解决跨域的本质是添加一个响应头。

    1、单个请求

    response = HttpResponse("111")
    response["Access-Control-Allow-Origin"] = "xxxx"      #发送请求的urlIP和端口

    2、全局

    class CORESMiddleware(MiddlewareMixin):
        def process_response(self,request,response):
            #添加响应头
            response["Access-Control-Allow-Origin"] = "http://xxxxx,http://xxxxx"    #表示允许这些域名跨域访问,如果对所有域名开放,则使用*号
    
            #如果是复杂请求
            response["Access-Control-Allow-Header"] = "Content-Type,xxx"         #不能使用*号
    
            #允许某些方法
            response["Access-Control-Allow-Method"] = "DELETE,PUT"
            return response
  • 相关阅读:
    29-赫夫曼树
    28-线索化二叉树
    27-顺序存储二叉树
    26-二叉树的遍历查找和删除
    25-二叉树的概念
    24-逻辑结构分析
    23-哈希表
    22-查找算法
    21-堆排序
    Mui-列表/table-view
  • 原文地址:https://www.cnblogs.com/yinwenjie/p/10942173.html
Copyright © 2011-2022 走看看