• 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
  • 相关阅读:
    向多页TABLE中插入数据时,新增行总是在当前页的最后一行
    本地Run Page时报检测到意外的 URL 参数,它将被忽略。
    本地Jdev Run PG报严重: Socket accept failed错误
    手动编译JAVA类
    动态创建OATipBean
    OAF TABLE中第一列添加事件不生效
    QML的Window与ApplicationWindow
    android studio快捷键
    Android Studio报错view is not constrained
    自定义信号
  • 原文地址:https://www.cnblogs.com/yinwenjie/p/10942173.html
Copyright © 2020-2023  润新知