Delade objekt

Flash Player 9 och senare, Adobe AIR 1.0 och senare

Ett delat objekt, som ibland kallas Flash-cookie, är en datafil som kan skapas på din dator av de webbplatser som du besöker. Delade objekt används ofta för att tillföra mervärde vid webbsurfning, så att du till exempel kan anpassa utseendet och funktionen hos en webbplats som du ofta besöker.

Om delade objekt

Delade objekt fungerar som cookies i en webbläsare. Använd klassen SharedObject för att lagra data på användarens lokala hårddisk och anropa dessa data under samma session eller i en senare session. Program har bara åtkomst till sina egna SharedObject-data och bara om de körs inom samma domän. Data skickas inte till servern och kan inte nås av andra program som körs på andra domäner, men de kan vara åtkomliga för program inom samma domän.

Delade objekt jämfört med cookies

Cookies och delade objekt är mycket lika. Eftersom de flesta webbprogrammerare känner till hur cookies fungerar kan det vara praktiskt att jämföra cookies med lokala SharedObjects.

Cookies som uppfyller RFC 2109-standarden har i allmänhet följande egenskaper:

  • De kan förfalla och gör det ofta som standard i slutet av en session.

  • De kan inaktiveras av klienten på en platsspecifik grund.

  • Det finns en gräns på totalt 300 cookies och maximalt 20 cookies per webbplats.

  • De begränsas ofta till en storlek på 4 KB.

  • De uppfattas ofta som ett säkerhetshot och inaktiveras därför ibland på klienten.

  • De lagras på en plats som anges av klientens webbläsare.

  • De överförs från klienten till servern med HTTP.

    Delade objekt har å andra sidan följande egenskaper:

  • De går inte ut.

  • De begränsas som standard till en storlek på 100 KB.

  • De kan lagra enkla datatyper (t.ex. sträng, matris och datum).

  • De lagras på en plats som anges av programmet (i användarens hemkatalog).

  • De överförs aldrig mellan klienten och servern.

Om klassen SharedObject

Använd klassen SharedObject för att skapa eller ta bort delade objekt samt för att ta reda på den aktuella storleken på ett SharedObject-objekt som du använder. Klassen SharedObject består av följande metoder.

Metod

Beskrivning

clear()

Raderar alla data från ett SharedObject-objekt och tar bort SharedObject-filen från disken.

flush()

Skriver SharedObject-filen omgående till en fil på klienten.

getLocal()

Returnerar en referens till klientens domänspecifika lokala SharedObject-objekt. Ett nytt delat objekt skapas på klienten om ett sådant objekt inte finns.

getSize()

Hämtar storleken på SharedObject-filen i byte. Storleksgränsen är som standard 100 KB men filen kan vara större om klienten tillåter det.

SharedObject-objekt har även följande egenskaper:

Egenskap

Beskrivning

data

Skrivskyddad egenskap som representerar samlingen av attribut som det delade objektet lagrar.

onStatus

Det delade objektets händelsehanterare som anropas för varje varning, fel och informationsmeddelande.

Skapa ett delat objekt

Om du vill skapa ett SharedObject-objekt ska du använda metoden SharedObject.getLocal() som har följande syntax:

SharedObject.getLocal("objectName" [, pathname]): SharedObject

Exemplet nedan skapar ett delat objekt som kallas mySO:

public var mySO:SharedObject; 
mySO = SharedObject.getLocal("preferences");

En fil skapas på klientdatorn som kallas preferences.sol.

Termen local avser det delade objektets plats. I det här fallet lagrar Adobe® Flash® Player SharedObject-filen lokalt i klientens hemkatalog.

En ny katalog skapas för programmet och domänen i Flash Players sandlåda när du skapar ett delat objekt. En *.sol-fil skapas även som lagrar SharedObject-data. Filens standardplats är en underkatalog i användarens hemkatalog. Tabellen nedan visar standardplatserna för katalogen:

Operativsystem

Plats

