昨天在手機端測試自己的項目遇到如下情況。 1.在手機上(蘋果qq瀏覽器),登陸時存在session中的圖片驗證碼結果,一直獲取不到,考慮是cookies的問題。但是其他網站有貌似可以正常使用cookies,這是第一點矛盾。 2.在平板上(安卓qq瀏覽器),一直可以正常使用session,證明cook ...
昨天在手機端測試自己的項目遇到如下情況。
1.在手機上(蘋果qq瀏覽器),登陸時存在session中的圖片驗證碼結果,一直獲取不到,考慮是cookies的問題。但是其他網站有貌似可以正常使用cookies,這是第一點矛盾。
2.在平板上(安卓qq瀏覽器),一直可以正常使用session,證明cookies傳遞沒問題,證明代碼沒問題。
3.在手機上(蘋果UC瀏覽器),瀏覽器剛下載的時候,第一次使用session成功,推出再次登陸,session又不能正常使用了,之後一直不正常。
4.PC端一直正常。
解決辦法:
手動實現session機制
1.給Redis 增加key Val緩存內容。
(1)首先guid生成一個key(相當於sessionId的值)
(2)cookie名稱叫做“vcode_sessionid”,並把第一步的key放到此鍵名的cookie中作為cookie的value,返回給瀏覽器。
(3)將第一步生成的key作為redis的key,redis緩存的值就是我們之前需要存到session的值
int num1 = rd.Next(0, 10);
int num2 = rd.Next(0, 10);
string vcodeKey = Guid.NewGuid().ToString();
string vcodeVal = (num1 + num2).ToString();
HttpCookie cookie = new HttpCookie("vcode_sessionid", vcodeKey);
RedisHelper.SetKeyVal(vcodeKey, vcodeVal);
RedisHelper.SetKeyExpressTime(vcodeKey, 300);
HttpContext.Current.Response.SetCookie(cookie);
2. 讀取redis緩存的結果
HttpCookie cookie = HttpContext.Current.Request.Cookies["vcode_sessionid"];
然後從cookie對象中取出cookie的值,這個值就是我們redis中的鍵,根據鍵取value.
string vcodeFromRedis = RedisHelper.GetValByKey(vcodeSessionId);
這樣一來session機制就實現了。其實這也是session原理,沒什麼複雜之處。
3.但是在某些手機qq瀏覽器中不回傳cookie,這樣依然不能在手機上正常使用我們自己實現的session機制。
最後的解決辦法就是使用如下方法,獲取執行cookie值,並跟在url後面回傳給伺服器。
js方法如下:
getCookie: function (cookieName) { var strCookie = document.cookie; var arrCookie = strCookie.split("; "); for (var i = 0; i < arrCookie.length; i++) { var arr = arrCookie[i].split("="); if (cookieName == arr[0]) { return arr[1]; } } return ""; }
最後,我上百個ajax都要手動將cookie值跟在後面?有好的方法歡迎推薦。