Flash电影中无法访问HTTP Cookie,但我现在已经反复阅读过,Flash Player应该自动处理会话cookie。但是,我没有找到任何关于此的文档,并且确实无法使用默认的JSESSIONID cookie对我的Flex客户端运行Struts后端。
那么,Flash Player是否处理会话cookie或不处理会话cookie,如果是,我该如何设置?
答案 0 :(得分:6)
来自Flash的HTTP请求是通过浏览器发送的 - 所以是的,cookie会自动传输。事实上,我目前正在做一个处理HTML页面登录(并因此设置会话cookie)的站点,然后将用户转发到仅Flash页面()。 Flash页面使用URLLoader
&amp ;;向服务器发送了大量请求。 URLRequest
我可以验证其中每个的会话Cookie。
也就是说,您可以使用ExternalInterface.call()从Flash访问HTTP Cookie。确保SWF嵌入代码中的allowScriptAccess设置为适当的值。
var cookies:String = ExternalInterface.call("function()
{
return document.cookie;
}()");
更新:我没有尝试过(在flash中登录),但你可能是对的 - Flash可能会忽略Set-Cookie
(或所有)响应标头。不幸的是,Flash也不允许我们访问响应头。但由于可以在AJAX响应中访问响应头(使用xhr.getResponseHeader
),因此可以将ExternalInterface
和外包登录部分用于AJAX。抓取AJAX响应中的标头并使用javascript设置cookie(根据this SO thread,浏览器将自动执行此操作)。设置后,从闪存发送的后续请求将包含会话cookie。
使用ExternalInterface.addCallback
方法注册一个可以从javascript调用的flash方法。
答案 1 :(得分:3)
Flash Player通常通过浏览器进行联网,在这种情况下,设置和获取cookie完全由浏览器处理。
如果网站发送了Set-Cookie,那应该可以使用。
您无法从Flash内容中访问响应标头,就像您无法从JavaScript访问它们一样;基本的安全原因就是为什么会这样。但是,有一天Flash Player可能允许您通过cookie API读取cookie,就像JavaScript一样。在此期间,ExternalInterface将允许您调用JS来读取cookie。
有一种情况是Flash Player不发送cookie,或者甚至可能发送错误的cookie。那是你使用FileReference.upload()的时候。这是一个已知的Flash Player错误,虽然由于NPAPI依赖性而难以解决Adobe的问题。
BTW,此时JSESSIONID被认为是不安全的。它容易受到CSRF攻击,因为浏览器会盲目地发送它,无论文档是在发出请求。大多数现代登录系统使用隐藏的表单字段或其他方法来保持登录随机数只能访问您域中的页面。
希望我能告诉你为什么你的特定应用程序没有发送cookie。您是否尝试将其与全HTML版本进行比较?您是否使用数据包嗅探器监视两个网络流?
答案 2 :(得分:2)
这个问题是十年前提出的,但是在这方面我有话要说给以后的读者。
Flash Player不会在请求中传输默认的JSESSIONID,并且直到您在JSESSIONID cookie中设置 SameSite = None 之前,它都无法这样做。
我遇到了在请求中删除JSESSIONID cookie的问题,我发现这是因为现代浏览器(chrome> 80)不允许Flash Player访问它没有的
请阅读Adobe here上的公告 详细了解新的Cookie政策:
答案 3 :(得分:0)
我确定这个帖子现在已经死了,但我最近遇到了一个使用ASP.NET和FileUpload的类似问题,并找到了一些基于某些工作的解决方法here。
我构建了一个组件,可以动态地将Flex对象写入页面,以便可以在UpdatePanels中使用它们。如果你想要他们代码,请给我留言。要在URLRequest需要发送身份验证cookie的页面中解决上述问题,我将这些值添加为flashVars。
此代码仅适用于我的对象,但您明白了
Dictionary<string, string> flashVars = new Dictionary<string, string>();
flashVars.Add("auth", Request.Cookies["LOOKINGGLASSFORMSAUTH"].Value);
flashVars.Add("sess", Request.Cookies["ASP.NET_SessionId"].Value);
myFlexObject.SetFlashVars(flashVars);
然后在Flex对象中,检查参数
if (Application.application.parameters.sess != null)
sendVars.sess= Application.application.parameters.sess;
if (Application.application.parameters.auth != null)
sendVars.au= Application.application.parameters.auth;
request.data = sendVars;
request.url = url;
request.method = URLRequestMethod.POST;
最后将cookie填入global.asax BeginRequest
if (Request.RequestType=="POST" && Request.Path.EndsWith("upload.aspx"))
{
try
{
string session_param_name = "sess";
string session_cookie_name = "ASP.NET_SESSIONID";
string session_value = Request.Form[session_param_name]; // ?? Request.QueryString[session_param_name];
if (session_value != null) { UpdateCookie(session_cookie_name, session_value); }
}
catch (Exception) { }
try
{
string auth_param_name = "au";
string auth_cookie_name = FormsAuthentication.FormsCookieName;
string auth_value = Request.Form[auth_param_name];// ?? Request.QueryString[auth_param_name];
if (auth_value != null) { UpdateCookie(auth_cookie_name, auth_value); }
}
catch (Exception) { }
}
希望这有助于有人避免我刚刚花了6个小时解决这个问题。 Adobe已将此问题视为无法解决,因此这是我的最后一招。