跨域两种方案

跨域中间件文件

JsonP解决

  • 客户端
  1. 通过js代码动态script标签,将请求生成src
  2. 定义一个回调函数
  • 服务端
  1. 获取到回调函数名
  2. 返回数据格式:函数名(数据)

<div>
<input type='button' onclick='get_data'   value="点击获取">
</div>

<script>

function get_data(){
    // 发送一个jsonp请求
        var tag = document.createElement('script');
        tag.src = "http://www.baidu.com/data.html?callback=list"
        document.head.appendChild(tag);
        document.head.removed(tag);    // 发送请求完后动态删除标签
    }

// 定义一个和callback函数名一样的函数
function list(arg){

    console.log(arg)

    }

</script>

CORS

CORS即Cross Origin Resource Sharing 跨域资源共享,

那么跨域请求还分为两种,一种叫简单请求,一种是复杂请求~~

  • 简单请求
    HTTP方法是下列方法之一

  HEAD, GET,POST

HTTP头信息不超出以下几种字段

  Accept, Accept-Language, Content-Language, Last-Event-ID

  Content-Type只能是下列类型中的一个

    application/x-www-from-urlencoded

    multipart/form-data

    text/plain

任何一个不满足上述要求的请求,即会被认为是复杂请求~~【 json格式的数据就是一个负责请求】

复杂请求会先发出一个预请求,我们也叫预检,OPTIONS请求~~

浏览器的同源策略

跨域是因为浏览器的同源策略导致的,也就是说浏览器会阻止非同源的请求~~

那什么是非同源呢 即域名不同,端口不同都属于非同源的~~

浏览器只阻止表单以及ajax请求,并不会阻止src请求,所以我们的cnd,图片等src请求都可以发~~

  • JSONP

jsonp的实现原理是根据浏览器不阻止src请求入手~来实现的~~

  • 后端
class Test(APIView):

    def get(self, request):
        callback = request.query_params.get("callback", "")
        ret = callback + "(" + "'success'" + ")"
        return HttpResponse(ret)
  • 前端
 <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解决跨域只能发送get请求,并且实现起来需要前后端交互比较多。**
  • CORS

就是服务端添加响应头response["Access-Control-Allow-Origin"] = "*",如果是复杂请求,会先发option请求预检

  • django可以在中间件中实现,自定义一个中间件,然后去setting中注册

from django.utils.deprecation import MiddlewareMixin

class ExemptAllowOriginMiddleware(MiddlewareMixin):
    """解决跨域,添加一个响应头"""

    def process_reponse(self, request, response):
        response["Access-Control-Allow-Origin"] = '*'
        if request.method == 'OPTIONS':
            # 本质是在请求头里加上一个请求头,ajax中header对应的字典里的字段
            response['Access-Control-Allow-Headers'] = "Content-Type"
            response['Access-Control-Allow-Methods'] = "POST,PUT,PATCH,DELETE"
            return response

原文地址:https://www.cnblogs.com/sunxiuwen/p/10252624.html

时间: 2024-10-09 19:24:36

跨域两种方案的相关文章

【SSH进阶之路】一步步重构容器实现Spring框架——解决容器对组件的“侵入式”管理的两种方案--主动查找和控制反转(九)

