《JavaScript设计模式》——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
*/
时间: 2024-10-25 06:38:42

《JavaScript设计模式》——11.5 代理模板的相关文章

常用的Javascript设计模式

<Practical Common Lisp>的作者 Peter Seibel 曾说,如果你需要一种模式,那一定是哪里出了问题.他所说的问题是指因为语言的天生缺陷,不得不去寻求和总结一种通用的解决方案. 不管是弱类型或强类型,静态或动态语言,命令式或说明式语言.每种语言都有天生的优缺点.一个牙买加运动员, 在短跑甚至拳击方面有一些优势,在练瑜伽上就欠缺一些. 术士和暗影牧师很容易成为一个出色的辅助,而一个背着梅肯满地图飞的敌法就会略显尴尬. 换到程序中, 静态语言里可能需要花很多功夫来实现装饰

JavaScript设计模式系列之原型模式

prototype模式通过实例对象指定需要创建的类型,这与factory method模式有本质不同,factory method模式是通过类的继承定义不同子类来达到创建不同类型对象的目的,属于类模式,prototype模式通过调用组合的对象成员生成不同类型的对象实例,属于对象模式. 由于这个特性,prototype具有以下适用场合: · 需要运行时确定实例化的类时,比如动态装载库时 · 避免创建过多子类时.子类太多永远是不受欢迎的,在factory method中我们也提到通过模板或者参数化来

《JavaScript设计模式》——导读

前言 JavaScript设计模式 设计模式是解决软件设计中常见问题的可复用方案.探索任何编程语言时,设计模式都是一个令人兴奋和极具吸引力的话题. 原因之一是:设计模式是许多先前开发人员总结出的经验,我们可以借鉴这些经验进行编程,以确保能够以优化的方式组织代码,为我们解决棘手的问题提供参考. 设计模式还是我们用来描述解决方案的常用词汇.当我们想要向其他人表述一种以代码形式构建解决方案的方式时,描述设计模式比描述语法和语义要简单得多. 在本书中,我们将探讨JavaScript编程语言中经典的与现代

《JavaScript设计模式》——2.3 传宗接代——继承

2.3 传宗接代--继承 "小白,看继承呢?"小铭忙完自己的事情走过来. "是呀,刚才学习类,发现每个类都有3个部分,第一部分是构造函数内的,这是供实例化对象复制用的,第二部分是构造函数外的,直接通过点语法添加的,这是供类使用的,实例化对象是访问不到的,第三部分是类的原型中的,实例化对象可以通过其原型链间接地访问到,也是为供所有实例化对象所共用的.然而在继承中所涉及的不仅仅是一个对象." "对呀,不过继承这种思想却很简单,如千年文明能够流传至今靠的就是传承

《JavaScript设计模式》——2.2 包装明星——封装

2.2 包装明星--封装 2.2.1 创建一个类 "在JavaScript中创建一个类很容易,首先声明一个函数保存在一个变量里.按编程习惯一般将这个代表类的变量名首字母大写.然后在这个函数(类)的内部通过对this(函数内部自带的一个变量,用于指向当前这个对象)变量添加属性或者方法来实现对类添加属性或者方法,例如:" var Book = function(id, bookname, price){ this.id = id; this.bookname= bookname; this

《JavaScript设计模式》——9.5 Observer(观察者)模式

9.5 Observer(观察者)模式 Observer(观察者)是一种设计模式,其中,一个对象(称为subject)维持一系列依赖于它(观察者)的对象,将有关状态的任何变更自动通知给它们(见图9-3). 当一个目标需要告诉观察者发生了什么有趣的事情,它会向观察者广播一个通知(可以包括与通知主题相关的特定数据). 当我们不再希望某个特定的观察者获得其注册目标发出的改变通知时,该目标可以将它从观察者列表中删除. 参考之前发布的设计模式定义通常是很有用的,它与语言无关,以便久而久之使其使用和优势变得

《JavaScript设计模式》——9.12 Decorator(装饰者)模式

9.12 Decorator(装饰者)模式 Decorator是一种结构型设计模式,旨在促进代码复用.与Mixin相类似,它们可以被认为是另一个可行的对象子类化的替代方案. 通常,Decorator提供了将行为动态添加至系统的现有类的能力.其想法是,装饰本身对于类原有的基本功能来说并不是必要的:否则,它就可以被合并到超类本身了. 装饰者可以用于修改现有的系统,希望在系统中为对象添加额外的功能,而不需要大量修改使用它们的底层代码.开发人员使用它们的一个共同原因是,应用程序可能包含需要大量不同类型对

学习JavaScript设计模式之装饰者模式_javascript技巧

有时我们不希望某个类天生就非常庞大,一次性包含许多职责.那么我们就可以使用装饰着模式. 装饰着模式可以动态地给某个对象添加一些额外的职责,从而不影响这个类中派生的其他对象. 装饰着模式将一个对象嵌入另一个对象之中,实际上相当于这个对象被另一个对象包装起来,形成一条包装链. 一.不改动原函数的情况下,给该函数添加些额外的功能 1. 保存原引用 window.onload = function() { console.log(1); }; var _onload = window.onload ||

javascript设计模式--策略模式之输入验证_javascript技巧

策略模式定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算饭的客户. 先定义一个简单的输入表单: <!DOCTYPE html> <html> <head> <meta charset="utf-"> <style> .form{ width: px; height: px; #margin: px auto; } .form-item-label{ width:px; text-align: