세이박스

WARNING: Actions on button or MovieClip instances are not supported in ActionScript 3.0. All scripts on object instances will be ignored.

디자인
플래시 CS5 에서 FLV 동영상 작업을 동작시 이상없이 잘되었으나 버튼 기능을 추가 한 뒤 부터 아래와 같은 오류가 발생하더군요.

WARNING: Actions on button or MovieClip instances are not supported in Actionscript 3.0. All scripts on object instances will be ignored.

원인은 버튼 함수 버전 문제 이더군요.
flv 동영상 플레이어는 Action script 3.0에서만 동작해서 3.0으로 제작했는데 문제는 버튼 action script가 3.0에서는 동작하지 않다는 것입니다.

그래서 버튼 영역을 별도의 플래시로 분리해서 FLV 동영상 플래시는 Actionscript3.0으로 제작하고 버튼 플래시는 Actionscript 2.0으로 제작해서 해결 하였습니다.


 ▶ 최신영화, 최신 미국드라마 무료 다운로드... 

플래시 차트 (그래프)

디자인
 
플래시 차트를 홈페이지에 적용해보고자 찾아서 올립니다.
 
 

.

퓨전챠트에서 제공하는 무료 버전은
차트에 로고가 뜹니다.
참고하시고 이용하시길 ^^
폰트 사이즈 조정 가능 합니다.
사용방법은 xml 생성 또는 직접 플래쉬에 데이터를 전달하여 사용 합니다.
  

----------------------------------------------------------------------
이외에 찾은 차트 제공 사이트

Open Flash Chart
 
XML/SWF Charts
 
amCharts
 
국내사이트 회원가입이 좀 귀찮지만 꽤 이쁜 차트를 만들어주네요 (무료이고 워터마크 있음)
http://www.charteditor.com/

아래 사이트는 워터마크 없는 듯..
http://www.xchart.net/

아래 사이트도 예쁜데.. 무료는 몇가지밖에 안된다.
http://www.fusioncharts.com/free/Default.asp?gMenuItemId=1 

 


 

장면(Scene)이 두개 이상인경우 gotoAndPlay(), gotoAn..

디자인
 
장면(Scene)이 여러 개인 플래시 무비에서 gotoAndPlay(), gotoAndStop()을 사용해서 특정 장면의 프레임으로 이동한 후 재생 또는 정지하게 만들려면 다음과 같은 형식으로 코드를 작성합니다.
 
gotoAndPlay("main","1");  //main 장면 1번 프레임으로 이동한 후 재생
gotoAndStop("main","1");  //main 장면 1번 프레임으로 이동한 후 정지
 
두 개 이상의 장면(Scene)으로 이루어진 플래시 무비에서 gotoAndPlay(), gotoAndStop()을 사용하는 경우 액션 스크립트로 장면(Scene)을 제어할수 없기 때문에, 'A'란 장면에 맞는 'ClipA' 무비클립 안에 버튼을 만들고 버튼 액션을 다음과 같이 작성하면 버튼에 적용된 액션스크립트는 작동하지 않습니다.
 
on(release){
     _root.gotoAndPlay("B", 1);
}
 
이런한 문제를 해결하려면 사용자 정의 함수를 제작해서 gotoAndPlay() 함수를 메인 타임라인에서 호출되게 만들어야 합니다.
장면 'A'의 메인타임라인 1번 프레임에 플레이헤드를 장면 'B'의 1번 프레임으로 이동시키는 함수 changeScene()을 선언합니다.
 
function changeScene(){
     gotoAndPlay("B", 1);
}
 
'ClipA' 무비클립 안에 만든 버튼에 작성한 코드는 다음과 같이 수정합니다. 이렇게 하면 두 개 이상의 장면(Scene)으로 이루어진 플래시 무비에서 무비클립 안에 만든 버트으로 장면 간의 이동이 가능하게 만들 수 있습니다.
 
on(release){
    _root.changeScene();
}
 

플래시 FullScreen(풀스크린) - AS3.0, AS2.0

디자인
 
 
 
