-- 作者:小鞋子
-- 发布时间:3/26/2004 11:38:00 AM
-- 三线程数据移位货舱-xml-高级应用[费尽一早精力才看懂]
基于XML自定义标志语言的三线程数据移动货舱 作者:大鼹鼠(bigmole)—china-luoyunshen 起稿日期---03-10-22/应用开始创作日期---03-9-25 思维来源于:karl von Frisch(弗里希) 关键字:数据岛,记录集,XML,数据存储,动态函数,匿名函数,用户数据 XML(The Extensible Markup Language可扩展标识语言),asp,html。 摘要:主要使用数据岛做为存储XML的容器,使用XML定标语言作为数据之间的交换,我们这里的数据不特指文本数据,包含URL资源数据,函数体数据,字符文本数据。通过定义好一个XML虚拟移动货舱,来装载网络上的任何资源,这一点,本来就是XML设计的初衷—实现数据的存储格式通用化。 目的目标: 我的目的是把三线程数据移动货舱作为一个网络数据资源搭栽平台,只要在程序文件中引用了这个平台的标准协议,就可以自动获取各种资源,包括代码资源,达到代码的重用和减少程序的代码量(比如你做的一个JS效果要200行代码,你还想在同一页面加别的特效,就只要使用三线程数据移动货舱,就把你的所有这些代码变成三线程数据移动货舱代码,只有短短的几行),甚至可以在VB里调用,形成应用程序(这个方法我目前不打算讨论)。 最新动态:我已经做好了一个标准只有10多行的协议文件,只要在页面加上<script src=pro.js id=force />。就可以使用任何你可以取到的资源。而且保证资源是保密的。但是没有做多少应用,看不到什么效果,希望大家用这种方法做出大量应用,那么这个协议就有用了。 一、 XML 简史 ㈠标签语言的起源 在很多人眼中, Web 就是 Internet 。可以毫不夸张地说,没有 Web ,就不可能出现今天这种 Internet 的飞速发展。而构造 Web 的基础技术之一,就是 HTML 。 HTML 最初由欧洲粒子物理实验室( CERN )的科学家 Tim Berners Lee 设计,目的是为了方便科学家们的交流。 1990 年 12 月, HTML 在 CERN 内部发布,它的公开发布是在 1991 年夏天。基于 Internet 共有共享这一美好的传统, CERN 和 Tim Berners Lee 放弃了他们对 HTML 、 HTTP 和 URL 规范所拥有的权利。 ㈡ HTML 的不足 HTML 缺乏可扩展能力 HTML 数据的可重用性差 HTML 缺乏表达数据语义的能力 ㈢ XML 的出现 随着 Web 的普及程度以爆炸性的速度增长,世界各地越来越多的人开始学习 HTML 。他们中的许多人很快认识到 HTML 的上述不足。 SGML 专家们开始考虑在 Web 上直接使用 SGML ,而不是使用 SGML 的一种应用(即 HTML )的可能性。不过,他们发现, SGML 虽然功能强大,对大多数人来说实在是太复杂了,而且要在客户端浏览器中实现 SGML 解析引擎也是不实际的。 1996 年夏天, Jon Bosak ( Sun 公司的在线信息技术设计师)说服 W3C ,由他组织了一个关于在 Web 上使用 SGML 的委员会。在该年的 11 月,他们完成了 SGML 简化版本的初始设计。这个简化版本保留了 SGML 主要的实用功能(特别是与 Web 信息发布有关的功能),同时大大缩减了 SGML 的复杂性,这就是 XML 。 1997 年 3 月, Bosak 发表了具有里程碑意义的 《 XML , Java and the Future of the Web 》 。为何 XML 是未来 Web 的一个重大选择?今天,虽然时间已经过去两年多了(对于 Web 来说这可以算是一段相当漫长的时间), Bosak 的短文仍不失为一个卓越的解释。 ㈣可能的应用场合 几乎所有类型的数据都可以用 XML 来描述,用一种语法(即 DTD )来定义该类数据的结构规则。下面是几个立即可以从 XML 受益的领域: 电子商务 在电子商务领域, XML 或由 XML 定义的标签语言可以用来描述订单、合同、库存和账单等信息,使得制造商、零售商、顾客和银行能够方便地实现数据共享、协同操作。 高精度的 Web 搜索,平台无关性。 二、数据岛(XML Data Islands) 适用于Ie5.0以上版本。 它是一个XMLDocument的载体,而且可以把XML作为一个记录集来操作,更为突出的是,数据岛是不受IE的安全限制的,比如用户把IE的安全设置为最高级别,而数据岛还是可以正常运转的。 三、数据之间的交换 使用每一个数据岛我们先把他叫为XMLDSO,系统每创建一个数据岛,其实都开辟了一个单独的线程给XMLDSO使用,所以我们开辟3个XMLDSO来装载数据,它们是可以同时下载远程的数据的,所以我们把这开辟的3个XMLDSO叫做三线程数据移动货舱,我们把每一个XMLDSO进行功能上的划分。 下面是一个划分协议 <!-- create the island of datas //don't modify below 一定要放在body下,不要修改下面,上面HTML xmlns和style v不能改!--> <xml src="#" id="dataXML" name="dataXML" async="false"></xml> <xml src="#" id="functionXML" name="functionXML" async="false"></xml> <xml src="#" id="clientXML" name="clientXML" async="false"></xml> <SCRIPT language=javascript> <!-- var spfunc1,spfunc2,spfunc3;//定义三个函数岛接收端,分别定义可带1-3个参数 var spDatadso,spFuncdso,spInfodso;//定义数据岛,函数岛,用户信息岛 var funLibs; //定义一个用户函数库,相当一个带动作,属性方法的soap对象 var createfunc;//创建一个用户定义方法,不带参数 var getRemoteFun,getRemoteData,sentRemoteData,OcxHttpsent,runThiscode//定义标准函数取远程数据 //sentRemoteData,OcxHttpsent可创建远程函数,需要在服务器端写接口函数,接口就是任意字符发送到服务器,服务器根据字符处理 //篇幅有限!funLibs之后的一些方法和底层规范我将来再给个详细说明 /* 系统帮你创建了三个隐藏本地系统函数,带参数 函数名:setfunc1(funBody,funParameter1) 使用方法:函数体,比如创建参数是a的fun1函数 function fun1(a) {var b; b="hello "; alert(b+a);} 这是你写的函数,当然可以在页面任何地方调用,如果你在运行页面的某个地方动态生成这个函数,这么写 funbody="var b;b=\"hello \";alert(b+a);" setfun1(funbody,"a") --上面两行代码返回的生成动态函数在spfunc1这个接收岛上,调用spfunc1("you")就等于调用fun1("you") 你还可以使用别名var myfunction=spfunc1; 就可以这样使用myfunction("you"),效果是一样的 在一个按钮里可这么写<input type=button value= createonclick=eval('funbody="var b;b=\"hello \";alert(b+a);"; setfun1(funbody,"a")') > <input type=button value=seeme onclick=spfunc1("World!")> 函数名:setfunc2(funBody,funParameter1,funParameter2)使用方法同上 名数名:setfunc3(funBody,funParameter1,funParameter2,funParameter3)使用方法同上 *数据岛,函数岛,用户信息岛的使用说明 数据岛获取存数据,比如数据库数据,不用刷新,函数岛可以取本地或远程数据,用户信息岛是页面用户交流,比如网络游戏数据图片动作传输 spInfodso.src= remote-url;spDatadso.src=remote-url;spFuncdso.src=remote-url remote-url是远程的文件,必须是定标格式,符合下面标准 文件名.* -表示可为任意文件名-文件体如下 <?xml version="1.0" encoding="gb2312"?> //不能改 <data name="force" tagurn="http://bigmole.5188.org/" value="lifepower"><![CDATA[ //不能改 ........这写你的函数体,可以用数据库存这函数体 ]]></data>//不能改 调用这个远程函数这样用: spFuncdso.src="http://文件名.*"; //不能使用虚拟域名 setfunc1(spFuncdso.text,"parameter"); //这样就把远程一个函数生成到你机器缓存里的spfunc1函数,以后使用就直接在本机上使用了 在使用远程函数必须设置IE安全(其他)为允许通过域访问数据资源,使用同一个域内的就不需要 补充:一些参数,自说明,动画,自己寻找网络资源,全文检索可用网络函数,远程组件成为自己函数,应用程序调用这些需要大家承认和 使用同一个规范,不能你定一套,我定一套,大家有没有这个兴趣啊?有的话把自己的想法规范提出来。 作者:sir. BigMole -2003-9-30 */ // --> </SCRIPT> <script> spDatadso=document.all("dataXML"); spFuncdso=document.all("functionXML"); spInfodso=document.all("clientXML"); function isOvertsfdata(){ if (spFuncdso.readyState!="complete" ){ fTimer=setTimeout("isOvertsfdata()",200)} else {clearTimeout(fTimer);eval(spFuncdso.selectSingleNode("data/appdfuntolib").text)}//添加同时加入函数自说明 } spFuncdso.src="http://www.cranesnet.com/site/funlibs.asp";isOvertsfdata(); </script> <!--end of create the island of datas--> <!--下面是测试内容,大家随便改!你能想到什么样的页面技巧,做什么样的网页,你自己发挥吧 --> <SCRIPT language=javascript> //funLibs属性,一个函数数组,第一个函数,下标1,funLibs[1].name--函数名 /* name-函数名,key--函数关键字,text--函数使用方法,info--参数和其他,ver--版本 fun_node是一个函数节点fun_node(name-函数名,key--函数关键字,text--函数使用方法,info--参数和其他) 四个参数 funLibs[1].ver="write by big mole" //这样改ver属性,不放在节点初始参数里 5个可被用户使用属性。 funLibs.length --本地库有多少函数,你自己可添 funLibs.addFunc(new fun_node(name,key,text,info)) --建新函数 funLibs.itemWithName(name) --返回这个函数本身,可直接调用 funLibs.itemNameExists(name)--判断函数是否存在 funLibs.posOfItem(name)--判断函数在库中顺序 */ function callremote(){ spFuncdso.async = false; spFuncdso.src="http://www.cranesnet.com/site/test.aspx"; setfunc1 (spFuncdso.text,"e"); myname=spfunc1 funLibs=funLibs.addFunc(new fun_node("myname","keyword,弹出对话框","这个程序这么用,myname('aa'),弹出对话框","这是我的程序")); } function callme(){ setfunc1 (spFuncdso.text,"e"); myname1=spfunc1 funLibs=funLibs.addFunc(new fun_node("myname1","keyword,弹出对话框","这个程序这么用,myname1('aa'),弹出对话框","这是我的程序")); } //--> </SCRIPT> <br><br> <INPUT type=button value=远程调用 id=button1 name=button1 onclick=callremote()><br><br> <INPUT type=button value=本地调用 id=button2 name=button2 onclick=callme()><br><br> <INPUT type=button value=运行spfunc1调用 id=button3 name=button3 onclick=spfunc1("Bigmole-spfunc1")> <br><br> 先点远程调用<INPUT type=button value=远程运行myname调用 id=button3 name=button3 onclick=myname("Bigmole-myname")> 先点本地调用<INPUT type=button value=本地运行myname1调用 id=button3 name=button3 onclick=myname1("Bigmole-myname1")> 四、作用: 我们可以把数据和HTML资源放在服务器端,以XML的形式保存,通过三线程数据移动货舱来装载我们需要的数据,通过一个链接文件和各种函数接口我们可以装载任何网络位置的任何资源。我们甚至在VB中调用一组件获取远程的函数,并插入到本地代码形成自己的新函数,在VC中也可以这么做,但具体方法笔者不是很了解。 那么从装载远程资源必然引起了安全问题。那我们的下一篇文章继续介绍 --------三线程数据移动货舱的保护措施。 分为三维保护措施。、 第一维,页面上简单的保护,就是使用者通过在浏览器点右键查看源文件,那他是查看不到从三线程数据移动货舱提取的数据的,而且即使他把HTM页另存为文件,也是看不到任何文件内容的。 第二维,使用view-source:URL这种方法,或者使用直接敲入数据来源的HTM或其他URL链接地址来查看,这样我们只需要在服务器加上 str=Request.ServerVariables("HTTP_REFERER") if trim(str)="" or Request("o")="1" then Response.Write( "数据交换岛无数据!") Response.End() end if 这样的话,使用者也是看不到你的文件的。 第三维,用户查看IE浏览器中的缓存,比如a.aspx文件,那么他就可以看到你的内容了。在这里我们也可以用上面的方法解决。就是在发送数据的同时返回一个清空指令,再把空文件发过去,这样用户就看不到你的XML缓存内容了。但是用户通过一个脚本 <script>spFuncdso.src=”a.aspx”;alert(spFuncdso.xml);</script>那么他就可以看到你的文件的内容了。或者他直接用HTTP侦听,或者使用CatlHttpClientT等任何Http类就可以获取你的URL资源了,如果你在a.aspx后加上?id=@mole等来判断能否发送服务数据,那么用户只要在脚本加上alert(url.location.href),或把你写的ID这个连接同时放在他页面里的<script>spFuncdso.src=”a.aspx?id=@mole”;alert(spFuncdso.xml);</script>,那么他又可以看到你资源文件的内容了。在这里我们使用一个MD5的类似办法来解决这个问题。 (在说明如何XML没有缓存之前),不是很闲得无聊,我想先来点所谓理论观点,就叫灌水三三制,理论上的,工作技术上的,业余的,先说理论上的,业余的就是泼水了 在高数第一课,一个过程中变化的量叫变量,不变的量就叫常量,而两个不同变量之间的隐射关系叫函数。关键是我们如何把生活中遇到的问题变成这种数学抽象逻辑来解决呢。想想看吧,我们这些虽然学到了各种技术的人,所能运用的技术无非也是做些免费软件,做个网站,游戏,动画,或者靠它做些项目来维持自己的生计,我们还能做什么呢,虽然几百年或几亿人里就只出一个孟德斯鸠或苏格拉底那样的人,但是我们其中的一位总能够做出什么来,不是你就是我,或者我们的后代。你明白我说什么了吗,我指的是你能够在计算机技术中有创新的思维,你就能够在宇宙奥秘中发现创新,只要你愿意想,说不定在哪个方面为世人发现什么新的规则。例如,用物体实现人的思维,它并不一定是机器。当然,并不是每个人都愿意这么做,因为现在是经济社会,我只是提出我的想法。下面我想说说一个蜜蜂的故事。 karl von Frisch(弗里希),请记住这个人的名字吧--弗里希!!,中文文章我见识少,没见过这篇报道,用我的语言来翻译一下原文,不对之处专家别见怪。Frisch是一位获得NOBEL奖金的德国生物学家。他致力于研究各种动物,试图找出它们的交流方式是否与人类的语言相近似。下面的研究使他获得了Nobel有一天,他发现蜜蜂在蜂房附近总是有一种奇怪的他说不出名的行为。这引起了他的兴趣,于是他就慢慢观察这些蜜蜂,结果发现,一只蜜蜂在做出某种行为,也许叫做肢体语言吧,之后一群蜜蜂就飞了出去,而后他也跟着蜂群,想看个究竟。结果发现,这群蜜蜂是飞到一个果园采蜜(不要笑)。经过他的研究发现,蜜蜂有两种行为来进行蜂群之间的对话。第一种,当一只蜜蜂发现10米内有食物的时候,他会绕着蜂房飞舞,形成一个规则的圆形舞蹈(round dancer),而且持续几次,或者在蜂房附近区域跳这种规则的圆形舞蹈。当别的蜜蜂发现他做这个行为的时候,就会飞到10米内的范围寻找,而且他们通过闻这只蜜蜂身上的味道来判断是什么花蜜。 第二种,当蜜蜂发现10米外有食物的时候,他会跳第二种舞蹈(tail-wagging),尾部摇摆舞,当他不停的舞动他的尾部,别的蜜蜂注意到了他的行为,他就朝着一个方向边走边舞,这个方向就是食物的方向! 但是,问题接着就来了,他们这些行为是怎么产生的,他们的行为是不是和人类的交流一样会自动思考,接着弗里希做了下面这个实验。弗里希把一个涂满蜂蜜的木块放到了离蜂房很高的地方,再把一只小蜜蜂人为放到了木块上,接下来,这只小蜜蜂来精神了,飞到了蜂房,不断跳着尾部摇摆舞,这下别的蜜蜂注意了他,集体行动开始。可是他们却怎么也找不着蜂蜜在哪?回来把那只小蜜蜂暴扁了一顿!!惨!寒!结论是:蜜蜂们只知道平面的方向,而不会有意识判断3维立体空间,从而他们的行为不具有思考的能力,而是一种先天DNA的遗传诱导。 给我们留下的疑问。为什么会产生这种行为,蜜蜂如何天生识别这种行为?人们所认识的东西是不是也和蜜蜂一样,三维的世界就是真正的物质世界了吗。还有接下来几个研究内容太多,就不是我的讨论范围了。 隐藏服务程序生成的XML数据的方法(继上) 下面我从数学模型上来探讨这个问题。解决它就解决了上面的保密问题。 (1) 普通网页数据模式 b=5 a=b==èa=5 (2) 要隐藏数据网页模式 b=b a=b =èa=0 但a=5 大家一看,(2)的公式用一维变量表示简直不可能。 下面我给出一个三维向量公式 用向量表示A={a} B={A,A,…;} C={B,B…..} 用增广矩阵表示A={a},B={A,{a}},C={B,{A},{{a}}} 变量的实际意义,A是我们的数据,任何XML数据。 B代表用一个页面包含这个数据,也可以说用一个表达来代表A中的数据,并包含对A这个集合的一维数学运算。 C代表用脚本,应用程序,黑客用工具获取数据,获取缓存,获取资源地址,点右键查看,另存等各种能想到的查看XML数据的方法。 现在我们的运算公式为|A B C|=0 为什么,因为这个公式你写出来的和你看到的结果都是一个未知变量,就是说,计算机也不知道它是什么。但是怎么得结果呢。这个结果却是一个唯一的,但它却包含了任何你想要的数据,比如C={B,{A},{{a}},………}从B中获取运算公式,对C中所有数据进行运算,但是你又看不见,因为它是一个变量表达式。但它运算的结果是唯一的,是某一个{A}这样的集合。 好,我们现在就来解这样的三维向量方程|A B C|=0 解出和描述好这个方程,那么页面获取的数据全部就可以保密起来,XML缓存不可见,XML资源的URL用程序获取不到,使用XML对象指向url资源也得不到数据(你认为这是不可能的,你会这么想:因为既然调用特定程序来XML.SRC=”*.XML”,这个特定程序可以取得数据,为什么用别的XML对象xml2.src=”*.XML”却取不出数据,用xml.src=”*.xml”能取出任何数据,这是常识)。我先给出一个一维向量|A|=0的程序算法例子。三维算法我只用抽象语言给大家描述。(因为每个人都把自己的网页隐藏起来,那么网上可用的东西变得..这个算法只适合给那些需要保密数据的人,比如合同,内部新闻,在这里的人都不需要的) 很多帖子和人这么说: 客户端能看到HTML页面,说明页面已经保存到客户端机器,你怎么能禁止别人操作自己机器上的文件呢。 各位不相信你机器上的缓存文件和你眼里看到的内容是不一样的吗?请到这个地址查看(IE5可能要多刷新两次才能打开,有的机器这样)http://bigmole.5188.org/ 然后请你在Internet临时文件—》设置 –》打开文件。查找funlibs.aspx这个文件,你看里面有什么内容。再看一看主页上那运行的庞大程序和各种HTML标志。 你另存只能存一个我发给你的标准页,和你眼里的页是不一样的。拷屏是没有用,也没必须,你能拷我里面隐藏的几十个函数?图片和文字保护没什么必要,我只保护我的思想,那几十甚至上百的函数。那么使用XML保存数据将不担心任何泄露。 你要把你的函数提供给大家使用,一只要使用一个名称就可以形成各种动态页面,日历选择,动态时钟,即时新闻,验证数据的函数,图片资源,动画资源等等。大家都希望只提供使用权,而不是拥有权,只能通过你给的接口获取,而不能把你的资源函数全部下载,从而达到保护版权的作用。这就是三维向量组表面为0的公式。我先给出三维向量逻辑算法: <script id=force1>#micro various var xmldso;*.src=”funlib.aspx/jsp/php/asp/cgi?id=”+dm51(force1); function dm51(){dm52(force1)} <script> <script id=force2>#micro various function dm52(){dm51(force2)} <script> dm51是一种认证算法=math.abs()-dm52(force2) dm52也是一种认证算法=math.abs()-dm51(force1) 算法唯一正确条件传递是是一个不可知变量。并且在接收端不可知变量要再和链接进行一次md算法,输出值到管理员手里。那么我们这个三维向量公式变完成了。 如果再加上SSL加密,那更加没法解开xml的内容了。 证明该算法不可解: 如果force2变化,DM51就发生变化。同时DM52开始发生变化,该时FORCE2产生的变量也发生变化。如果force1发生变化,DM52就发生变化。同时DM51开始发生变化,该时FORCE1发生变化。这样就生产出一个未知的变量。并且在服务端进行链接+变量二次认证,即使该变量被截取,也不容易被破开,如果加SSL,对变量再加密。那几乎获取XML资源的可能性为0。 当然服务端的funlib.aspx还要包含一个自反馈自己执行的函数,把空变量传递给客户请求端。 下面我给出一个现实的JAVASCRIPT脚本演示一维向量 变量内容 A=(α1,α2,α3)=(7,4,9) B=A 变量内容 A=(α1,α2,α4)=(7,4,8) B=Error 这样的验证算法 <SCRIPT LANGUAGE=javascript id=force> <!-- function a(s) {alert()} //--> </SCRIPT> <SCRIPT LANGUAGE=javascript> <!-- function mlMD5(moleString){//仿照md5思想 var lMessageLength=moleString.length; var lByteCount = 0; var b1=0x10101049;var b2="",b=0; while ( lByteCount < lMessageLength ) { b1= Math.abs(moleString.charCodeAt(lByteCount) | b1 )-lMessageLength ; b=b+parseInt(b1.toString().charAt(8)); lByteCount++; } b2=(b1+b).toString()+lMessageLength;//加识别码 return b2; } function b(){ if(mlMD5(document.all("force").innerHTML)=='26948802141') {alert("ok");} else alert("您已经改了程序")} b() //--> </SCRIPT> 呼呼...累累:( 觉得好.就贴过了:)打算用这种方法可以做成更多的东西.如跨站数据其用.域名等. 更可以运用到XML保护性异步共享 希望大家也努力D研究:)
|