Gezamenlijke objecten

Flash Player 9 of hoger, Adobe AIR 1.0 of hoger

Een gezamenlijk object, soms ook wel een 'Flash-cookie' genoemd, is een gegevensbestand dat op uw computer kan worden gemaakt door de sites die u bezoekt. Gezamenlijke objecten worden meestal gebruikt om uw webervaringen te verbeteren. Zo kunt u hiermee bijvoorbeeld het uiterlijk aanpassen van een website die u vaak bezoekt.

Informatie over gezamenlijke objecten

Gezamenlijke objecten werken als browsercookies. Met de klasse SharedObject kunt u gegevens opslaan op de lokale vaste schijf van de gebruiker. Vervolgens kunt u de gegevens in dezelfde sessie of in een latere sessie aanroepen. Toepassingen hebben uitsluitend toegang tot hun eigen SharedObject-gegevens en alleen als deze in hetzelfde domein worden uitgevoerd. De gegevens worden niet naar de server gestuurd en zijn niet toegankelijk voor andere toepassingen die andere domeinen uitvoeren, maar deze kunnen wel toegankelijk worden gemaakt voor andere toepassingen in hetzelfde domein.

Gezamenlijke objecten vergeleken met cookies

Cookies en gezamenlijke objecten lijken veel op elkaar. De meeste webprogrammeurs weten hoe cookies werken. Daarom kan het handig zijn een vergelijking te maken tussen cookies en lokale gezamenlijke objecten.

Cookies die voldoen aan de RFC 2109-standaard hebben over het algemeen de volgende eigenschappen:

  • Ze kunnen verlopen en doen dat vaak standaard aan het einde van een sessie.

  • Ze kunnen op site-specifieke basis door de client worden uitgeschakeld.

  • Er bestaat een limiet van 300 cookies in totaal en maximaal 20 cookies per site.

  • De grootte ervan is doorgaans beperkt tot 4 kB elk

  • Ze worden soms beschouwd als bedreiging van de veiligheid en worden daarom soms op de client uitgeschakeld.

  • Ze worden opgeslagen op een locatie die wordt aangegeven door de clientbrowser.

  • Ze worden via HTTP overgedragen van client naar server.

    Gezamenlijke objecten hebben daarentegen de volgende eigenschappen:

  • Ze verlopen standaard niet.

  • De grootte is standaard beperkt tot 100 kB elk.

  • Er kunnen eenvoudige soorten gegevens in worden opgeslagen (zoals een rekenreeks, array en datum).

  • Ze worden opgeslagen op een locatie die wordt opgegeven door de toepassing (in de basismap van de gebruiker).

  • Ze worden nooit overgedragen tussen de client en de server.

Informatie over de klasse SharedObject

Met de klasse SharedObject kunt u gedeelde objecten maken en verwijderen. U kunt ook het huidige formaat bepalen van een SharedObject-object dat u gebruikt.

Gezamenlijke objecten maken

Als u een SharedObject -object wilt maken, gebruikt u de methode SharedObject.getLocal() met de volgende syntaxis:

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

In het volgende voorbeeld wordt een gezamenlijk object gemaakt met de naam mySO:

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

Hierbij wordt op het clientapparaat een bestand gemaakt met de naam preferences.sol.

De term lokaal verwijst naar de locatie van het gezamenlijke object. In dit geval slaat Adobe® Flash® Player het SharedObject-bestand lokaal op in de basismap van de client.

Wanneer u een gezamenlijk object maakt, maakt Flash Player een nieuwe map voor de toepassing en domein in de sandbox. Daarnaast wordt een *.sol-bestand gemaakt waarin de SharedObject-gegevens worden opgeslagen. De standaardlocatie van dit bestand is een submap van de basismap van de gebruiker. In de volgende tabel staan de standaardlocaties van deze map:

Besturingssysteem

Locatie

Windows 95/98/ME/2000/XP

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

Windows Vista/Windows 7

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

Onder de map #SharedObjects bevindt zich een map met een willekeurige naam. Daaronder bevindt zich een map waarvan de naam overeenkomt met de hostnaam, gevolgd door het pad naar de toepassing en tot slot het *.sol-bestand.

Als u bijvoorbeeld vraagt om een toepassing met de naam MyApp.swf op de lokale host en in een submap met de naam /sos, slaat Flash Player het *.sol-bestand in Windows XP op de volgende locatie op:

c:/Documents and Settings/fred/Application Data/Macromedia/Flash Player/#SharedObjects/KROKWXRK/#localhost/sos/MyApp.swf/data.sol
Opmerking: Als u geen naam opgeeft in de methode SharedObject.getLocal() , geeft Flash Player het bestand de naam undefined.sol.

Standaard kan Flash lokaal permanente SharedObject-object met een grootte van maximaal 100 kB per domein opslaan. Deze waarde kan door de gebruiker worden ingesteld. Wanneer de toepassing probeert gegevens op te slaan in een gezamenlijk object waardoor dit groter zou worden dan 100 kB, geeft Flash Player het dialoogvensters Lokale opslag weer, waarin de gebruiker meer lokale opslag voor het domein dat toegang vraagt kan toestaan of weigeren.

Pad opgeven

Met de optionele parameter pathname geeft u een locatie op voor het SharedObject -bestand. Dit bestand moet een submap zijn van de SharedObject-map van dat domein. Als u bijvoorbeeld vraagt naar een toepassing op de lokale host en het volgende opgeeft:

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

schrijft Flash Player het SharedObject-bestand in de map /#localhost (of /localhost als de toepassing offline is). Dit is nuttig als u wilt dat meer dan één toepassing op de client toegang heeft tot hetzelfde gezamenlijke object. In dit geval zou de client twee Flex-toepassingen kunnen uitvoeren, die beide een pad opgeven naar het gezamenlijke object dat de root vormt van het domein; de client zou dan vanuit beide toepassingen toegang hebben tot hetzelfde gezamenlijke object. Als u gegevens wilt delen tussen meer dan één toepassing zonder persistentie, kunt u het object LocalConnection gebruiken.

Als u een map opgeeft die niet bestaat, maakt Flash Player geen SharedObject-bestand.

Gegevens toevoegen aan een gezamenlijk object

U kunt gegevens toevoegen aan een *.sol-bestand van SharedObject door gebruik te maken van de eigenschap data van het SharedObject-object. Gebruik de volgende syntaxis om nieuwe gegevens toe te voegen aan het gezamenlijke object:

sharedObject_name.data.variable = value;

In het volgende voorbeeld worden de eigenschappen userName , itemNumbers en adminPrivileges en hun waarden toegevoegd aan een 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;

Wanneer u waarden hebt toegewezen aan de eigenschap data , moet u Flash Player opdragen die waarden naar het SharedObject-bestand te schrijven. Om Flash Player te dwingen de waarden naar het SharedObject-bestand te schrijven, gebruikt u de methode SharedObject . flush() als volgt:

mySO.flush();

Als u de methode SharedObject.flush() niet aanroept, schrijft Flash Player de waarden naar het bestand wanneer de toepassing wordt afgesloten. Dit biedt de gebruiker echter niet de gelegenheid om de beschikbare ruimte te vergroten die Flash Player heeft om de gegevens op te slaan als de gegevens groter zijn dan de standaardinstellingen. Het is daarom een goed idee om SharedObject.flush() aan te roepen.

Als u de methode flush() gebruikt om gezamenlijke objecten naar de vaste schijf van de gebruiker te schrijven, moet u controleren of de gebruiker lokale opslag expliciet heeft uitgeschakeld via Settings Manager van Flash Player ( www.macromedia.com/support/documentation/nl/flashplayer/help/settings_manager07.html ), zoals in het volgende voorbeeld:

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

Objecten opslaan in gezamenlijke objecten

U kunt eenvoudige objecten, zoals arrays of tekenreeksen opslaan in de eigenschap data van een SharedObject.

In het volgende voorbeeld definieert de klasse ActionScript methoden waarmee de interactie met het gezamenlijke object wordt geregeld. Met deze methoden kan de gebruiker objecten aan het gezamenlijke object toevoegen of eruit verwijderen. In deze klasse wordt een ArrayCollection opgeslagen die eenvoudige objecten bevat.

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(); 
        } 
    } 
 
}

Met de volgende Flex-toepassing wordt een instantie van de klasse ActionScript gemaakt voor elk type gezamenlijk object dat nodig is. Vervolgens worden methoden aangeroepen op die klasse wanneer de gebruiker blogs of site-URL's toevoegt of verwijdert.

<?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>

Objecten met typen opslaan in gezamenlijke objecten

U kunt instanties van ActionScript met type opslaan in gezamenlijke objecten. Dit doet u door de methode flash.net.registerClassAlias() aan te roepen om de klasse te registreren. Als u een instantie van de klasse maakt en deze opslaat in het gegevenslid van het gezamenlijke object en het object later uitleest, krijgt u een instantie met een type. Standaard ondersteunt de SharedObject-eigenschap objectEncoding AMF3-codering en wordt de opgeslagen instantie uit het SharedObject-object uitgepakt; de opgeslagen instantie houdt het type dat u hebt opgegeven toen u de methode registerClassAlias() aanriep.