본 코드는 Flash Player9 이상에서 작동하며 Html단의 object태그에 다음 붉은 글씨가 추가로 삽입된다.
--------------------------------------------------------------------------------------------
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,18,0"
width="600"  height="400" id="fullscreen" align="middle">
<param name="allowFullScreen" value="true" />
<param name="movie" value="fullscreen.swf" />
<param name="bgcolor" value="#333333" />
<embed src="fullscreen.swf" allowFullScreen="true" bgcolor="#333333" width="600" height="400"
name="fullscreen" align="middle" type="application/x-shockwave-flash"
pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>
-----------------------------------------------------------------------
 
다음의 예제 코드는 플래시영역에서 마우스 오른쪽 버튼을 눌렀을경우 풀스크린 메뉴를 추가. 기능을작동시키는
펑션으로 구성되어 있다.
 
 
AS3.0에서 중요한 문장
------------------------------------------------------------------------
//풀창
stage.displayState = StageDisplayState.FULL_SCREEN;
//노멀창
stage.displayState = StageDisplayState.NORMAL;
----------------------------------------------------------------
 
 
 
AS2.0에서 중요한 문장
------------------------------------------------------------------------
//풀창
Stage["displayState"] = "fullScreen";
//노멀창
Stage["displayState"] = "normal";
----------------------------------------------------------------
 
 
 
AS3.0 형식
/*********************************************************************************/
import flash.display.Stage;
import flash.display.StageDisplayState;
import flash.display.InteractiveObject.*;
import flash.events.*;

// functions to enter and leave full screen mode
function goFullScreen(event:ContextMenuEvent):void
{
   stage.displayState = StageDisplayState.FULL_SCREEN;
}
function exitFullScreen(event:ContextMenuEvent):void
{
   stage.displayState = StageDisplayState.NORMAL;
}

// function to enable and disable the context menu items,
// based on what mode we are in.
function menuHandler(event:ContextMenuEvent):void
{
   if (stage.displayState == StageDisplayState.NORMAL)
   {
      event.target.customItems[0].enabled = true;
      event.target.customItems[1].enabled = false;
   }
   else
   {
      event.target.customItems[0].enabled = false;
      event.target.customItems[1].enabled = true;
   }
}

// create the context menu, remove the built-in items,
// and add our custom items
var fullscreenCM:ContextMenu = new ContextMenu();
fullscreenCM.addEventListener(ContextMenuEvent.MENU_SELECT, menuHandler);
fullscreenCM.hideBuiltInItems();

var fs:ContextMenuItem = new ContextMenuItem("Go Full Screen" );
fs.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, goFullScreen);
fullscreenCM.customItems.push( fs );

var xfs:ContextMenuItem = new ContextMenuItem("Exit Full Screen");
xfs.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, exitFullScreen);
fullscreenCM.customItems.push( xfs );

// finally, attach the context menu to a movieclip
mc.contextMenu = fullscreenCM;
 
------------------------------------------------------------------------------------------------/
 
 
 
AS2.0 형식
/*********************************************************************************/
// functions to enter and leave full screen mode 
function goFullScreen() { 
	Stage["displayState"] = "fullScreen"; 
} 
function exitFullScreen() { 
	Stage["displayState"] = "normal"; 
} 
// function to enable, disable context menu items, based on which mode we are in. 
function menuHandler(obj, menuObj) { 
	if (Stage["displayState"] == "normal") { 
	// if we're in normal mode, enable the 'go full screen' item, 	disable the 'exit' item 
		menuObj.customItems[0].enabled = true; 
		menuObj.customItems[1].enabled = false; 
	} else { 
	// if we're in full screen mode, disable the 'go full screen' item, enable the 'exit' item 
		menuObj.customItems[0].enabled = false; 
		menuObj.customItems[1].enabled = true; 
	} 
} 
// create a new context menu 
var fullscreenCM:ContextMenu = new ContextMenu(menuHandler); 
// hide the regular built-in items 
fullscreenCM.hideBuiltInItems(); 
// now, add the items to enter and leave full screen mode 
var fs:ContextMenuItem = new ContextMenuItem("Go Full Screen", goFullScreen); 
fullscreenCM.customItems.push( fs ); 
var xfs:ContextMenuItem = new ContextMenuItem("Exit Full Screen", exitFullScreen); 
fullscreenCM.customItems.push( xfs ); 
// now, attach the context menu to any movieclip in your movie. 
// here we attach it to _root, (even though using _root is generally a bad idea,) 
// so it will appear if you right click anywhere on the movie. 
_root.menu = fullscreenCM;
----------------------------------------------------------------------------------------- 

