当前位置: 首页 > 网络应用技术

如何解决交叉域django?

时间:2023-03-09 02:12:01 网络应用技术

  简介:许多朋友询问Django如何解决交叉域问题。本文的首席CTO注释将为您提供一个详细的答案,以供所有人参考。我希望这对每个人都会有所帮助!让我们一起看看!

  **协议,端口和域名**请求URL。其中,其中之一与当前页面URL不同。

  也就是说:( http/https)协议,(分段福特)主域名,(www)子域名,(8080)端口

  由于浏览器的同源策略的限制,同源策略是一种安全策略。同型物流是指域名,协议和端口,这将防止一个域的JS脚本与另一个域的内容相互作用。浏览器中的两个页面中的不安全和异常行为。

  当然,如果来源不同,将会有某些限制:

  [1]非本体网页的cookie,localstorage和indexedDB

  [2]无法联系非本体网页的DOM

  [3]无法将AJAX请求发送到非类似的源地址

  document.createelement(“脚本”)生成脚本标签,然后插入体内。

  JSONP的实现原则是创建一个脚本标签,然后将SRC需要的API地址放置。该请求只能由无法发布的GET方法使用(将数据传输到服务器)。

  非正式传输协议,该协议允许用户将回调参数传递到服务器,然后在服务器返回数据时将回调参数用作函数名称。功能来处理返回的数据。

  通常,在处理请求数据时,允许允许允许允许请求的标头信息,并且服务器设置了访问控制的信息。

  窗口对象具有名称属性。在窗口下,加载在窗口中的页面是共享一个窗口。名称。

  在a.html中,如何加载b.html页面并在a.html页面上获取b.html的数据,您可以获取b.html数据,然后获取数据以获取a的数据.html页面。

  但是iFrame希望在b.html中获取数据,您只需要设置此iFrame as的SRC即可。如果a.html想要获取iframe获得的数据,也就是说,窗口的值。iframe的名称,您需要THIFRAME的SRC设置为与A.HTML页面相同的域,否则A.HTML将无法访问iframe中的window.name属性。

  //父亲窗打开一个子窗户

  var openwindow = window.open('',','title');

  //将消息发送到子-Window(第一个参数表示已发送的内容,第二个参数表示接收消息窗口的URL)

  OpenWindow.postMessage(“很高兴认识您!','');

  致电消息事件并收听另一方发送的消息

  //监视消息消息

  window.addeventlistener('message',函数(e){

  console.log(E.Source);// E.Source发送消息

  console.log(e.origin);// e.origin消息到网站

  console.log(e.data);// e.data发送消息

  }, 错误的);

  服务器 {

  #9099端口

  听9099;

  #域名是Localhost

  server_name localhost;

  #localhost:9099/API看起来像这样,全部转发到真实的服务侧地址

  位置 ^? /api {

  proxy_pass;

  }

  }

  //当请求不会越过域,然后使用nginx聆听所有localhost时,请使用域名回到前端:9099/api,都转发到真实的服务侧地址

  拿来 ('', {

  方法:“帖子”,

  标题:{

  “接受”:'application/json',

  'content-type':'application/json'

  },,

  身体:json.stringify({{{{

  味精:“ helloiframepost”

  })

  })

  返回 - 末端开发环境:Django 3.2.9

  前端开发环境:VUE3 + TS

  浏览器版本:Chrome(96.0.4664.45)

  问题:

  最近开发了一个新项目。前端使用Axios进行HTTP类包装。前后分离分开以进行API调试。登录后,发现随后的API调用能够识别cookie。

  尝试情况:

  1.用轴承设置的Axios设置,无效

  2.分析API请求和响应信息,并发现响应标题有警告信息

  3.认为,由于警报信息似乎对头部有反应,因此您可以考虑从Django开始。它确实找到了相关说明。设置session_cookie_samesite ='none'和session_cookie_secure = true = true之后,成功解决了问题。

  交叉域问题来自JavaScript的同源策略,也就是说,仅相同的协议+主机名+端口号(如果存在)是相同的,并且允许相互访问。也就是说,JavaScript只能访问和操作在其自身域中的资源,无法在其他域中访问和操作资源。

  注意:localhost和127.0.0.1也是交叉域。

  如果由Origin指定的源不在权限的范围内,则服务器将在没有访问控制的情况下返回响应。当解决浏览器时,发现了字段,并将报告错误。

  修改django中的views.py文件,以修改Views.py中相应API的实现功能,将响应头添加到访问 - 连锁 - 原始蛋白,并允许其他域传递AJAX请求数据:

  满足以下两个条件的要求。

  (1)请求方法是以下三种方法之一:

  (2)HTTP的标题信息不超过以下字段:

  非简单请求是复杂的请求。

  非简单请求CORS请求将在正式通信之前添加HTTP查询请求,称为“ Preflicht”请求。

  前检查请求是从服务器请求授权信息的选项请求。

  在成功响应前检查请求后,将发出真正的请求,并将携带真实的数据。

  JSONP是JSON带有Padding的标题。它是一个非官方协议,允许将脚本标签集成到服务器端的客户端,并通过JavaScript回调的形式实现Cross -domain访问(这只是JSONP的简单实现形式)。

  JSONP的实现步骤大致如下(请参阅来源中的文章)

  在请求期间,接口地址为SRC作为构建脚本标签。这样,当构建脚本标签时,最终SRC是接口返回的内容

  目前,只要浏览器定义了foo函数,该函数将立即调用。JSON数据作为参数被视为JavaScript对象,而不是字符串,因此避免使用JSON.PARSE的步骤。

  JSONP注意

  基于JSONP的实施原则,JSONP只能是“获取”请求,并且不能提出更复杂的帖子和其他请求,因此,当您遇到这种情况时,您必须引用)。

  如前所述,JSONP的实现原则,现在我们可以编写JS来实现JSONP函数。

  在正常情况下,我们希望可以动态地称呼此脚本标签,而不是在HTML中固定,因此它不灵活。

  我们可以通过页面的触发事件操作动态创建脚本标签,以便我们可以灵活地弹性地调用远程服务。例如:下面:以下:

  为了更灵活,将客户端定义的回调函数的上述函数名称传输到服务器,并且服务器将返回您定义的回调函数名称的方法。

  如上所述,jQuery框架还支持JSONP,该框架可以使用$ .getjson(url,[data],[callback])方法。

  与JS实施相比,我们不需要生成脚本标签,并且客户端无需自己定义回调函数。

  上述方法非常方便。我们不需要定义回调函数并指定回调函数名称。

  我们可以使用$ .ajax方法实现。如下所示:

  在最后一节中,JSONP:“回调”是定义存储回调函数的键的键。JSONPCALLBACK是回调函数的后端定义的方法名称。服务器可以填写数据并将数据返回到返回。

  但是,可以松开JSONPCALLBACK参数。jQuery将自动为过去定义一个随机名称,并且前端必须使用回调功能来处理相应的数据。使用jQuery可以轻松实现jsonp以供交叉域访问。

  这样,我们的交叉域处理即可完成所有请求。

  呢[y $ el]} b8ca)ou {)l 6f3wfd.png

  在Axios中的设置

  修改当前配置后,第一步将发生在交叉域中。目前,您需要将其设置在服务器端。

  (顺便说一句,谢谢您的背部伙伴Cheng Shao在这个寂寞的夜晚陪伴我)

  目前的情况是,只有前端与带有cookie的交叉域请求一致,而后端尚未达成协议。因此,将其设置在后台配置中。

  django中的设置配置。

  [图片上传失败...(Image-90D7C0-1556455798141)]]]]]]

  因为我想改变一些以前的需求,所以主管要求我学习Vue。花了很长时间才进入门,我不得不更改成熟的项目。这个困难仍然很困难。

  那些熟悉网站构建的人应该知道Vue是一个出色的前端框架,而Django是Python语言系统下的后端框架。尽管他们俩都可以编写一个完整的网站,但它们具有自己的焦点。速度很快,但是模板引擎附带的速度相对较弱,VUE是由数据驱动和组成的意识形态构建的。它是渲染页面中的第一个类。因此,随着Python的开发,可以开发网站。

  不同的框架如何组合?这导致了前端和后端分离的想法。后端仅提供接口,API和前端来调用这些接口以获取数据,然后将其渲染到HTML模板模板。

  在开发不同的框架时,最大的问题是交叉域。由于不同的框架,它们启用的端口号不同,即不同的数据源。由于安全性,无法直接访问它们。它是Django配置文件中的跨域许可证。使用Django的第三方软件包Django-Cors-neaders解决跨域问题

  在这种情况下,我们可以使通过VUE启动方法进行调试更加方便

  最终如何集成在一起?我们知道Django是通过指定模板和静态文件的路径来渲染的,因此我们需要打包VUE文件以生成index homepage和static文件,以便我们可以在django的默认文件夹中分别分别分开,或指定这两个文件。再次路径。

  结论:以上是首席CTO注释介绍了Django的所有内容,以解决交叉域的全部内容。我希望这对每个人都会有所帮助。如果您想进一步了解这一点,请记住要收集对该网站的关注。