Windows 95/98/ME/2000/XP

c:/Documents and Settings/username/Application Data/Macromedia/Flash Player/#SharedObjects

Windows Vista

c:/Users/username/AppData/Roaming/Macromedia/Flash Player/#SharedObjects

Macintosh OS X

/Users/username/Library/Preferences/Macromedia/Flash Player/#SharedObjects/web_domain/path_to_application/application_name/object_name.sol

Linux/Unix

/home/username/.macromedia/Flash_Player/#SharedObjects/web_domain/path_to_application/application_name/object_name.sol

#SharedObjects-katalogen nedan är en slumpmässigt namngiven katalog. Under den finns en katalog som motsvarar värdnamnet, programmets sökväg och slutligen *.sol-filen.

Om du t.ex. begär ett program kallat MyApp.swf på den lokala värddatorn i en underkatalog som kallas /sos, kommer *.sol-filen att lagras på följande plats i Windows XP:

c:/Documents and Settings/fred/Application Data/Macromedia/Flash Player/#SharedObjects/KROKWXRK/#localhost/sos/MyApp.swf/data.sol
Obs! Om du inte anger ett namn i SharedObject.getLocal(), kallas filen för undefined.sol.

Som standard kan Flash spara lokalt upprepade SharedObject-objekt på upp till 100 KB per domän. Värdet kan konfigureras av användaren. När programmet försöker spara data till ett delat objekt som gör objektet större än 100 KB, visar Flash Player dialogrutan Lokal lagring där användaren kan tillåta eller neka mer lokal lagring för domänen som begär åtkomst.

Ange en sökväg

Du kan använda parametern pathname för att ange en plats för filen SharedObject. Filen måste vara i en underkatalog i domänens SharedObject-katalog. Om du t.ex. begär ett program på den lokala värden och anger följande:

mySO = SharedObject.getLocal("myObjectFile","/");

Skriver Flash Player SharedObject-filen i katalogen /#localhost (eller /localhost om programmet är offline). Det är praktiskt om du vill att mer än ett program på klienten ska ha åtkomst till det delade objektet. I detta fall kör klienten två Flex-program som båda anger en sökväg till det delade objektet i domänens rot och klienten har sedan tillgång till det delade objektet i båda programmen. Om du vill dela data mellan flera program utan upprepningar, kan du använda objektet LocalConnection.

Flash Player skapar inte en SharedObject-fil om du anger en katalog som inte finns.

Lägga till data i ett delat objekt

Du kan lägga till en *.sol-fil för SharedObject med hjälp av egenskapen data för SharedObject-objektet. Använd följande syntax när du lägger till nya data i det delade objektet:

sharedObject_name.data.variable = value;

Exemplet nedan lägger till egenskaperna userName, itemNumbers och adminPrivileges samt deras värden i ett SharedObject:

public var currentUserName:String = "Reiner"; 
public var itemsArray:Array = new Array(101,346,483); 
public var currentUserIsAdmin:Boolean = true; 
mySO.data.userName = currentUserName; 
mySO.data.itemNumbers = itemsArray; 
mySO.data.adminPrivileges = currentUserIsAdmin;

När du har tilldelat värden till egenskapen data, måste du instruera Flash Player att skriva värdena till SharedObject-filen. Om du vill tvinga Flash Player att skriva värdena till SharedObject-filen kan du använda metoden SharedObject.flush(), på följande sätt:

mySO.flush();

Om du inte anropar SharedObject.flush() skriver Flash Player värdena till filen när programmet stängs. Det ger dock inte användaren möjlighet att öka utrymmet som Flash Player har tillgängligt för datalagring om datastorleken överstiger standardinställningarna. Därför är det bra rutin att anropa SharedObject.flush().

När du använder metoden flush() för att skriva delade objekt till en användares hårddisk bör du vara noga med att kontrollera om användaren uttryckligen har inaktiverat lokal lagring med hjälp av inställningshanteraren i Flash Player (www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager07.html), som framgår i följande exempel:

