zoukankan      html  css  js  c++  java
  • 跨域

    补充知识:【与跨域无关】

    1、简单请求与复杂请求区别?
      复杂请求会先发出一个预请求,我们也叫预检,OPTIONS请求,简单请求则没有
    2、如何区分简单请求与复杂请求?
    简单请求:
    HTTP方法是下列方法之一
      HEAD,GET,POST
    HTTP头信息不超出以下几种字段
      Accept,Accept-Language,Last-Event-ID,Content-Type(application/x-www-form-urlencoded,multipart/form-data,text/plain  三种其中之一)
    复杂请求:
    不满足上述任何一个条件的请求,是复杂请求

    --------------------------------分割线-------------------------------------

    跨域

    1、跨域概念:
      浏览器访问地址和ajax请求的地址,两者域名或者端口不同,叫做跨域
    2、产生原因:
      浏览器的同源策略~
      浏览器访问地址和ajax请求的地址域名或端口不一样,ajax就被阻止,为了安全
    3、例外情况:
      浏览器只阻止表单以及ajax请求,并不会阻止src请求,所以我们的cnd,图片等src请求都可以发
    4、解决办法:

    第一种:jsonp:实现原理是根据浏览器不阻止src请求入手

    class Test(APIView):
    
        def get(self, request):
            callback = request.query_params.get("callback", "")
            ret = callback + "(" + "'success'" + ")"
            return HttpResponse(ret)
    jsonp实现的后端代码
    <button id="btn_one">点击我向JsonP1发送请求</button>
    <script>
        // 测试发送请求失败 跨域不能得到数据
        $('#btn_one').click(function () {
            $.ajax({
                url: "http://127.0.0.1:8000/jsonp1",
                type: "get",
                success: function (response) {
                    console.log(response)
                }
            })
        });
        
        function handlerResponse(response) {
            alert(response)
        };
        
        window.onload = function () {
            $("#btn_one").click(function () {
                let script_ele = document.createElement("script");
                script_ele.src = "http://127.0.0.1:8000/jsonp1?callback=handlerResponse";
                document.body.insertBefore(script_ele, document.body.firstChild);
            })
        }
    
    
    </script>
    jsonp前端代码

    JsonP解决跨域只能发送get请求,并且实现起来需要前后端交互比较多。

    第二种:在中间件添加响应头

    first、先在项目目录下新建midwares/my_midware.py

     second、

    from django.utils.deprecation import MiddlewareMixin
    
    
    class MyCors(MiddlewareMixin):
        def process_response(self, request, response):
            response["Access-Control-Allow-Origin"] = "*"
            if request.method == "OPTIONS":
                response["Access-Control-Allow-Headers"] = "Content-Type"
                response["Access-Control-Allow-Methods"] = "DELETE, PUT, POST"
            return response

     third、注册

    response["Access-Control-Allow-Origin"]="*" 告诉浏览器任何跨域都不拦截

    复杂请求会有OPTIONS预检,还需要额外加Allow-Methods=“DELETE, PUT, POST”表示这三种请求不跨域

    如果POST请求发的是JSON格式,JSON是复杂请求,content-type不是简单请求的三种,要加上Allow-Headers=“Content-Type”表示content-type不跨域

  • 相关阅读:
    Eclipse下Tomcat插件的安装
    支付宝接口资料解读
    文件转换器服务推荐
    接吻的学问
    Web小工具推荐
    两个优秀的免费字体资源
    每年考证时间
    Visual Studio 2008 简体中文版和MSDN下载
    生活小经验
    UIScrollView and lazy loading
  • 原文地址:https://www.cnblogs.com/staff/p/12662761.html
Copyright © 2011-2022 走看看