Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 387|回复: 0

redis+cookies实现session机制(解决 手机浏览器不自动回传cookies导致session不可用问题)

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-7-1 10:38:45 | 显示全部楼层 |阅读模式

     

    昨天在手机端测试自己的项目遇到如下情况。

    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.split("=");
                    if (cookieName == arr[0]) {
                        return arr[1];
                    }
                }
                return "";
            }

     

    最后,我上百个ajax都要手动将cookie值跟在后面?有好的方法欢迎推荐。

     

     

     

        

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-1-22 21:50 , Processed in 0.067374 second(s), 27 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表