搜尋部落格文章

2012年3月30日 星期五

URL 原則檔範圍

URL 原則檔僅套用於載入的目錄及其子目錄。根目錄中的原則檔會套用至整個伺服器,但從任意子目錄載入的原則檔則僅套用於該目錄及其子目錄。

原則檔只影響它所在的特定伺服器。例如,位於 https://www.adobe.com:8080/crossdomain.xml 的原則檔案,只適用於在連接埠 8080 上透過 HTTPS 對 www.adobe.com 進行的資料載入呼叫。

在 URL 原則檔中指定存取權限

原則檔中包含單獨一個 標籤,其中再包含零個或多個 標籤。每一個 標籤中都包含一個特質,即 domain,它指定了確實的 IP 位址、確實的網域,或者萬用字元網域 ( 任何網域)。萬用字元網域會以下列兩種方式的其中一種指示:
• 使用單一星號 (*),與所有網域和所有 IP 位址相符
• 使用星號之後再加字尾,只比對找出以指定字尾結束的網域
字尾必須用一點為開頭。然而,有字尾的萬用字元網域可比對找出只含有該字尾而沒有最前端一點的網域。例如,xyz.com 被視為屬於 *.xyz.com 的一部分。在 IP 網域規格中不允許萬用字元。


下面是一個 URL 原則檔的範例,允許存取源自 *.example.com、www.friendOfExample.com 和 192.0.34.166 的 SWF
檔:







如果指定了一個 IP 位址,則只允許使用 IP 語法 ( 例如 http://65.57.83.12/flashmovie.swf) 從該 IP 位址載入的 SWF 檔進行存取,使用網域名稱語法載入的 SWF 檔則無法存取。Flash Player 不會執行 DNS 解析。
您可以允許存取源自任何網域的文件,如下列範例所示:






每個 標籤也都有選擇性的 secure 特質,此特質預設為 true。如果原則檔是位於 HTTPS 伺服器上,而您想要讓位於非 HTTP 伺服器上的 SWF 檔可以透過 HTTPS 伺服器載入資料,則您可以將此特質設為 false。
將 secure 特質設為 false 有可能會破壞 HTTPS 所提供的安全性。尤其是此特質設定為 false,將會讓安全性內容門戶洞開而遭受窺探與攻擊。Adobe 強烈建議您不要將 secure 特質設定為 false。
如果要載入的資料位於 HTTPS 伺服器上,但載入端 SWF 檔位於 HTTP 伺服器上,Adobe 建議您將載入端 SWF 檔移到HTTPS 伺服器上。如此一來,就可以讓您所有的安全資料都在 HTTPS 的保護之下。但是,如果您決定必須將載入端 SWF檔放在 HTTP 伺服器中,請將 secure="false" 特質加入至 標籤,如下列程式碼所示:


另一個您可以用來准許存取的元素是 allow-http-request-headers-from 標籤。這個元素會授與用戶端權限,從另一個網域裝載內容,以傳送使用者定義的檔頭到您的網域。 標籤可以授與其他網域權限從您的網域拉出資料,而 allowhttp-request-headers-from 標籤則是授與其他網域權限推入資料到您的網域,以檔頭的形式進行。在下列範例中,任何網域都准許傳送 SOAPAction 檔頭到目前的網域:



如果 allow-http-request-headers-from 陳述式是在主原則檔中,它會套用於主機上的所有目錄。否則,僅套用於包含該陳述式之原則檔的目錄及其子目錄。

Flash安全性 網站控制 ( 原則檔)

若要提供您網站伺服器的資料給另一個網域中的 SWF 檔使用,可以在伺服器中建立原則檔。「原則檔」是放置於您伺服器上特定位置中的 XML 檔。

原則檔會影響一些資源的存取,包括下列項目:
• 點陣圖、聲音和視訊中的資料
• 載入 XML 和文字檔
• 從其它安全網域將 SWF 檔匯入載入端 SWF 檔的安全網域
• 存取通訊端和 XML 通訊端連線

ActionScript 物件會實體化兩種不同的伺服器連線:文件架構伺服器連線和通訊端連線。ActionScript 物件 ( 如 Loader、Sound、URLLoader 和 URLStream) 會實體化文件架構伺服器連線,這些物件都會從 URL 載入檔案;ActionScript Socket和 XMLSocket 物件會建立通訊端連線,這是以串流資料而不是以載入的文件運作。

由於 Flash Player 支援兩種伺服器連線,因此有兩種原則檔:URL 原則檔和通訊端原則檔。
• 文件架構連線需要「URL 原則檔」。這些檔案可以讓伺服器指出其資料和文件可供 SWF 檔使用,從特定網域或所有網域提供服務。
• 通訊端連線需要「通訊端原則檔」,以便使用 Socket 和 XMLSocket 類別,直接在較低的 TCP 通訊端層級啟用網路作業。
Flash Player 需要使用與嘗試連線所要使用的相同通訊協定來傳輸原則檔。例如,將原則檔置於 HTTP 伺服器中時,來自其它網域的 SWF 檔就允許以它為 HTTP 伺服器載入資料,但是,如果不在相同伺服器上提供通訊端原則檔,就必須禁止來自其它網域的 SWF 檔,在通訊端層級連線至伺服器。換句話說,擷取原則檔的工具必須與連線的工具相符。

2012年2月9日 星期四

Function 的 call & apply

Function類的重要方法call()與apply()
我們知道,每個function最終在執行時,都要有一個上下文環境,也就是this指針在函數執行時,到底指向誰的問題?
var  jimmy: Object  = new  Object ();
//定義jimmy對象的一個方法
jimmy.addSalary = function (addSalary: uint ): void {
    trace ( "姓名:" , this .name, ",原工資:" , this .salary, ",新工資:" , this .salary + addSalary);
};
這裡我們動態的給jimmy對象定義了一個addSalary方法,注意addSalary方法體中的this,如果我們用
jimmy.name = "jimmy.yang" ;
jimmy.salary = 3000 ;
jimmy.addSalary( 500 ); //姓名: jimmy.yang ,原工資: 3000 ,新工資: 3500
這樣調用時,this指針默認就是指向jimmy的,所以this.name自然就是jimmy.yang,而this.salary自然也就是3000,這不廢話麼?
但是我們可以藉助Function類的apply以及call方法,顯式改變this指針的指向!注意上面代碼中的這一部分:
var  mike: Object  = new  Object ();
mike.name = "Mike" ;
mike.salary = 5000 ;
jimmy.addSalary.call(jimmy, 1000 ); //姓名: jimmy.yang ,原工資: 3000 ,新工資: 4000
jimmy.addSalary.call(mike, 1000 ); //姓名: Mike ,原工資: 5000 ,新工資: 6000    
這裡我們又搞出了一個mike對象,而且並沒有給他定義addSalary方法,但如果系統也要給mike同志臨時加工資怎麼辦?可以把jimmy對象的addSalary方法應用在mike身上,即jimmy.addSalary. call ( mike ,1000),最終mike得償所願,在原工資5000的基礎上加了1000,就成了工資6000 (如果現實中加工資也這麼容易就好了)
至於apply方法,作用跟call一樣,也可以用來改變函數執行時,this指針的指向,區別在於apply方法要求第二個參數必須是數組形式,即:
jimmy.addSalary.apply(mike, [ 1100 ] );

2012年1月12日 星期四

在Array的方法(filter,every,some,forEach,map)中,使用 thisObject

var testVal:String = "something";
array.filter(someCallbackFunction, testVal);
[...]
public function someCallbackFunction(element:*, index:int, arr:Array):Boolean
{
        element.isActive = this;
}


public function testArray()
{
    var arr:Array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
    var filterValArr:Array = [4, 8];

    var filtARr:Array;
    var val:int = filterValArr.length;
    for (var i:int = 0; i < val; i++)
    {
        filtARr = arr.filter(
            function(item:*, index:int, array:Array):Boolean
            {
                return item > this;
            },
            filterValArr[i]
        );
        trace("filtARr test " + i + " = " + filtARr);
    }
}


2012年1月2日 星期一

RegExp 表示方式

包入as3變數
var reg:RegExp=/^[*]+$/;

var patten:String = "["+變數+"]+$";
var reg:RegExp = new RegExp(patten,"i");

var reg:RegExp = new RegExp("[" + 變數 + "]+$", "i");  

var str:String = 'abc';
var re0:RegExp = /^\d/;
var re1:RegExp = /\d$/;
var re2:RegExp = new RegExp(re0.source+str+re1.source);

2011年12月29日 星期四

TextField 判斷不同字元 套用不一樣的 TextFormat

//正規表達式判斷字串中包含數字
GlobalData.numberRegExp=/\d/g;

override public function set text(value:String):void {
   if (value != null) {
    this.visible = false;
    //super.text = value;
    var numTf:TextFormat;
    var indexArr:Array = [];
    trace("override set text :" + value);
    
    switch (Main.languageType) {
     
     case LanguageType.en_US:
      super.text = value;
      break;
     
     case LanguageType.zh_TW:
      
      if (GlobalData.numberRegExp.test(String(value))&&value.length>0) { //若字串內包含數字(1~more)
       
       numTf = this.getTextFormat(); //copy default format
       numTf.font = GlobalData.font2.fontName;
       indexArr = searchCharCode(value).concat();
       super.text = value;
       for (var j:int = 0; j < indexArr.length; j++) {
        
        this.setTextFormat(numTf, indexArr[j], (indexArr[j] + 1));
       }
       
      }else {
       super.text = value;
      }
      break;
    }
    
   } else {
    trace("value == null");
   }
   this.visible = true;
   return;
  }
  
  //搜尋字元
  private static function searchCharCode(str:String):Array {
   var tempArr = [];
   
   for (var i:int = 0; i < str.length; i++) {
    if (str.charCodeAt(i) >= 46 && str.charCodeAt(i) <= 57) {
     tempArr.push(i);
    }
   }
   return tempArr;
  }