(alleen iOS) Back-up in de cloud verhinderen voor gedeelde objecten

U kunt de SharedObject.preventBackup -eigenschap instellen om te bepalen of lokaal gedeelde objecten in de back-up van de iOS-cloudback-upservice worden geplaatst. Dit is verplicht door Apple voor inhoud die opnieuw kan worden gegenereerd of gedownload, maar die vereist is voor een goede werking van uw toepassing tijdens offlinegebruik.

Meerdere gezamenlijke objecten maken

U kunt meerdere gezamenlijke objecten maken voor dezelfde Flex-toepassing. Hiertoe wijst u aan elk hiervan een andere instantienaam toe, zoals aangegeven in het volgende voorbeeld:

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

Hiermee maakt u een preferences.sol-bestand en een history.sol-bestand aan in de lokale map van de Flex-toepassing.

Een beveiligd SharedObject maken

Wanneer u een lokaal of extern SharedObject maakt met behulp van getLocal() of getRemote() , bepaalt een optionele parameter met de naam secure of toegang tot dit gezamenlijke object is beperkt tot SWF-bestanden die worden aangeboden via een HTTPS-verbinding. Als deze parameter wordt ingesteld op true en het SWF-bestand wordt aangeboden via HTTPS, wordt in Flash Player een nieuw beveiligd gezamenlijk object gemaakt of wordt een verwijzing naar een bestaand beveiligd gezamenlijk object opgehaald. Alleen SWF-bestanden die via HTTPS worden geleverd en SharedObject.getLocal() aanroepen met de parameter secure die is ingesteld op true , hebben lees- en schrijftoegang tot dit beveiligde gezamenlijke object. Als deze parameter wordt ingesteld op false en het SWF-bestand wordt aangeboden via HTTPS, wordt in Flash Player een nieuw gezamenlijk object gemaakt of wordt een verwijzing naar een bestaand gezamenlijk object opgehaald.

SWF-bestanden die via niet-HTTPS-verbindingen worden geleverd, hebben lees- en schrijftoegang tot dit gezamenlijke object. Als uw SWF-bestand wordt geleverd via een niet-HTTPS-verbinding en u deze parameter probeert in te stellen op true , mislukt het maken van een nieuw gezamenlijk object (of kan er geen toegang worden verkregen tot een eerder gemaakt beveiligd gezamenlijk object). Er wordt een fout gegenereerd en het gezamenlijke object wordt ingesteld op null . Als u probeert het volgende fragment uit te voeren vanuit een niet-HTTPS-verbinding, genereert de methode SharedObject.getLocal() een fout:

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

Ongeacht de waarde van deze parameter tellen de gemaakte gezamenlijke objecten mee voor de toegestane totale hoeveelheid schijfruimte voor een domein.

De inhoud van een gezamenlijk object weergeven

Waarden worden in gezamenlijke objecten opgeslagen in de eigenschap data . U kunt alle waarden binnen een instantie van een gezamenlijk object doorlopen met een for..in -lus, zoals in het volgende voorbeeld wordt getoond:

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]); 
}

Gezamenlijke objecten vernietigen

Als u een SharedObject op de client wilt vernietigen, kan dit met de methode SharedObject.clear() . Hiermee vernietigt u geen mappen in het standaardpad van de gezamenlijke objecten van de toepassing.

In het volgende voorbeeld wordt het SharedObject-bestand op de client vernietigd:

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

SharedObject-voorbeeld

In het volgende voorbeeld wordt duidelijk dat u eenvoudige objecten, zoals een Date-object, kunt opslaan in een SharedObject -object, zonder dat u de objecten handmatig moet serialiseren en deserialiseren.

In het volgende voorbeeld wordt u eerst als nieuwe bezoeker verwelkomd. Wanneer u op Afmelden klikt, slaat de toepassing de huidige datum op in een gezamenlijk object. De volgende keer dat u de toepassing start of de pagina vernieuwt, verwelkomt de toepassing u opnieuw en laat zien wanneer u zich hebt afgemeld.

Als u de toepassing in actie wilt zien, start u de toepassing, klikt u op Afmelden en vernieuwt u vervolgens de pagina. De toepassing geeft de datum en de tijd weer van het moment waarop u op de knop Afmelden klikte bij uw vorige bezoek. U kunt de opgeslagen informatie op elk moment verwijderen door op de knop LSO verwijderen te klikken.

<?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>