2009年8月14日金曜日

ActionScript 3.0でFlash Cookieを利用する

このブログ記事をはてなブックマークに追加

ユーザーが制御できない「秘密cookie」、半数強のサイトが利用というITmediaの記事を読んで、実際どの程度のものかを理解するためにActionScript 3.0でFlash Cookieを利用してみた。因みに、ここで言う秘密CookieやFlash Cookieはローカル共有オブジェクト(Local Shared Object, LSO)と呼ばれるもので、Flash PlayerがユーザーのPCに保存するデータのことだ。

早速、ActionScript 3.0でLSOを利用したFlashコンテンツを作成してみた。作成するに当たって、ActionScript 3.0コンポーネントリファレンスガイドSharedObjectを参考にした。

プログラムはコンテンツを読み込んだ回数をLSOに保存する。初めてコンテンツを読み込んだ場合は、「初めてお会いしますね」と表示され、2回目以降は「お会いするのは2回目ですね」のように表示される。また、LSOの保存領域が保存するデータよりも小さい場合は「ここは狭すぎます…」、保存が禁止されている場合は「私を拒絶するのですか?」と出力される。保存したデータを削除する場合は、エスケープキーを押すことで「さよなら…」と出て削除される。

LSOの制御方法だが、グローバルストレージ設定パネルの「今後表示しない」を選択することでLSOを禁止することができる。また、ディスク容量を0KBにすると、禁止はされないが容量不足により書き込みができなくなる。既に書き込まれているLSOについては、Webサイトの記憶領域設定パネルにより、削除や禁止、ディスク容量の調整などが行える。

Flash Cookie、そこまで騒ぎ立てるほどのものではないと思うが、気になる人は設定で禁止なり削除なりすればよいと思う。コンテンツ制作者側からすれば便利なのは確か。

以下、ソースコード。

SharedObjectTest.as

// SharedObjectTest by nox, 2009.8.14 package { import flash.display.Sprite; import flash.text.* import flash.events.*; import flash.net.SharedObject; import flash.net.SharedObjectFlushStatus; [SWF(backgroundColor="0xffffff", width="300", height="100", framerate="30")] public class SharedObjectTest extends Sprite { [Embed(systemFont='MS P明朝', fontName='myFont', mimeType='application/x-font', unicodeRange='U+0030-U+0039,U+003F,U+2026,U+3044,U+304A-U+304B,\ U+304E,U+3053,U+3055,U+3057,U+3059,U+3066-U+3067,\ U+306A,U+306D-U+306F,U+307E,U+3081,U+3088-U+3089,\ U+308B,U+3092,U+4F1A,U+521D,U+56DE,U+62D2,U+72ED,\ U+76EE,U+79C1,U+7D76' )] private static const myFont:Class; private var textFormat:TextFormat = new TextFormat(); private var textField:TextField = new TextField(); private var mySharedObject:SharedObject; private function InputChar(event:KeyboardEvent):void { if (event.keyCode == 27) mySharedObject.clear(); textField.text = "さよなら…"; } public function SharedObjectTest() { textFormat.color = 0x000000; textFormat.size = 30; textFormat.font = "myFont"; textFormat.align = "center"; textField.defaultTextFormat = textFormat; textField.antiAliasType = flash.text.AntiAliasType.ADVANCED; textField.autoSize = TextFieldAutoSize.CENTER; textField.selectable = true; textField.embedFonts = true; try { mySharedObject = SharedObject.getLocal("SharedObjectTest"); var flushStatus:String = mySharedObject.flush(); if (flushStatus == SharedObjectFlushStatus.FLUSHED) { if (mySharedObject.data.count) { mySharedObject.data.count += 1; var str:String; str = "お会いするのは\n"; str += mySharedObject.data.count.toString(); str += "回目ですね"; textField.text = str; } else { mySharedObject.data.count = 1; textField.text = "初めてお会いしますね"; } } else { textField.text = "ここは狭すぎます…"; } } catch (e:Error) { textField.text = "私を拒絶するのですか?"; } textField.x = stage.stageWidth / 2 - textField.textWidth / 2; textField.y = stage.stageHeight / 2 - textField.textHeight / 2; stage.addEventListener(KeyboardEvent.KEY_DOWN, InputChar); addChild(textField); } } }

0 コメント: