Можно ли ценить файлы cookie магазина во Flash или Flex? - PullRequest
3 голосов
/ 27 марта 2009

В PHP есть функция setcookie для ее хранения. Во Flash это возможно? Если это возможно, то как? Я хочу сохранить стоимость.

Ответы [ 3 ]

9 голосов
/ 27 марта 2009

Прежде всего: PHP запускается на сервере и, следовательно, может отправлять необходимый заголовок HTTP для установки cookie, Flash запускается в браузере клиента и, следовательно, не может делать то же самое.

Однако есть способ доступа и хранения файлов cookie из flash / flex с помощью flash.external.ExternalInterface и вызова функций JavaScript для получения и установки файлов cookie.

Я разработал класс для этого очень легко:

package de.slashslash.util {

    import flash.external.ExternalInterface;

    /**
     * The Cookie class provides a simple way to create or access
     * cookies in the embedding HTML document of the application.
     * 
     */
    public class Cookie {

        /**
         * Flag if the class was properly initialized.
         */
        private static var _initialized:Boolean = false;

        /**
         * Name of the cookie.
         */
        private var _name:String;

        /**
         * Contents of the cookie.
         */
        private var _value:String;

        /**
         * Flag indicating if a cookie was just created. It is <code>true</code>
         * when the cookie did not exist before and <code>false</code> otherwise.
         */
        private var _isNew:Boolean;

        /**
         * Name of the external javascript function used for getting
         * cookie information.
         */
        private static const GET_COOKIE:String = "cookieGetCookie";

        /**
         * Name of the external javascript function used for setting
         * cookie information.
         */
        private static const SET_COOKIE:String = "cookieSetCookie";

        /**
         * Javascript code to define the GET_COOKIE function.
         */
        private static var FUNCTION_GET_COOKIE:String =
            "function () { " +
                "if (document." + GET_COOKIE + " == null) {" +
                    GET_COOKIE + " = function (name) { " + 
                        "if (document.cookie) {" + 
                            "cookies = document.cookie.split('; ');" + 
                            "for (i = 0; i < cookies.length; i++) {" + 
                                "param = cookies[i].split('=', 2);" + 
                                "if (decodeURIComponent(param[0]) == name) {" + 
                                    "value = decodeURIComponent(param[1]);" + 
                                    "return value;" + 
                                "}" + 
                            "}" + 
                        "}" + 
                        "return null;" + 
                    "};" +
                "}" +
            "}";

        /**
         * Javascript code to define the SET_COOKIE function.
         */
        private static var FUNCTION_SET_COOKIE:String =
            "function () { " +
                "if (document." + SET_COOKIE + " == null) {" +
                    SET_COOKIE + " = function (name, value) { " + 
                        "document.cookie = name + '=' + value;" + 
                    "};" +
                "}" +
            "}";

        /**
         * Initializes the class by injecting javascript code into
         * the embedding document. If the class was already initialized
         * before, this method does nothing.
         */
        private static function initialize():void {
            if (Cookie._initialized) {
                return;
            }

            if (!ExternalInterface.available) {
                throw new Error("ExternalInterface is not available in this container. Internet Explorer ActiveX, Firefox, Mozilla 1.7.5 and greater, or other browsers that support NPRuntime are required.");
            }

            // Add functions to DOM if they aren't already there
            ExternalInterface.call(FUNCTION_GET_COOKIE);
            ExternalInterface.call(FUNCTION_SET_COOKIE);

            Cookie._initialized = true;
        }

        /**
         * Creates a new Cookie object. If a cookie with the specified
         * name already exists, the existing value is used. Otherwise
         * a new cookie is created as soon as a value is assigned to it.
         * 
         * @param name The name of the cookie
         */
        public function Cookie(name:String) {
            Cookie.initialize();

            this._name = name;
            this._value = ExternalInterface.call(GET_COOKIE, name) as String;

            this._isNew = this._value == null;
        }

        /**
         * The name of the cookie.
         */
        public function get name():String {
            return this._name;
        }

        /**
         * The value of the cookie. If it is a new cookie, it is not
         * made persistent until a value is assigned to it.
         */
        public function get value():String {
            return this._value;
        }

        /**
         * @private
         */
        public function set value(value:String):void {
            this._value = value;

            ExternalInterface.call(SET_COOKIE, this._name, this._value);
        }

        /**
         * The <code>isNew</code> property indicates if the cookie
         * already exists or not.
         */
        public function get isNew():Boolean {
            return this._isNew;
        }
    }
}
6 голосов
/ 27 марта 2009

Да. Flash-приложения могут хранить до 100 КБ данных (по умолчанию) на компьютере пользователя. Это хранится во Flash куки (отдельно от куки браузера). Пользователи могут настроить объем хранимых приложений, щелкнув правой кнопкой мыши приложение флэш-памяти и перейдя в настройки.

Вот API SharedObject для AS3: http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/net/SharedObject.html

Вы можете получить больше информации, прибегая к помощи «Flash SharedObject»

Убедитесь, что вы готовы обрабатывать случаи, когда пользователь не позволяет вам помещать данные в SharedObjects. Это становится популярной тенденцией среди технически подкованных пользователей, которые беспокоятся о своей конфиденциальности.

Удачи!

3 голосов
/ 11 апреля 2009

для примера реального кода:


import flash.net.SharedObject;

// get/create the shared object with a unique name.
// If the shared object exists this grab it, if not
// then it will create a new one
var so: SharedObject = SharedObject.getLocal("UniqueName");

// the shared object has a propery named data, it's
// an object on which you can create, read, or modify
// properties (you can't set the data property itself!)
// you can check to see if it already has something set
// using hasOwnProperty, so we'll check if it has a var
// use it if it does, or set it to a default if it doesn't
if (so.data.hasOwnProperty("theProp"))
{
    trace("already has data! It reads: " + so.data.theProp);
}
else
{
    so.data.theProp = "default value";
    so.flush(); // flush saves the data
    trace("It didn't have a value, so we set it.");
}

Вставьте это во флэш-память, опубликуйте дважды и посмотрите, как хранятся данные:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...