mdmZinc 3 AS2 metóda triedy nezapisuje cookies

Programovacie jazyky, rady, poradňa...
weroro
Flash coder
Flash coder
Používateľov profilový obrázok
Príspevky: 3206
Registrovaný: 14 feb 2009, 22:34
Bydlisko: Bratislava
Kontaktovať používateľa:

mdmZinc 3 AS2 metóda triedy nezapisuje cookies

Príspevok od používateľa weroro »

Začal som robiť jednu aplikáciu a mám taký teoreticko-praktický problém pri písaní jednej triedy.
Samotná funkcionalita mi problém nerobí ale jedná sa o také jedno chovanie, ktoré mi robí problém pri funkčnosti aplikácie ako takej.

Mám vytvorenú triedu na prihlasovanie k jednej cudzej internetovej službe (na ktorej aplikácia parazituje)), ktorá nemá na tento druh prihlásenia žiadne API a po prihlásení je potrebné aby som mal platnú cookie pre ďalšie operácie v aplikácii. Ak vytvorím prihlásenie procedurálne, tak všetko funguje v poriadku, ale akonáhle to "zapúzdrim" do triedy, tak ma síce prihlási ale cookie nemám a tak neviem vykonávať ďalšie potrebné operácie (lebo som identifikovaný ako neprihlásený).

Je to normálne chovanie alebo mám hľadať nejaké obkľuky? Samotnú kontrolu existencie alebo platnosti danej cookie neviem overiť inak ako načítaním web stránky a vyparsovaním HTML a hľadania prihlasovacieho formulára, čo mi je ale prd platné, ak to urobím krátko po prihlásení pomocou metódy v triede.

// edit: Zmena názvu témy
javatar
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6112
Registrovaný: 12 aug 2010, 14:49
Bydlisko: I don't exist at all.

Re: Teoretická otázka ohľadne OOP

Príspevok od používateľa javatar »

takze ak spravne rozumiem - ten isty kod v procedure funguje ale ked z neho urobis metodu triedy tak uz nie?
ak je to tak, tak by som hladal nejake specifikum jazyka... predpokladam, ze robis vo flashi
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: Teoretická otázka ohľadne OOP

Príspevok od používateľa audiotrack »

bolo by treba viac detailov, v akom jazyku to robíš, ako uchovávš tú cookie a podobne.
weroro
Flash coder
Flash coder
Používateľov profilový obrázok
Príspevky: 3206
Registrovaný: 14 feb 2009, 22:34
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: Teoretická otázka ohľadne OOP

Príspevok od používateľa weroro »

Takže podľa otázok predpokladám, že to asi nie je štandardné chovanie.

Využívam framework Zinc ale pri prihlasovaní ešte nevyužívam žiadnu z jeho tried a funkcií. Zinc slúži na prevod SWF do EXE a tak nemám priamo možnosť manažovať správu cookies a tak to nechávam na danom EXÉčku.

Procedurálna forma scriptu sa veľmi nelíši od tej, ktorú používam v triedach. Na jednoduchšiu komunikáciu (aplikácia <-> server) som si vytvoril metódu podobnú tej, ktorá je v jQuery a nazval som ju ajax (zinc obsahuje iba funkcie na komunikáciu pomocou TCP/UDP laebo FTP a nič pre mňa použiteľné pre HTTP).

Kód: Vybrať všetko

function ajax (url:String, arg:Object):Void
{
    if (!url)
    {
        _root.config.error (1);
        return false;
    }
    var method:String = arg.method || 'GET';
    var request:LoadVars = new LoadVars ();
    var result:LoadVars = new LoadVars ();
    result.parent = this.Class || this;
    result.that = this;
    result.datatype = arg.datatype || 'plain';
    result.origin = arg.origin || false;
    result.success = arg.success;
    result.error = arg.error;
    result.vars = arg.vars;
    result.onLoad = function (loaded:Boolean):Void 
    {
        var dt:String = this.datatype.toLowerCase ();
        if (loaded)
        {
            var sfc:Boolean = (this.success && typeof this.success == 'function');
            if (dt == 'mime')
            {
                if (sfc)
                {
                    this.success (this, this.vars);
                }
            }
            else
            {
                var data:String = String (this);
                if (dt != 'html' || dt != 'plain')
                {
                    data = data.split ('=&on')[0].split ('&on')[0];
                }
                if (sfc)
                {
                    if (!this.origin)
                    {
                        data = unescape (data);
                    }
                    this.success (data, this.vars);
                }
            }
        }
        else
        {
            if (this.error && typeof this.error == 'function')
            {
                this.error ();
            }
            else
            {
                _root.config.error (2);
            }
        }
    };
    if (typeof arg.vars == 'object')
    {
        for (var i in arg.vars)
        {
            request[i] = arg.vars[i];
        }
    }
    request.sendAndLoad (url, result, method.toUpperCase ());
}
Pre overenie prihlásenia som vytvoril:

Kód: Vybrať všetko

function isLogged (result:String):Boolean
{
    var piece:Array = result.split ('prihlasenie');
    return (piece.length < 2);
}
V AS2 nemám regulárne výrazy, ani žiadne iné lepšie parsovacie nástroje a tak som po niekoľkých experimentoch a meraniach rýchlosti scriptu dospel k tomu, že cez pole je to najlepšie. Ak sa vo vrátenom HTML zdroji nachádza slovo prihlasenie 2 a viac krát znamená to, že mi to vrátilo formulár (po prihlásení nastane na servery presmerovanie a vráti to hlavnú stránku, na ktorej vrchu je prihlasovací formulár ak som odhlásený), čiže som odhlásený (je to škaredé ale funkčné).

Samotná komunikácia nasleduje takto:

Kód: Vybrať všetko

ajax ('http://domena.sk/prihlasenie', // tu je adresa, ktorá sa nachádza v action prihlasovacieho formulára na stránke
      {
          datatype : 'html', 
          method : 'post', 
          vars : {
              email : '[email protected]', 
              password : '123456'}, 
          success : function (data:String) {
              if (_root.isLogged(data))
              {
                    trace('Prihlásený');
              }
              else
              {
                    trace('Odhlásený');  
              }
            }
});
Ak toto nemám v triede a krátko potom zavolám znovu (napr. kliknutím na tlačítko):

Kód: Vybrať všetko

ajax ('http://domena.sk/', 
      {
          datatype : 'html', 
          success : function (data:String) {
              if (_root.isLogged(data))
              {
                    trace('Prihlásený');
              }
              else
              {
                    trace('Ohlásený');  
              }
            }
});
Som stále prihlásený. Ak je to ale v triede, tak po stlačení tlačítka prihlásený nie som z čoho som vyvodil záver, že cookie neexistuje.
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: Teoretická otázka ohľadne OOP

Príspevok od používateľa audiotrack »

nechápem prečo to či je prihlásený overuješ tak krkolomne, a vyvodzuješ z toho závery o existencii/neexistencii cookies namiesto toho, aby si sa na tú cookinu rovno pozrel. Návodov ako vo flashi pristupovať ku cookies som našiel viacero, napr: http://stackoverflow.com/questions/1095 ... thin-flash

takto hádať nemá zmysel, treba si reálne pozreť čo sa posiela a či sa tie cookiny aj uchovávajú. Sprav si nejakú svoju stránku a pozri čo všetko ti tam príde (var_dump($_COOKIE); var_dump($_POST)) prípadne si odchyť komunikáciu cez nejaký nástroj (wireshark, charles...)
weroro
Flash coder
Flash coder
Používateľov profilový obrázok
Príspevky: 3206
Registrovaný: 14 feb 2009, 22:34
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: Teoretická otázka ohľadne OOP

Príspevok od používateľa weroro »

Keby to bolo tak jednoduché. Flash resp. ActionScript nevie pracovať s cookies (čítať/vytvárať). Jediná vec vo flashi, ktorá sa na cookie snaží podobať je SharedObject, čo je takpovediac podobné LocalStorage v Javascripte. Flash (aj to iba swf spustené v prehliadači), vie komunikovať s js (pomocou ExternalInterface) a js mu vie vrátiť cookie (js s cookies pracovať vie). To ale problém nerieši. Ja mám EXE aplikáciu.

Jediné, čo chcem pochopiť je ako alebo prečo je možné s procedúrou umiestnenou mimo triedy (priamo na timeline) ostať prihlásený a prečo mi tá istá procedúra/metóda nerobí to isté ak je v objekte nejakej triedy. Prešiel som aj oficiálne fórum Zincu ale nenašiel som tam nič. Moja ENG je biedna na to aby som vedel dostatočne na danom fóre popísať tento problém.
audiotrack napísal:treba si reálne pozreť čo sa posiela
Posiela sa to tak ako potrebujem. Na server to príde v poriadku.
audiotrack napísal:pozri čo všetko ti tam príde
Na server príde všetko. Odpoveď zo servera príde v poriadku (aj z môjho aj z toho konkrétneho).

V oboch prípadoch tých funkcií mi vráti, že som prihlásený, ale následná kontrola, či prihlásenie trvá je už s rozdielnym výsledkom.
Teraz ma napadá iba to, že ak je procedúra volaná priamo z rootu inštancie (timeline najvyššej úrovne vo flashi) je cookie zapísaná, ale ak je metóda v objekte, tak je odrezaná od rootu. Skúsim nejak nasmerovať tie dáta na root, ale príde mi to celé nezmyselné lebo v tom nevidím ani nejaké bezpečnostné opatrenie pre ktoré by to robilo problém.
Fabo
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6810
Registrovaný: 16 nov 2007, 17:23
Bydlisko: 's Chravenhache
Kontaktovať používateľa:

Re: mdmZinc 3 AS2 metóda triedy nezapisuje cookies

Príspevok od používateľa Fabo »

Nepoznam ako sa ten flash chova, ale ked vravis, ze to funguje ked mas cookie v najvyssej urovni... nerobi flash nejaku blbost typu ze si po pouziti destructuje triedu a potom si constructuje novu, bez cookie? A ked ostane v root vrstve, tak je perzistentna?
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: mdmZinc 3 AS2 metóda triedy nezapisuje cookies

Príspevok od používateľa audiotrack »

to napadlo aj mne ako prvé, ale z toho čo píše som pochopil, že nevytvára nový objekt. Vytvorí objekt, zavolá jednu metodu, zavolá druhú metodu
weroro
Flash coder
Flash coder
Používateľov profilový obrázok
Príspevky: 3206
Registrovaný: 14 feb 2009, 22:34
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: mdmZinc 3 AS2 metóda triedy nezapisuje cookies

Príspevok od používateľa weroro »

Takže vyriešené. Triedu je potrebné deklarovať dynamickú

Kód: Vybrať všetko

dynamic class nazov {

}
Zbohom logika vo Flashi. :?
Fabo
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6810
Registrovaný: 16 nov 2007, 17:23
Bydlisko: 's Chravenhache
Kontaktovať používateľa:

Re: mdmZinc 3 AS2 metóda triedy nezapisuje cookies

Príspevok od používateľa Fabo »

:sok: :smt117 :-|

rozumiem tomu spravne, ze default stav je neperzistentna staticka klasa, tzn. implementovana tak, ze pri kazdom volani sa zavola konstruktor-metoda-destruktor?

wtf, to co je za jazyk.
Napísať odpoveď