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

如何解决Django Cross -domain请求(Django Cross-访问)

时间:2023-03-08 09:55:13 网络应用技术

  简介:本文的首席执行官注释将介绍有关Django的交叉域请求如何解决的相关内容。我希望这对每个人都会有所帮助。让我们来看看。

  在正面和背面接口请求中,由于浏览器的局限性将发生交叉域条件。常用的跨域解决方案包括:

  1. JSONP十字架 - 域

  2. NGINX反向代理

  3.修改服务器端的标头

  4.文档

  5.窗口。名称

  6.术后

  7.背景配置运行交叉 - 域

  当请求URL协议,域名和端口时,任何一个与当前页面URL不同,即交叉域

  特别注意两点:

  1.如果这是由协议和端口引起的交叉域问题,则“前台”是无能的。

  2.在交叉域问题上,域仅由“ URL的第一部分”确定,而无需确定相同的IP地址是否与两个域或两个域是否在同一IP上相对应。

  背景是NGINX+UWSGI+DJANGO,它配置为公司的内部网络域名,但是一段时间后,将报告一个接口。

  在最初的调查过程中,已经证实,跨域Django已在Django中配置,并且在使用一段时间后发生了交叉域。发现在交叉域错误时清洁cookie会解决问题,然后删除cookie中的测试是否是因为某种方法是因为某种方式,因此cookie引起的交叉域,最终发现这是由用户的关键名称引起的交叉域。发现与用户相对应的cookie的长度为283.,因为cookie太长了,交叉域。

  发现曲奇的原因太长了。其余的是检查造成特定配置的位置。首先,检查服务接口呼叫日志,并在报告浏览器时发现浏览器没有接口调用日志。在NGINX的相关配置中找到问题。起初,我认为这是NGINX缓冲区大小的大小的问题。后来,我发现变更后的问题仍然存在。最后,我想到了UWSGI的配置。最后,发现UWSGI的缓冲尺寸默认为4K,最终调整为32K以求解它以解决它。

  Cross -Domain是指允许将交叉域请求发送到服务器的浏览器,以克服Ajax只能使用同源的限制。

  相同的来源策略是一种协议,在1995年由Netscape介绍了浏览器。它是浏览器的核心和最基本的安全功能。如果缺乏同源策略,则浏览器很容易被XSS和CSFR攻击。SO所谓的同源性是指相同的“协议 +域名 +端口”。即使两个不同的域名指向相同的IP地址,也不是同源的。

  常见的跨域场景:

  对于简单的请求,浏览器将直接发布CORS请求,该请求是特定于在Head信息中添加原点字段的特定要求。

  非简单请求是对服务器具有特殊要求的请求,例如put delete方法或内容类型字段类型为应用程序/json.t是选项方法。

  浏览器首先询问服务器,当前网页的域名是否在服务器的许可证列表中,以及可以使用HTTP动词和标题信息字段。仅通过获得正面答案,浏览器才能发出正式的XMLHTTPRequest请求。,否则将报告错误。

  与简单请求不同,选项请求还有2个字段:

  Access-Control-Request-Method:必须是列出浏览器的CORS请求的字段,将使用HTTP方法。

  Access-Control-Request-Headers:此字段是一个逗号分隔的字符串,指定浏览器CORS请求以发送其他头部信息字段。

  在服务器收到“预注射”请求后,在检查了原点后,访问权限控制方法和访问控制者 - 重点标题字段确认允许允许请求可以做出响应。

  显示服务器支持的所有交叉域请求。

  它表明,服务器支持的所有标题信息字段不限于浏览器在“预测”中要求的字段。

  这意味着是否发送认证信息(cookie)。

  指定此预调查请求的有效性周期,该单元是允许缓存的秒数。在缓存中,无需发出其他前注射请求。

  **协议,端口和域名**请求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”

  })

  })

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

  在Axios中的设置

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

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

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

  django中的设置配置。

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

  返回 - 末端开发环境: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之后,成功解决了问题。

  结论:以上是首席CTO注释为所有人编制的Django Cross索引请求的相关内容的摘要。希望它对您有所帮助!如果您解决了问题,请与更多关心此问题的朋友分享?