플래시 MovieClipLoader

디자인
 
loadMovie 를 하게 되면..단순히 불러오는 정도 밖에 하지 못하지만.
MovieClipLoader 를 이용하게 되면, swf, jpg 등을 불러올 때에
좀더 디테일한 제어가 가능해진다.
 
 
_root.createEmptyMovieClip("mv", 15);

//로드되는 과정을 지켜볼 리스너객체를 생성한다.
var mclListener:Object = new Object();
mclListener.onLoadStart = function(target_mc:MovieClip) {

  //로딩을 시작할 때에 처리할 일을 작성한다.
}
 
mclListener.onLoadProgress = function(target:MovieClip, bytesLoaded:Number, bytesTotal:Number):Void {
    //로딩이 진행되는 과정에서 처리할 일을 작성한다.
    trace(target + ".onLoadProgress with " + bytesLoaded + " bytes of " + bytesTotal);
    var percent:Number = Math.round(( bytesLoaded / bytesTotal  ) * 100);
    trace(percent);
}
 
 
mclListener.onLoadInit = function(target_mc:MovieClip) {
      //로딩이 완료된 직후 처리할 일을 작성한다.
     //이곳에서는 가로,세로 크기를 100 으로 맞춰주었다.
      target_mc._width = 100;
      target_mc._height = 100;

 }

 
mclListener.onLoadError = function(target_mc:MovieClip, errorCode:String, httpStatus:Number) {
  //로딩 중 에러가 발생했을 경우 처리할 일을 작성한다.
  trace(">> loadListener.onLoadError()");
  trace(">> ==========================");
  trace(">> errorCode: " + errorCode);
  trace(">> httpStatus: " + httpStatus);
 }  

 
//MovieClipLoader 객체를 생성하고, 리스너를 등록한다.
 var mcl:MovieClipLoader = new MovieClipLoader();
 mcl.addListener(mclListener);
 
//mv 무비클립에 test.jpg 를 로드한다.
 mcl.loadClip("test.jpg", mv);

플래시 - loadMovie 최적화 - #1

디자인

두가지 방식.. 모두 가능하다..
이를테면..
##경우1##
loadMovie("sub.swf",_root);

##경우2##
_root.loadMovie("sub.swf");
경우1과 경우2 같은 결과가 나온다.

위의 예제는 문제가 있다.
(다 알고 있는 부분이겠지만....)
_root.loadMovie("sub.swf");
이렇게 쓸 경우에.. sub.swf가... _root에 로딩 되는게 아니라
_root가 sub로... 바뀐다..
때문에... _root에 있던.. 기존 오브젝트들은 사라지게 된다.

그래서..
_root.createEmptyMovieClip("mm",1);
mm.loadMovie("sub.swf");
이렇게 써줘야... 기존 _root는 그대로 있고..
sub.swf만..Depth.. 1로 불러 들이게 된다.

자.. 여기까지가 기본이다..

실무로..볼때... 왠지 불안하다.. 왜냐면..loadMovie가.. 제대로 불러들
였는지 불안하고..
그리고..불러들인 녀석에 바로 어떤 액션을...적용할 경우
이 녀석이.. 들어온건지.. 들어오지 않았는지 확인할 길이 없다.
몇가지를... 더 생각해보자!!

##경우1##
_root.createEmptyMovieClip("mm", 1);
mm.loadMovie("sub.swf");
mm.onEnterFrame = function() {
this._x = i++;
};

##경우2##
_root.createEmptyMovieClip("mm", 1);
mm.createEmptyMovieClip("ss", 1);
mm.ss.loadMovie("sub.swf");
mm.onEnterFrame = function() {
this._x = i++;
};

경우1은 mm이라는 빈무비클립을 만들어 mm에 직접 sub.swf를 로딩
했고
경우2는 mm을 만들고 그 속에 ss를 만들어 ss에 sub.swf를 로딩시켰
다..
경우1은 mm의 onEnterFrame이 작동하지 않는다.
경우2는 잘 작동한다.