var so:SharedObject = SharedObject.getLocal("test"); 
trace("Current SharedObject size is " + so.size + " bytes."); 
so.flush();

Lagra objekt i delade objekt

Du kan lagra enkla objekt som arrayer eller strängar i egenskapen data för ett SharedObject.

Exemplet nedan är en ActionScript-klass som definierar metoder som styr interaktionen med det delade objektet. Med dessa metoder kan användare lägga till och ta bort objekt från det delade objektet. Klassen lagrar en ArrayCollection som innehåller enkla objekt.

package { 
    import mx.collections.ArrayCollection; 
    import flash.net.SharedObject; 
 
    public class LSOHandler { 
 
        private var mySO:SharedObject; 
        private var ac:ArrayCollection; 
        private var lsoType:String; 
 
        // The parameter is "feeds" or "sites". 
        public function LSOHandler(s:String) { 
            init(s); 
        } 
 
        private function init(s:String):void { 
            ac = new ArrayCollection(); 
            lsoType = s; 
            mySO = SharedObject.getLocal(lsoType); 
            if (getObjects()) { 
                ac = getObjects(); 
            } 
        } 
 
        public function getObjects():ArrayCollection { 
            return mySO.data[lsoType]; 
        } 
 
        public function addObject(o:Object):void { 
            ac.addItem(o); 
            updateSharedObjects(); 
        } 
 
        private function updateSharedObjects():void { 
            mySO.data[lsoType] = ac; 
            mySO.flush(); 
        } 
    } 
 
}

Följande Flex-program skapar en instans av ActionScript-klassen för alla typer av delade objekt som det behöver. Det anropar sedan metoder för den klassen när användaren lägger till eller tar bort URL för bloggar eller webbplatser.

<?xml version="1.0"?> 
<!-- lsos/BlogAggregator.mxml --> 
<mx:Application 
    xmlns:local="*" 
    xmlns:mx="http://www.adobe.com/2006/mxml" 
    creationComplete="initApp()" 
    backgroundColor="#ffffff" 
> 
    <mx:Script> 
        <![CDATA[ 
        import mx.collections.ArrayCollection; 
        import mx.utils.ObjectUtil; 
        import flash.net.SharedObject; 
 
        [Bindable] 
        public var welcomeMessage:String; 
        
        [Bindable] 
        public var localFeeds:ArrayCollection = new ArrayCollection(); 
 
        [Bindable] 
        public var localSites:ArrayCollection = new ArrayCollection(); 
 
        public var lsofeeds:LSOHandler; 
        public var lsosites:LSOHandler; 
 
        private function initApp():void { 
            lsofeeds = new LSOHandler("feeds"); 
            lsosites = new LSOHandler("sites"); 
            
            if (lsofeeds.getObjects()) { 
                localFeeds = lsofeeds.getObjects(); 
            } 
            if (lsosites.getObjects()) { 
                localSites = lsosites.getObjects(); 
            } 
        } 
        
        // Adds a new feed to the feeds DataGrid. 
        private function addFeed():void { 
            // Construct an object you want to store in the 
            // LSO. This object can contain any number of fields. 
            var o:Object = {name:ti1.text, url:ti2.text, date:new Date()}; 
            lsofeeds.addObject(o); 
    
            // Because the DataGrid's dataProvider property is 
            // bound to the ArrayCollection, Flex updates the 
            // DataGrid when you call this method. 
            localFeeds = lsofeeds.getObjects(); 
            
            // Clear the text fields. 
            ti1.text = '';        
            ti2.text = ''; 
        } 
        
        // Removes feeds from the feeds DataGrid. 
        private function removeFeed():void { 
            // Use a method of ArrayCollection to remove a feed. 
            // Because the DataGrid's dataProvider property is 
            // bound to the ArrayCollection, Flex updates the 
            // DataGrid when you call this method. You do not need 
            // to update it manually. 
            if (myFeedsGrid.selectedIndex > -1) { 
            
localFeeds.removeItemAt(myFeedsGrid.selectedIndex); 
             } 
        } 
        
        private function addSite():void { 
            var o:Object = {name:ti3.text, date:new Date()}; 
            lsosites.addObject(o); 
            localSites = lsosites.getObjects(); 
            ti3.text = '';                
        } 
        
        private function removeSite():void { 
            if (mySitesGrid.selectedIndex > -1) { 
            
localSites.removeItemAt(mySitesGrid.selectedIndex); 
            }       
        } 
 
        ]]> 
    </mx:Script> 
        
    <mx:Label text="Blog aggregator" fontSize="28"/> 
    
    <mx:Panel title="Blogs"> 
        <mx:Form id="blogForm"> 
            <mx:HBox> 
                <mx:FormItem label="Name:"> 
                    <mx:TextInput id="ti1" width="100"/> 
                </mx:FormItem> 
                <mx:FormItem label="Location:"> 
                    <mx:TextInput id="ti2" width="300"/> 
                </mx:FormItem> 
                <mx:Button id="b1" label="Add Feed" click="addFeed()"/> 
            </mx:HBox> 
 
            <mx:FormItem label="Existing Feeds:"> 
                <mx:DataGrid 
                    id="myFeedsGrid" 
                    dataProvider="{localFeeds}" 
                    width="400" 
                /> 
            </mx:FormItem> 
            <mx:Button id="b2" label="Remove Feed" click="removeFeed()"/> 
        </mx:Form> 
    </mx:Panel> 
    
    <mx:Panel title="Sites"> 
        <mx:Form id="siteForm"> 
            <mx:HBox> 
                <mx:FormItem label="Site:"> 
                    <mx:TextInput id="ti3" width="400"/> 
                </mx:FormItem> 
                <mx:Button id="b3" label="Add Site" click="addSite()"/> 
            </mx:HBox> 
 
            <mx:FormItem label="Existing Sites:"> 
                <mx:DataGrid 
                    id="mySitesGrid" 
                    dataProvider="{localSites}" 
                    width="400" 
                /> 
            </mx:FormItem> 
            <mx:Button id="b4" label="Remove Site" click="removeSite()"/> 
        </mx:Form> 
    </mx:Panel> 
    
</mx:Application>

Lagra skrivna objekt i delade objekt

Du kan lagra skrivna ActionScript-instanser i delade objekt. Du kan göra det genom att anropa metoden flash.net.registerClassAlias() för att registrera klassen. Om du skapar en instans av klassen och lagrar den i datamedlemmen för det delade objektet och sedan läser ut objektet, får du en skriven instans. Som standard har SharedObject-egenskapen objectEncoding stöd för AMF3-kodning och packar upp den lagrade instansen från SharedObject-objektet. Den lagrade instansen behåller den typ som du specificerade när du anropade metoden registerClassAlias().

Skapa flera delade objekt

Du kan skapa flera delade objekt för samma Flex-program. Om du vill göra det måste du tilldela olika instansnamn till dem, så som exemplet nedan visar:

public var mySO:SharedObject = SharedObject.getLocal("preferences"); 
public var mySO2:SharedObject = SharedObject.getLocal("history");

Det skapar en preferences.sol-fil och en history.sol-fil i Flex-programmets lokala katalog.

Skapa ett säkert SharedObject

När du skapar ett lokalt eller fjärranslutet SharedObject med hjälp av getLocal() eller getRemote(), finns det en valfri parameter med namnet secure som avgör om åtkomsten till det här delade objektet är begränsat till SWF-filer som levereras via en HTTPS-anslutning. Om den här parametern är inställd på true och SWF-filen levereras via HTTPS, skapar Flash Player ett nytt säkert delat objekt eller hämtar en referens till ett befintligt säkert delat objekt. Det här säkra delade objektet kan bara läsas från eller skrivas till av SWF-filer som levereras över HTTPS och som anropar SharedObject.getLocal() med parametern secure inställd på true . Om den här parametern är inställd på false och SWF-filen levereras via HTTPS, skapar Flash Player ett nytt delat objekt eller hämtar en referens till ett befintligt delat objekt.

