分享

关于 SWFUpload 在firefox (ff,火狐)下,报错 302,session,cookie

 若生安饶 2015-02-25
最近在处理多文件上传问题,一直以来都是用jquery的MultiFile.js插件,但是由于该插件不能显示进度条的缘故,而项目实际上对进度条必不可少

再加上实在是不愿意花时间去写文件上传进度,只得在网上找到了swfupload用flash上传文件的插件,在IE下上传多文件十分顺利,但是在火狐下

却总是报302错误,通过千百度,蓦然回首到谷歌折腾了番,才了解了原因,谨以此篇小计下来,毕竟上传带进度条的功能实在是太常见了,先收

着。

        因为SWFUpload是靠Flash进行上传的,Flash在IE下会把当前页面的Cookie发到Upload.aspx,但是Chrome、Firefox下则不会把当前页面的Cookie发到Upload.aspx。因为Session是靠Cookie中保存的SessionId实现的,这样由于当前页面的Cookie不会传递给Flash请求的Upload.aspx,因此请求的文件发送到Upload.ashx就是一个新的Session了,当然这个Session就是没有登录的了。    

     解决这个问题的思路也很简单,那就是手动把SessionId传递给服务器,再服务器端读出SessionId再加载Session。其实解决问题的办法 SWFUpload的Demo中已经给出了,那就是在SWFUpload的构造函数中设置post_params参数:

 

[javascript] view plaincopy
  1. swfu = new SWFUpload({  
  2.                     // Backend Settings  
  3.                     upload_url: "/Upload.aspx",  
  4.                     post_params: {  
  5.                         "ASPSESSID""<%=Session.SessionID %>"},  

post_params中设定的键值对将会以Form表单的形式传递到Upload.aspx,也就是SWFUpload提供了为请求增加自定义请求参数的接口。

 如果网站中还用到了Membership的FormsAuthentication验证,则还需要把AUTHID也按照SessionID的方法进行处理

[javascript] view plaincopy
  1. swfu = new SWFUpload({  
  2.                    // Backend Settings  
  3.                    upload_url: "/Upload.ashx",  
  4.                    post_params: {  
  5.                        "ASPSESSID""<%=Session.SessionID %>"},  
  6.                         "AUTHID" : "<%=Request.Cookies[FormsAuthentication.FormsCookieName].Value%>",  

上面的代码把当前页面的SessionId写到ASPSESSID值中,当用户上传文件后,ASPSESSID就会传递到服务器上了,在Global.asax的Application_BeginRequest中添加如下代码:
  1. protected void Application_BeginRequest(object sender, EventArgs e)  
  2.         {  
  3.             try  
  4.             {  
  5.                 string session_param_name = "ASPSESSID";  
  6.                 string session_cookie_name = "ASP.NET_SESSIONID";  
  7.   
  8.                 if (HttpContext.Current.Request.Form[session_param_name] != null)  
  9.                 {  
  10.                     UpdateCookie(session_cookie_name, HttpContext.Current.Request.Form[session_param_name]);  
  11.                 }  
  12.                 else if (HttpContext.Current.Request.QueryString[session_param_name] != null)  
  13.                 {  
  14.                     UpdateCookie(session_cookie_name, HttpContext.Current.Request.QueryString[session_param_name]);  
  15.                 }  
  16.             }  
  17.             catch (Exception)  
  18.             {  
  19.             }  
  20.   
  21.             try  
  22.             {  
  23.                 string auth_param_name = "AUTHID";  
  24.                 string auth_cookie_name = FormsAuthentication.FormsCookieName;  
  25.   
  26.                 if (HttpContext.Current.Request.Form[auth_param_name] != null)  
  27.                 {  
  28.                     UpdateCookie(auth_cookie_name, HttpContext.Current.Request.Form[auth_param_name]);  
  29.                 }  
  30.                 else if (HttpContext.Current.Request.QueryString[auth_param_name] != null)  
  31.                 {  
  32.                     UpdateCookie(auth_cookie_name, HttpContext.Current.Request.QueryString[auth_param_name]);  
  33.                 }  
  34.   
  35.             }  
  36.             catch (Exception)  
  37.             {  
  38.             }  
  39.   
  40.   
  41.         }  
  42.         void UpdateCookie(string cookie_name, string cookie_value)  
  43.         {  
  44.             HttpCookie cookie = HttpContext.Current.Request.Cookies.Get(cookie_name);  
  45.             if (cookie == null)  
  46.             {  
  47.                 HttpCookie cookie1 = new HttpCookie(cookie_name, cookie_value);  
  48.                 Response.Cookies.Add(cookie1);  
  49.             }  
  50.             else  
  51.             {  
  52.                 cookie.Value = cookie_value;  
  53.                 HttpContext.Current.Request.Cookies.Set(cookie);  
  54.             }  
  55.         }  

原理:当用户请求到达ASP.Net引擎的时候Application_BeginRequest方法首先被调用,在方法中看客户端是否提交上来了ASPSESSID,如果有的话则把ASPSESSID的值写入Cookie(以"ASP.NET_SESSIONID"为Key,因为ASP.Net中SessionId就是保存在"ASP.NET_SESSIONID"为Key的Cookie中的),Application_BeginRequest方法后就可以从Cookie中读取到"ASP.NET_SESSIONID"的值还原出页面的Session了。

 

如果网站是使用Windows方式验证的,post_params:{

                           ASPSESSID: "<%=Session.SessionID %>",这样便可,不需要在Application_BeginRequest写任何方法。

相关阅读

3.2版uploadify详细例子(含FF和IE SESSION问题)



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多