왜 그럴까??
..
결국.. loadMovie의.. 로딩은 엄밀히 말하면... 대체시켜 버리는 것이
다.
_root.createEmptyMovieClip("mm", 1);
mm.loadMovie("sub.swf");
mm.onEnterFrame = function() {
this._x = i++;
trace(i);
};
순서는 이렇다.
output에 1이 나온다..
예측하건데..
sub.swf가.. 완전히 불러오는 시점에서..mm이 완전... 바뀐다.
때문에.. i값이.. 약간(대부분1만) 보이게 된다.
그리고 그 이후에는 보이지 않는다.
로딩이 아니고... 바뀌어 버리기 때문이다.

자..그렇다면... 어떤... 녀석을 불러들일때.. 그 녀석의.. 용량을 체크
하고 싶다면.. 어떻게 할까??

##경우1##
_root.createEmptyMovieClip("mm", 1);
mm.loadMovie("sub.swf");
mm.onEnterFrame = function() {
a.text = this.getBytesLoaded() +"/"+this.getBytesTotal();
};

##경우2##
_root.createEmptyMovieClip("mm", 1);
mm.createEmptyMovieClip("ss", 1);
mm.ss.loadMovie("sub.swf");
mm.onEnterFrame = function() {
a.text = this.ss.getBytesLoaded()
+"/"+this.ss.getBytesTotal();
};

경우 1은 a에 값이 들어오지 않는다.
경우2는 잘 나타난다.


더 많은 말들을.. 할수 있겠지만..
한 가지만.. 더 해보자!!

예를들어 sub.swf를 불러들여서...
다..로딩된.. 순간에.. 화면의 어색함 없이..
너비 100
높이 100
알파값 50
x위치 50
y위치 50으로 위치 시켜보자!!

_root.createEmptyMovieClip("mm", 1);
mm._visible = false;
mm.createEmptyMovieClip("ss", 1);
mm.ss.loadMovie("sub.swf");
mm.onEnterFrame = function() {
a.text = this.ss.getBytesLoaded()+"/"+this.ss.getBytesTotal();
if (this.ss.getBytesTotal()>10 && this.ss.getBytesLoaded()
== this.ss.getBytesTotal()) {
with (this.ss) {
_width = 100;
_height = 100;
_alpha = 50;
_x = 50;
_y = 50;
}
this._visible =true;
delete this.onEnterFrame;
}
};
위와 같이..하면된다.
_root.createEmptyMovieClip("mm", 1);
mm._visible = false;
이 부분이..팁이다..
빈무비를 만들고...
바로... 감추는 것...
그리고..onEnterFrame으로..체크한다.

조건.. 즉,if (this.ss.getBytesTotal()>10 &&
this.ss.getBytesLoaded() == this.ss.getBytesTotal()) 이것이..성립
되었을때..

비로소..ss를.. 위치 시키고..
this._visible = true;
할거...다하고 나서... 제일 나중에.. 자신의..모습을.. 드러내는 것이
다.


소스다운로드

더 많은 부분이..있다..
사실... 실무적으로는..끝이 없는것 같다..
상황이라는건... 항상.. 바뀌니까..
그런.. 생각이 든다..

플래시로.. 웹상의..ACDsee같은 것을... 만들때나..
loadSound할때... 그리고..
기타.. 여러가지.. 상황들은...
개발기획, 설계 그리고.. 액션 등... 많은 부분 변화 시킨다..

결국... 중요한건.. 메서드를 알고(이해하고) 있는 부분 50%와..
알고 있는 메서드를 창의적으로... 연결하고..설계하는 부분.. 50% 라
는 생각이 든다.


다음번에는....
loadMovie 최적화 -#2
- _root변수 부분의 중복문제
- 네트워크환경이.. 좋지 않은 곳에서의 로딩
- 위의 내용을 prototype으로 만드는 방법.
- 기타..
그리고..
loadMovieNum 최적화에 대해서.. 알아보겠다..



P.S. - 1
loadMovie로.. 불러들인 녀석을.. onPress와.. onRelease로..
startDrag()
stopDrag() 하고 싶은 경우에도.. 마찬가지이다..
결국 계층을 2개로,,가져가야..
체크할수 있고.... 이벤트를 줄수 있고... 그리고 안전하다..
jpg를 불러들일때도.. 마찬가지이다..


P.S. - 2
C++이나..Java 같은 언어의 경우 객체와 메서드의 종류는...
액션스크립트와 비교할 수 없이 많다..
비교하는것이.. 어리석은 것일지 모르겠다..
하지만..
액션스크립트의 메서드와 프로퍼티를 단편적으로 보고..
별거 아니군.. 하고 치부해버리기에는..
너무나.. 많은 부분이.. 숨어있다..
사실...loadMovie(Num)는.. 구조화의 핵심이다..
핵심인 만큼... 안전성이.. 보장되어야 한다...
교육컨텐츠를 만들때나..
온라인 쇼핑을 만들때
혹은.... 아바타시스템을 만들때..
그 때마다... 상황을 고려한.. 코딩과 설계를 해야한다.
단순히...
MovieClip.loadMovie(불러들일swf(jpg)파일);
이라는 것을.. 말하며...
난... loadMovie에 대해서.. 다 알고.. 더 이상... 알아야 할게.. 없다
고.. 생각하는건... 잘못된 부분이다..

깊게 보면 볼수록... 액션스크립트코딩을 깊게 보는게..아니라..
인터넷 환경과... 프로그래밍 기법.... 개발기획... 구조화..XML,..등..
기본지식에 대한... 이해에 접근하게 된다.
결국.. "프로그램이라는 것은.. 한 길로.. 통하게 된다"라는 생각이 들
게 된다.

질문한 분중에
일주일동안.. 이 문제로.. 고생하고 있다고 말하는 분이 있었다..
우습게도.. 난.. 2년넘게... 고민했고...
지금도.. 고민하고 있다..
앞으로도.. 계속.. 고민해야할것 같다..

위의 설명한.. 내용들은.. loadMovie를 다루는 여러가지 방법중... 일
부에.. 속한다..
(심지어 로컬인지 웹환경인지, OS의 종류가 어떤것인지, 인터넷옵션
에 대한 고려, 그리고 파일존재여부... 기타... )

그렇다고... 난해하다고 말하는건.. 아니다..
다만....
더 깊은.. 부분이.. 있다는 것을 말하려는 것이다...




------------------------------------------------------
참고 하세요 - 예전에.. 제가 loadMovie관련 답변한..부분입니다.
----------------------------- ------------------------
loadMovieNum 은 전역함수로만.. 존재합니다.
그리고..loadMovie는 MovieClip 객체의..메서드로.. 존재합니다.
이 부분에.. 대해서.... 아셔야 합니다.
플래시4때까지는.. 거의 모든.. 액션들이..전역함수로.. 되어있었고..
플래시5에서는 상당수... 객체에 대한.. 메서드로.. 존재하고..
플래시MX에 와서는... 거의 대부분을... 객체로... 프로그래밍 가능합
니다
예를들어..
gotoAndStop 이라는 액션도... 두가지가.. 존재합니다.
전역함수와... 객체에 대한 메서드로요..
전역함수가 존재하는것은... 기존 버젼을 수용하기 위해서입니다.
예를들어
gotoAndStop(3);
이렇게 쓰면.. 전역함수이고..
aa.gotoAndStop(3);
여기서는 aa라는 무비클립객체의... 메서드로.. 존재하는겁니다.
즉... 위와.. 아래의 gotoAndStop는 전혀 다른 녀석입니다.
레퍼런스에 봐도... 두개가.. 다 나와 있습니다..
왜?? 그런 걸까요?? 서로.. 다른 녀석이기 때문입니다..
이것 외에도... getURL 이라든가.. 이런.. 부분은 많습니다.


loadMovieNum은 전역함수이고..
때문에...aa.loadMovieNum 이라고 쓸수 없습니다...

PHP 플래시 연동

웹프로그램

PHP 와 플래시가 값을 주고 받기 테그

on (release) {
getURL("javascript-x:void(open('http://sss.co.kr/sss.php?concern="+concern+"','popup','width=280,height=150'))");
}
on (release) {
getURL("javascript-x:void(alert('오른쪽 소스보기를 클릭해주세요'))");
}

<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="<?=$row[width]?>" height="<?=$row[height]?>" id="top_win">
<PARAM NAME=movie VALUE="http://ssss.swf?concern=<?=$concern?>">
<EMBED src="http://sss.swf?concern=<?=$concern?>" quality=high width="<?=$row[width]?>" height="<?=$row[height]?>" TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/go/getflashplayer"></EMBED>
</OBJECT>

크로스 도메인 : SWF 파일 사이에서의 데이터 액세스

웹프로그램

SWF파일이 A라는 도메인에 있고 그 SWF파일이 A라는 도메인의 파일을 이용하여 변수를 호출할 때
도메인이 정확하게 일치해야 두 파일이 데이터를 공유할 수 있다.
하지만 만약 웹사이트가 2개의 도메인을 가지고 있다면 어떡해야 할까??
이 문제로 30분간 검색해서 찾은 결과..
Macromedia.com은 바보가 아니라 이런 경우에 대한 해답으로 crossdomain.xml을 제공한다.
즉, 웹사이트 루트에 crossdomain.xml을 만들어 액세스를 허용해주면 간단히 해결된다는 말씀!!


less..

1. 크로스 도메인 SWF 파일 사이에서의 데이터 액세스 허용
한 SWF는 인터넷 상의 모든 위치에서 다른 SWF를 로드할 수 있습니다. 그러나, 두 SWF가 변수 및 객체와 같은 서로의 데이터에 액세스할 수 있도록 하려면 두 파일은 반드시 동일한 도메인에서 시작해야 합니다. Flash Player 7 이상에서는 두 도메인이 정확하게 일치해야 두 파일이 데이터를 공유할 수 있습니다. 그러나, SWF 파일은 LocalConnection.allowDomain 또는 System.security.allowDomain()을 호출하여 특정 도메인에서 제공된 SWF 파일에 대한 액세스를 허용할 수 있습니다.
예를 들어, main.swf가 www.macromedia.com에서 제공되는 경우, 이 SWF는 data.macromedia.com으로부터 무비 클립 인스턴스(target_mc)로 다른 SWF(data.swf)를 로드합니다.

// In macromedia.swf
target_mc.loadMovie("http://data.macromedia.com/data.swf");

또한, data.swf가 자신의 기본 타임라인에 getData()라는 메서드를 정의한다고 가정해 보십시오. 기본적으로 main.swf는 data.swf가 일단 로드되고 나면 data.swf에 정의된 getData() 메서드를 호출할 수 없습니다. 그 이유는 두 SWF 파일이 동일한 도메인에 존재하고 있지 않기 때문입니다. 예를 들어, 이미 data.swf가 로드되었다면 main.swf의 다음 메서드 호출은 실패합니다.

// In macromedia.swf, after data.swf has loaded:
target_mc.getData(); // This method call will fail

그러나, data.swf는 요청된 액세스 유형에 따라 LocalConnection.allowDomain 핸들러 또는 System.security.allowDomain() 메서드를 사용하여 www.macromedia.com에서 제공된 SWF 파일에 대한 액세스를 허용할 수도 있습니다. 다음 코드를 data.swf에 추가하면 www.macromedia.com에서 제공된 SWF 파일은 자신의 변수와 메서드에 대한 액세스를 허용합니다.

// Within data.swf
System.security.allowDomain("www.macromedia.com");
my_lc.allowDomain = function(sendingDomain) {
return(sendingDomain=="www.macromedia.com");
}

액세스되는 SWF 파일이 보안 프로토콜(HTTPS)을 사용하는 사이트에서 호스트되지만 않으면, allowDomain은 허용된 도메인의 SWF 파일이 액세스를 허용하는 도메인에 있는 다른 SWF 파일의 스크립트를 작성하는 것을 허용합니다. 이 경우, allowDomain 대신 allowInsecureDomain을 사용해야 합니다. 자세한 내용은 SWF 파일 사이의 HTTP에서 HTTPS 프로토콜 액세스 허용을 참조하십시오.

도메인 이름 일치에 대한 자세한 내용은 Flash Player 보안 기능을 참조하십시오.



2. 도메인간 데이터 액세스 허용

Flash 문서는 다음 데이터 로드 호출 중 하나를 사용해 외부 소스에서 데이터를 로드할 수 있습니다. XML.load(), XML.sendAndLoad(), LoadVars.load(), LoadVars.sendAndLoad(), loadVariables(), loadVariablesNum(). 또한, SWF 파일은 런타임 공유 라이브러리나 다른 SWF 파일에 정의된 자원을 런타임에 가져올 수 있습니다. 기본적으로, 런타임 공유 라이브러리의 경우 데이터나 SWF 미디어는 해당 외부 데이터나 미디어를 로드할 SWF와 같은 도메인에 존재해야 합니다.

