zoukankan      html  css  js  c++  java
  • 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值跟在后面?有好的方法欢迎推荐。

        

  • 相关阅读:
    根据之前发的那SQL语句查询表结构的语句做了个MSSQL实体类生成器!
    Struts1.1中的配置(转载)
    回首2011,展望My 2012
    Struts1中execute实现过滤控制
    接口通信的方式(上 )http方式
    创建表分区的总结
    mongodb系列一windowXP下的安装
    does not contain method named
    ORA12514 TNS: 监听程序当前无法识别连接描述符中请求的服务
    oracle9i卸载
  • 原文地址:https://www.cnblogs.com/tdws/p/5441531.html
Copyright © 2011-2022 走看看