《JavaScript设计模式》——11.5 代理模板

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 是的。比如我们将自己的域称为X域,另外的域称为Y域,X域中要有一个被代理页面,即A页面。在A页面中应该具备三个部分,第一个部分是发送请求的模块,如form表单提交,负责向Y域发送请求,并提供额外两组数据,其一是要执行的回调函数名称,其二是X域中代理模板所在的路径,并将target目标指向内嵌框架。

本节书摘来自异步社区《JavaScript设计模式》一书中的第11章,第11.5节,作者:张容铭著,更多章节内容可以访问云栖社区“异步社区”公众号查看

11.5 代理模板

“当然,这种方式还要求其他域要有一定可靠性。否则将会攻击到你的网站。当然这种方式也被人称之为JSONP方案,有时我们还会通过一个方法来动态生成需要的JSONP中的< script >标签”。小铭接着说,“与之类似的还有另外一种方案是被称之为代理模板的方案,他的解决思路是这样的,既然不同域之间相互调用对方的页面是有限制的,那么自己域中的两个页面相互之间的调用是可以的,即代理页面B调用被代理的页面A中对象的方式是可以的。那么要实现这种方式我们只需要在被访问的域中,请求返回的Header重定向到代理页面,并在代理页面中处理被代理的页面A就可以了。”

“既然这样,是不是我们在自己的域中要有这样A、B两个页面了?”小白问。

“是的。比如我们将自己的域称为X域,另外的域称为Y域,X域中要有一个被代理页面,即A页面。在A页面中应该具备三个部分,第一个部分是发送请求的模块,如form表单提交,负责向Y域发送请求,并提供额外两组数据,其一是要执行的回调函数名称,其二是X域中代理模板所在的路径,并将target目标指向内嵌框架。第二个部分是一个内嵌框架,如iframe,负责提供第一个部分中form表单的响应目标target的指向,并将嵌入X域中的代理页面作为子页面,即B页面。第三个部分是一个回调函数,负责处理返回的数据。”

X域中被代理页面A

<script type="text/JavaScript">
function callback(data){
  console.log('成功接收数据', data);
}
</script>
<iframe name="proxyIframe" id="proxyIframe" src="">

</iframe>
<form action="http://localhost/test/proxy.php" method="post" target= "proxyIframe">
  <input type="text" name="callback" value="callback">
  <input type="text" name="proxy" value="http://localhost:8080/proxy.html">
  <input type="submit" value="提交">
</form>

“其次在X域中我们也要有一个代理页面,主要负责将自己页面URL中searcher部分的数据解析出来。将数据重新组装好,调用A页面里的回调函数,将组装好的数据作为参数传入父页面中定义的回调函数中并执行。”

X域中代理页面B

<script type="text/JavaScript">
//页面加载后执行
window.onload = function(){
  //如果不在A页面中返回,不执行
  if(top == self) return;
  //获取并解析searcher中的数据
  var arr = location.search.substr(1).split('&'),
  //预定义函数名称以及参数集
    fn, args;
  for(var i = 0, len = arr.length, item; i < len; i++){
    //解析searcher中的每组数据
    item = arr[i].split('=');
    //判断是否为回调函数
    if(item[0] == 'callback'){
      //设置回调函数
      fn = item[1];
    //判断是否是参数集
    }else if(item[0] == 'arg'){
      //设置参数集
      args = item[1];
    }
  }
  try{
    //执行A页面中预设的回调函数
    eval('top.' + fn + '("' + args + '")');
  }catch(e){}
}
</script>

“最后是Y域中的被请求的接口文件C,它的主要工作是将从X域过来的请求的数据解析并获取回调函数字段与代理模板路径字段数据,并打包返回,并将自己的Header重定向为X域的代理模板B所在路径。”

<?php
  $proxy = $_POST["proxy"];
  $callback = $_POST["callback"];
  header("Location: ".$proxy."?callback=".$callback."&arg=success");