目录 [SSH进阶之路]一步步重构容器实现Spring框架--从一个简单的容器开始(八) [SSH进阶之路]一步步重构容器实现Spring框架--解决容器对组件的"侵入式"管理的两种方案--主动查找和控制反转(九) [SSH进阶之路]一步步重构容器实现Spring框架--配置文件+反射实现IoC容器(十)(未更新) [SSH进阶之路]一步步重构容器实现Spring框架--彻底封装,实现简单灵活的Spring框架(十一)(未更新) 对于IOC的原理,我们曾经写过一篇博文,[SSH进阶之路

HBase存储时间相关多列数据的两种方案

所谓“时间相关多列数据”指的是同一个Key下具有多个属性数据,并且这些数据与时间具有相关性,多数场景是该Key对应在不同时间时刻的行为数据.在实际应用中,这类数据很多,例如电子商务网站上用户最近一段时间浏览的宝贝集合.访问的URL列表等. 使用HBase存储此类数据时,有以下两种常用的方案: 多行单列 表结构设计 Row Key:用户标识ID + (Long.MAX_VALUE - timestamp) Column Family:’cf’ Column Qualifier:’’ Value:宝

PHP页面静态化:真静态的两种方案

---------------------------------------------------------------------------------------------- 方案1:如果静态文件存在,且生成时间30秒内,直接返回静态页面(有时间延迟)/*|------------------| <www.chenwei.ws>|------------------*/header('content-type:text/html;charset=utf-8'); $id = $_

Linux下实现秒级定时任务的两种方案

Linux下实现秒级定时任务的两种方案(Crontab 每秒运行): 第一种方案,当然是写一个后台运行的脚本一直循环,然后每次循环sleep一段时间. while true ;do command sleep XX //间隔秒数 done 第二种方案,使用crontab. 我们都知道crontab的粒度最小是到分钟,但是我们还是可以通过变通的方法做到隔多少秒运行一次. 以下方法将每20秒执行一次 crontab -e * * * * * /bin/date* * * * * sleep 20;

Linux系统中修改用户名的两种方案整理

在安装系统的时候,经常会无意识的随便起个用户名,后面如果发现该用户名不好或因为环境需要须重起个用户名,经过查找资料和亲自测试发现有两种方案可选:手动修改和使用usermod等命令自动修改. 方案一:手动修改各个关联用户文件 以root身份登录系统文件的修改需要root权限,这里不管是原root用户登录还是普通用户切换到root下都可以,只要有修改权限就行. 修改/etc/passwd这个文件中的用户名部分.用户组部分和主目录部分如我本来的用户名为hadoop,现在想修改为seed,则要修改下面部

apache两种方案三种方式实现反向代理tomcat

目录 1.概述 2.方案一:以proxy_module方式反向代理 3.方案二:以mod_jk方式反向代理 4.总结 1.概述 在前一博客(http://zhaochj.blog.51cto.com/368705/1639740)中实现了tomcat的在standalone模式下的部署,这样tomcat就身兼职两职,一方向要对http的请求作出响应,又要处理JSP程序,而处理http请求不是tomcat的强项,所以这样的请求就交给httpd.nginx这样的的专业处理http请求的套件来处理,而

java调用matlab函数接口的两种方案

Java 调用matlab 函数接口 Java调用matlab函数接口有两种方式: l 一种是通过matlab把函数打成jar包: l 一种是把matlab编译成dll后,用C++再封装成java能支持的数据类型的dll. 注意:不论用这两种方式中的哪一种,最终部署时都需要matlab环境(MCR,在matlab安装路径下有). 1. 方式一:matlab直接打jar包 1.1. 利用matlab自带工具打jar包 1.1.1. 建立jar包 在matlab的Commond Window中输入d

关于跨域请求的两种方案

cors方式 之前在chrome控制台看到金蝉同一个请求有的时候会发送两个(多出一个OPTION的情况)的情况,有点奇怪,经过一顿研究发现原来这个是 CORS 实现跨域 非简单请求 的处理方式.具体内容参见阮大神的文档跨域资源共享 CORS 详解. jsonp方式 原理 利用<script>标签src不受同源策略限制. 缺点 <script>请求的内容会直接执行,那么这就要求接口返回的东西是浏览器可执行的,目前的实现方式都是把结果包装成callback(reslut)这种模式,但是

前端跨域几种方式

跨域问题的直接原因是浏览器存在同源策略,浏览器同源指的是:两个页面的协议.端口和主机相同,则两个页面具有相同的源.IE下满足协议.主机相同,就认为是同源. 想象一下,如果没有同源策略,谁都可以修改你站点上的内容,读取你的cookie,后果难以想象 前端跨域的几种方式 修改document.domain document.domain 用来获取当前网页的域名,document.domain可以被赋值 document.domain只能修改成当前域名的主域名或者基础域名,如当前域名是b.360.cn