런타임 공유 라이브러리의 데이터와 자원을 서로 다른 도메인의 SWF가 사용할 수 있도록 하려면 크로스 도메인 정책 파일을 사용합니다. 크로스 도메인 정책 파일은 서버가 자신의 데이터와 문서를 특정 도메인 또는 모든 도메인에서 제공되는 SWF에 사용할 수 있다는 것을 나타내는 방법을 제공하는 XML 파일입니다. 서버의 정책 파일에 의해 지정된 도메인에서 제공되는 모든 SWF 파일은 그 서버의 데이터나 자원에 액세스하도록 허용됩니다.

Flash 문서가 다른 도메인의 데이터에 액세스하려고 시도하면 Flash Player는 자동적으로 그 도메인에서 정책 파일을 로드합니다. 액세스하려는 Flash 문서의 도메인이 정책 파일에 포함되어 있으면 자동적으로 데이터에 액세스할 수 있게됩니다.

정책 파일의 이름은 반드시 crossdomain.xml이어야 하며 데이터를 제공할 서버의 루트 디렉토리에 존재해야 합니다. 정책 파일은 HTTP, HTTPS 또는 FTP 상에서 통신하는 서버에서만 동작합니다. 정책 파일은 파일이 저장된 서버의 포트와 프로토콜에만 해당됩니다.

예를 들어, https://www.macromedia.com:8080/crossdomain.xml에 있는 정책 파일은 HTTPS를 통하여 www.macromedia.com의 8080 포트에 대한 데이터 로드 호출에만 적용됩니다.

XMLSocket 객체를 사용하여 다른 도메인의 소켓 서버에 연결하는 경우에는 이 규칙이 적용되지 않습니다. 이 경우, 소켓 서버와 같은 도메인의 80번 포트에서 실행 중인 HTTP 서버는 메서드 호출을 위한 정책 파일을 제공해야 합니다.

XML 정책 파일은 하나의 <cross-domain-policy> 태그를 가집니다. 그리고, 이 태그에는 0개 이상의 <allow-access-from> 태그가 포함됩니다. 각 <allow-access-from> 태그는 한 개의 속성 domain을 가집니다. 이 속성에 정확한 IP 주소, 정확한 도메인 또는 와일드카드 도메인(모든 도메인)을 지정합니다. 와일드카드 도메인은 모든 도메인과 IP를 대표하는 단일 별표 문자(*) 또는 접미어로 끝나는 도메인을 대표하는 접미어를 가진 별표 문자로 표현됩니다. 접미어는 점으로 시작해야 합니다. 그러나, 접미어를 가진 별표 문자는 앞의 점을 제외한 접미어 만으로 구성되는 도메인과 일치할 수 있습니다. 예를 들어, foo.com은 *.foo.com에 속한 것으로 생각할 수 있습니다. 와일드카드는 IP 도메인 형식에 사용할 수 없습니다.

IP 주소를 지정하면 IP 구문(예: http://65.57.83.12/flashmovie.swf)을 사용하여 해당 IP 주소에서 로드된 SWF에만 액세스 권한이 부여됩니다. 이 경우, 도메인 이름 구문을 사용하여 로드된 SWF에는 액세스 권한이 부여되지 않습니다. Flash Player는 DSN 이름 해결을 수행하지 않습니다.

다음은 foo.com의 Flash 문서에 대해 foo.com, friendOfFoo.com, *.foo.com 및 105.216.0.40에서 온 Flash 문서에 액세스를 허용하는 정책 파일의 예입니다.

<?xml version="1.0"?>
<!-- http://www.foo.com/crossdomain.xml -->
<cross-domain-policy>
<allow-access-from domain="www.friendOfFoo.com" />
<allow-access-from domain="*.foo.com" />
<allow-access-from domain="105.216.0.40" />
</cross-domain-policy>

정책 파일에 <allow-access-from> 태그가 없으면 서버에 정책이 없는 것과 동일합니다.

플래시 투명하게

웹프로그램
<script type="text/javascript"><!--
google_ad_client = "pub-1170861960426601";
/* 468x60, 작성됨 08. 10. 18 */
google_ad_slot = "0098953580";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>

<PARAM NAME="wmode" VALUE="transparent">