日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > HTML >内容正文

HTML

解决SWFUpload在Chrome、Firefox浏览器下session找不到的问题

發布時間:2024/1/17 HTML 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 解决SWFUpload在Chrome、Firefox浏览器下session找不到的问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

SWFUpload是一個非常不錯的異步上傳組件,但是在Chrome、Firefox等瀏覽器下使用的時候會有問題。問題如下:為了防止跳過上傳頁面直 接向“接受SWFUpload上傳的一般處理程序”(假如是Upload.ashx)發送請求造成WebShell漏洞,我的系統中對于 Upload.ashx進行了權限控制,只有登錄用戶才能進行上傳。在IE下沒問題,但是在Chrome下運行報錯“用戶未登錄”。

經過搜索得知:因為SWFUpload是靠Flash進行上傳的,Flash在IE下會把當前頁面的Cookie發到Upload.ashx,但是Chrome、Firefox下則不會把當前頁面的Cookie發到Upload.ashx。因為Session是靠Cookie中保存的SessionId實現的,這樣由于當前頁面的Cookie不會傳遞給Flash請求的Upload.ashx,因此請求的文件發送到Upload.ashx就是一個新的Session了,當然這個Session就是沒有登錄的了。

解決這個問題的思路也很簡單,那就是手動把SessionId傳遞給服務器,再服務器端讀出SessionId再加載Session。其實解決問題的辦法 SWFUpload的Demo中已經給出了,那就是在SWFUpload的構造函數中設置post_params參數:

swfu = new SWFUpload({ post_params: { "ASPSESSID": "<%=Session.SessionID %>" } post_params中設定的鍵值對將會以Form表單的形式傳遞到Upload.ashx,也就是SWFUpload提供了為請求增加自定義請求參數的接口。 上面的代碼把當前頁面的SessionId寫到ASPSESSID值中,當用戶上傳文件后,ASPSESSID就會傳遞到服務器上了,在Global.asax的Application_BeginRequest中添加如下代碼: var Request = HttpContext.Current.Request; var Response = HttpContext.Current.Response; try { string session_param_name = "ASPSESSID"; string session_cookie_name = "ASP.NET_SESSIONID"; if (HttpContext.Current.Request.Form[session_param_name] != null) { UpdateCookie(session_cookie_name, HttpContext.Current.Request.Form[session_param_name]); } else if (HttpContext.Current.Request.QueryString[session_param_name] != null) { UpdateCookie(session_cookie_name, HttpContext.Current.Request.QueryString[session_param_name]); } } catch (Exception) { Response.StatusCode = 500; Response.Write("Error Initializing Session"); } ? ? ? ? 其中UpdateCookie方法的定義如下: static void UpdateCookie(string cookie_name, string cookie_value) { HttpCookie cookie = HttpContext.Current.Request.Cookies.Get(cookie_name); if (cookie == null) { cookie = new HttpCookie(cookie_name); //SWFUpload 的Demo中給的代碼有問題,需要加上cookie.Expires 設置才可以 cookie.Expires = DateTime.Now.AddYears(1); ? ? ? ? ? ? ? ? HttpContext.Current.Request.Cookies.Add(cookie); } cookie.Value = cookie_value; HttpContext.Current.Request.Cookies.Set(cookie); }

原理:當用戶請求到達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了。

如果網站中還用到了Membership的FormsAuthentication驗證,則還需要把AUTHID也按照SessionID的方法進行處理,這一點是其他講到SWFUpload這個Bug處理的文章中沒有提到的。

在SWFUpload的構造函數中設置post_params參數:

swfu = new SWFUpload({ upload_url: "/AdminHT/UploadArticleImg.ashx", post_params: { "ASPSESSID": "<%=Session.SessionID %>", "AUTHID" : "<%=Request.Cookies[FormsAuthentication.FormsCookieName].Value%>" }, 在在Global.asax的Application_BeginRequest中添加如下代碼: try { string auth_param_name = "AUTHID"; string auth_cookie_name = FormsAuthentication.FormsCookieName; if (HttpContext.Current.Request.Form[auth_param_name] != null) { UpdateCookie(auth_cookie_name, HttpContext.Current.Request.Form[auth_param_name]); } else if (HttpContext.Current.Request.QueryString[auth_param_name] != null) { UpdateCookie(auth_cookie_name, HttpContext.Current.Request.QueryString[auth_param_name]); } } catch (Exception) { Response.StatusCode = 500; Response.Write("Error Initializing Forms Authentication"); }

總結

以上是生活随笔為你收集整理的解决SWFUpload在Chrome、Firefox浏览器下session找不到的问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。