?>
测试结果
/*
  控制台输出依次是
  成功接收数据success
*/
相关文章
|
3月前
|
设计模式 前端开发 搜索推荐
前端必须掌握的设计模式——模板模式
模板模式(Template Pattern)是一种行为型设计模式,父类定义固定流程和步骤顺序,子类通过继承并重写特定方法实现具体步骤。适用于具有固定结构或流程的场景,如组装汽车、包装礼物等。举例来说,公司年会节目征集时,蜘蛛侠定义了歌曲的四个步骤:前奏、主歌、副歌、结尾。金刚狼和绿巨人根据此模板设计各自的表演内容。通过抽象类定义通用逻辑,子类实现个性化行为,从而减少重复代码。模板模式还支持钩子方法,允许跳过某些步骤,增加灵活性。
197 11
|
17天前
|
设计模式
课时90:代理设计模式
课时90介绍了代理设计模式,该模式通过代理对象帮助用户专注于核心业务功能。代理模式中,客户端只关注核心业务(如“吃”),而代理对象负责准备、执行和清理工作。通过接口IEat、真实主题EatReal和服务代理EatProxy的实现,展示了如何在代码中应用代理模式。代理模式的特点是将业务逻辑与辅助操作分离,使代码更清晰且易于维护。
|
1月前
|
设计模式 JavaScript 算法
浅谈几种js设计模式
设计模式是软件开发中的宝贵工具,能够提高代码的可维护性和扩展性。通过单例模式、工厂模式、观察者模式和策略模式,我们可以解决不同场景下的实际问题,编写更加优雅和高效的代码。
33 8
|
1月前
|
设计模式 中间件 Java
设计模式3:代理、适配器、装饰器模式
代理模式是一种结构型设计模式,通过中间件解耦服务提供者和使用者,使使用者间接访问服务提供者,便于封装和控制。
45 2
|
17天前
|
设计模式 机器人
课时83:模板设计模式
课时83介绍了模板设计模式,重点讲解了抽象类的定义、实际应用及代码实现。抽象类作为加强型类,提供了更高层次的设计,用于统一管理子类行为。通过机器人、人类和猪三个实例,展示了如何利用抽象类实现不同对象的共性操作,如吃饭、睡觉和工作。代码范例中定义了抽象类`Action`及其子类`Robot`、`Person`和`Pig`,并通过命令模式实现了对这些行为的调用。抽象类的最大优势在于它能规范子类方法的实现,并提供普通方法调用抽象方法的能力,确保程序逻辑的一致性和灵活性。
|
2月前
|
设计模式 数据安全/隐私保护
Next.js 实战 (七):浅谈 Layout 布局的嵌套设计模式
这篇文章介绍了在Next.js框架下,如何处理中后台管理系统中特殊页面(如登录页)不包裹根布局(RootLayout)的问题。作者指出Next.js的设计理念是通过布局的嵌套来创建复杂的页面结构,这虽然保持了代码的整洁和可维护性,但对于特殊页面来说,却造成了不必要的布局包裹。文章提出了一个解决方案,即通过判断页面的skipGlobalLayout属性来决定是否包含RootLayout,从而实现特殊页面不包裹根布局的目标。
124 33
|
4月前
|
JavaScript 前端开发 数据处理
模板字符串和普通字符串在浏览器和 Node.js 中的性能表现是否一致?
综上所述,模板字符串和普通字符串在浏览器和 Node.js 中的性能表现既有相似之处,也有不同之处。在实际应用中,需要根据具体的场景和性能需求来选择使用哪种字符串处理方式,以达到最佳的性能和开发效率。
132 63
|
4月前
|
设计模式 前端开发 JavaScript
JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式
本文深入探讨了JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式,结合电商网站案例,展示了设计模式如何提升代码的可维护性、扩展性和可读性,强调了其在前端开发中的重要性。
69 2
|
5月前
|
设计模式 网络协议 Java
05.静态代理设计模式
《静态代理设计模式》详细介绍了静态代理的基本概念、原理与实现、应用场景及优缺点。主要内容包括静态代理的由来、定义、使用场景、实现方式、结构图与时序图,以及其在降低耦合、保护对象权限等方面的优势。同时,文章也指出了静态代理的局限性,如缺乏灵活性、难以复用、难以动态添加功能等,并介绍了动态代理如何弥补这些不足。最后,通过多个实际案例和代码示例,帮助读者更好地理解和应用静态代理模式。
65 4
|
6月前
|
设计模式 算法 安全
设计模式——模板模式
模板方法模式、钩子方法、Spring源码AbstractApplicationContext类用到的模板方法
设计模式——模板模式