ActionScriptからCookieを操作
January 28th 2010
タイトルまんま。
FlashでCookieを使うっていうと普通はSharedObjectクラスを使うと思うんだけど、
SharedObjectだとJavaScriptやPHPとかのFlash以外の技術との連携がある場合にイマイチ不便だったりする。
で、作った。
こんな感じで使います。
メソッドは全部静的なメソッドなのでインスタンス化しないで使います。
//Cookieの取得 var value:String = Cookie.get( "key" );
//Cookieに保存
var cookie:Object = { name:"Foo" , pass:"Bar" };
Cookie.set( cookie );
//Cookieを削除 Cookie.clear( "key" );
以下ソースです。
package {
import flash.external.ExternalInterface;
public class Cookie {
/*===========================================================
* Cookie情報の取得
* @param key:String 取得したいCookieのキー
* @return String キーで指定したCookieの値
*/
public static function get( key:String ):String {
var cookieString:String = ExternalInterface.call( "function(){ return document.cookie; }" );
if( cookieString == null || cookieString.indexOf( "=" ) <0 ){ return undefined; }
var pairs:Array = cookieString.split( "; " );
var n:int = pairs.length;
for( var i = 0 ; i <n ; i ++ ){
var pair:Array = pairs[ i ].split( "=" );
if( key == unescape( pair[ 0 ] ) ){
return unescape( pair[ 1 ] );
}
}
return undefined;
}
/*===========================================================
* Cookie情報を連想配列で取得
*/
public static function toObject():Object {
var result:Object = {};
var cookieString:String = ExternalInterface.call( "function(){ return document.cookie; }" );
if( cookieString == null || cookieString.indexOf( "=" ) <0 ){ return result; }
var pairs:Array = cookieString.split( "; " );
var n:int = pairs.length;
for( var i = 0 ; i <n ; i ++ ){
var pair:Array = pairs[ i ].split( "=" );
result[ unescape( pair[ 0 ] ) ] = unescape( pair[ 1 ] );
}
return result;
}
/*===========================================================
* Cookie情報の取得
* @param data:Object Cookieに登録する情報の連想配列
* @param expires:int Cookieの有効期限(※日数で指定、0の場合はセッションが切れるまで有効)
*/
public static function set( data:Object , expires:int = 0 ):void {
var exp:String = "";
if( expires> 0 ){ exp += "expires=" + _expires( expires ) + ";"; }
for( var key:String in data ){
var value:String = data[ key ];
var func:String = "function(){ document.cookie = '" + key + "=' + escape( '" + value + "' ) + ';" + exp + "'; return true; }";
ExternalInterface.call( func );
}
}
/*===========================================================
* Cookieの削除
* @param key:String Cookieから削除したい情報のキー
*/
public static function clear( key:String ):void {
var func:String = "function(){ ";
func += "document.cookie = '" + key + "=;expires=' + new Date().toGMTString();";
func += " return true;}";
ExternalInterface.call( func );
}
/*===========================================================
* Cookieの全削除
*/
public static function clearAll():void {
var cookieString:String = ExternalInterface.call( "function(){ return document.cookie; }" );
if( cookieString == null || cookieString.indexOf( "=" ) <0 ){ return; }
var pairs:Array = cookieString.split( "; " );
var n:int = pairs.length;
for( var i = 0 ; i <n ; i ++ ){
var pair:Array = pairs[ i ].split( "=" );
var func:String = "function(){ ";
func += "document.cookie = '" + unescape( pair[ 0 ] ) + "=;expires=' + new Date().toGMTString();";
func += " return true;}";
}
}
private static function _expires( value:int ):String {
var func:String = "function(){ ";
func += "var today = new Date();";
func += "var expire = new Date( today.getFullYear() , today.getMonth() , today.getDate() + " + String( value ) + " );";
func += "return expire.toGMTString();";
func += "}";
return ExternalInterface.call( func );
}
}
}
一応、Cookieにどんなキーで情報が入っているか判らない時用にtoObjectメソッドも用意してあるけど、
ブラウザのメニューからユーザーが任意でCookieを削除した場合とかに、
実際のCookieデータと取得したObjectの値に食い違いが出る可能性もあるので、
あんまりオススメしません。