Det delade objektet kan läsas från eller skrivas till av SWF-filer som levereras via anslutningar utan HTTPS. Om SWF-filen levereras via en anslutning utan HTTPS och du försöker att ställa in parametern på true, går det inte att skapa ett nytt delat objekt (eller också misslyckas åtkomsten till ett befintligt säkert delat objekt), ett fel returneras och det delade objektet ställs in på null. Om du försöker att köra följande utdrag från en anslutning utan HTTPS, kommer metoden SharedObject.getLocal() att returnera ett fel:

try 
{ 
    var so:SharedObject = SharedObject.getLocal("contactManager", null, true); 
} 
catch (error:Error) 
{ 
    trace("Unable to create SharedObject."); 
}

Oavsett parameterns värde räknas det delade objektet som skapats mot det totala diskutrymmet som tillåts för domänen.

Visa innehållet i ett delat objekt

Värden lagras i delade objekt i egenskapen data. Du kan göra en slinga över varje värde inom en delad objektinstans genom att använda en for..in-slinga, vilket visas i följande exempel:

var so:SharedObject = SharedObject.getLocal("test"); 
so.data.hello = "world"; 
so.data.foo = "bar"; 
so.data.timezone = new Date().timezoneOffset; 
for (var i:String in so.data) 
{ 
    trace(i + ":\t" + so.data[i]); 
}

Förstöra delade objekt

När du vill förstöra ett SharedObject på klienten ska du använda metoden SharedObject.clear(). Det förstör inte kataloger i standardsökvägen för programmets delade objekt.

SharedObject-filen raderas från klienten i exemplet nedan:

public function destroySharedObject():void { 
    mySO.clear(); 
}

SharedObject-exempel

I följande exempel visas hur du kan spara enkla objekt, som exempelvis ett Date-objekt, i ett SharedObject-objekt utan att manuellt behöva serialisera och deserialisera dessa objekt.

Exemplet nedan börjar med att välkomna dig som en besökare för första gången. Programmet lagrar det aktuella datumet i ett delat objekt när du klickar på Log Out. Nästa gång du startar programmet eller uppdaterar sidan välkomnar programmet dig med en påminnelse om tidpunkten när du loggade ut.

Om du vill se hur programmet fungerar ska du starta programmet, klicka på Log Out och sedan uppdatera sidan. Programmet visar det datum och klockslag då du klickade på Log Out vid ditt föregående besök. Du kan när som helst ta bort den lagrade informationen genom att klicka på knappen Delete LSO.

<?xml version="1.0"?> 
<!-- lsos/WelcomeMessage.mxml --> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" initialize="initApp()"> 
  <mx:Script><![CDATA[ 
  public var mySO:SharedObject; 
  [Bindable] 
  public var welcomeMessage:String; 
 
  public function initApp():void { 
     mySO = SharedObject.getLocal("mydata"); 
     if (mySO.data.visitDate==null) { 
        welcomeMessage = "Hello first-timer!" 
     } else { 
        welcomeMessage = "Welcome back. You last visited on " + 
           getVisitDate(); 
     } 
  } 
 
  private function getVisitDate():Date { 
     return mySO.data.visitDate; 
  } 
 
  private function storeDate():void { 
     mySO.data.visitDate = new Date(); 
     mySO.flush(); 
  } 
  
  private function deleteLSO():void { 
     // Deletes the SharedObject from the client machine. 
     // Next time they log in, they will be a 'first-timer'. 
     mySO.clear(); 
  } 
  
  ]]></mx:Script> 
  <mx:Label id="label1" text="{welcomeMessage}"/> 
  <mx:Button label="Log Out" click="storeDate()"/> 
  <mx:Button label="Delete LSO" click="deleteLSO()"/> 
</mx:Application>