redis+cookies實現session機制(解決 手機瀏覽器不自動回傳cookies導致session不可用問題)


 

昨天在手機端測試自己的項目遇到如下情況。

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值跟在后面?有好的方法歡迎推薦。

 

 

 

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM