Как получить доступ к файлам cookie во Flash?
-
01-07-2019 - |
Вопрос
Я хочу получить значения файлов cookie для того же домена во флэш-ролике.Это возможно?
Давайте посмотрим, я позволяю пользователю установить переменную foo и сохраняю ее, используя любой язык веб-программирования.Я могу легко получить к нему доступ через этот язык, но я хотел бы получить к нему доступ через Flash-ролик, не передавая его при печати на HTML-странице.
Решение
Если вы просто хотите хранить и извлекать данные, вам, вероятно, захочется использовать класс SharedObject.Видеть Справочник Adobe по SharedObject для более подробной информации об этом.
Если вы хотите получить доступ к файлам cookie HTTP, вам нужно будет использовать внешний интерфейс для взаимодействия с javascript.Здесь мы делаем это с помощью вспомогательного класса HTTPCookies.
HTTPCookies.as:
import flash.external.ExternalInterface;
public class HTTPCookies
{
public static function getCookie(key:String):*
{
return ExternalInterface.call("getCookie", key);
}
public static function setCookie(key:String, val:*):void
{
ExternalInterface.call("setCookie", key, val);
}
}
Вам необходимо убедиться, что вы включили JavaScript, используя параметр «allowScriptAccess» в вашем флэш-объекте.
Затем вам нужно создать пару функций javascript, getCookie и setCookie, следующим образом (благодаря quirksmode.org)
HTTPCookies.js:
function getCookie(key)
{
var cookieValue = null;
if (key)
{
var cookieSearch = key + "=";
if (document.cookie)
{
var cookieArray = document.cookie.split(";");
for (var i = 0; i < cookieArray.length; i++)
{
var cookieString = cookieArray[i];
// skip past leading spaces
while (cookieString.charAt(0) == ' ')
{
cookieString = cookieString.substr(1);
}
// extract the actual value
if (cookieString.indexOf(cookieSearch) == 0)
{
cookieValue = cookieString.substr(cookieSearch.length);
}
}
}
}
return cookieValue;
}
function setCookie(key, val)
{
if (key)
{
var date = new Date();
if (val != null)
{
// expires in one year
date.setTime(date.getTime() + (365*24*60*60*1000));
document.cookie = key + "=" + val + "; expires=" + date.toGMTString();
}
else
{
// expires yesterday
date.setTime(date.getTime() - (24*60*60*1000));
document.cookie = key + "=; expires=" + date.toGMTString();
}
}
}
Если у вас есть HTTPCookies.as в вашем флеш-проекте и HTTPCookies.js загружен с вашей веб-страницы, вы сможете вызывать getCookie и setCookie из вашего флэш-фильма, чтобы получать или устанавливать файлы cookie HTTP.
Это будет работать только для очень простых значений — строк или чисел — но для чего-то более сложного вам действительно следует использовать SharedObject.
Другие советы
Я считаю, что флэш-объекты имеют функции, доступные через javascript, поэтому, если нет более простого способа, вы можете хотя бы использовать обработчик загрузки javascript и передать document.cookie в ваше флэш-приложение извне.
Дополнительная информация здесь: http://www.permadi.com/tutorial/flashjscommand/
Вы можете читать и записывать файлы cookie (локальный общий объект) из флэш-памяти.Flash-cookie хранятся на вашем компьютере в каталоге с именем вашего домена.Эти каталоги расположены по адресу:
[Root drive]:\Documents and Settings\[username]\Application Data\Macromedia\Flash Player\#SharedObjects\
Этот статья от Adobe — хорошее начало.
Некоторый поиск в Google показывает, что это можно сделать с помощью строки запроса:
Для веб -приложений вы можете передавать значения в SWF по параметрам URL и (с скриптом действия внутри SWF) сохранить их в песочницу.
файлы cookie доступны для javascript через document.cookie — попробуйте использовать getURL flash для вызова функции javascript.
getURL('javascript:document.cookie = "varname=varvalue; expires=Thu, 2 Aug 2001 20:47:11 UTC; path="');
Метод getCookie в HTTPCookies.as должен использовать оператор return.
import flash.external.ExternalInterface;
public class HTTPCookies
{
public static function getCookie(key:String):*
{
return ExternalInterface.call("getCookie", key);
}
public static function setCookie(key:String, val:*):void
{
ExternalInterface.call("setCookie", key, val);
}
}
Я опоздал на 10 лет.Если вы можете встроить нужные вам данные на страницу, их будет в 10 раз легче получить.
import flash.net.*
var _loader:URLLoader = new URLLoader();
var _req:URLRequest = new URLRequest('https://stackoverflow.com');
_loader.addEventListener(Event.COMPLETE, _onComplete);
_loader.load(_req);
function _onComplete(e:Event):void{
var wantedData:RegExp = /<div class="cool-data">(.*?)</div>/ig;
var result:Object = wantedData.exec(String(_loader.data));
trace(result[0].split('<div class="cool-data">').join('')
.split('</div>').join(''));
}