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 = ; i < arrCookie.length; i++) {
var arr = arrCookie[i].split("=");
if (cookieName == arr[]) {
return arr[];
}
}
return "";
}
最后,我上百个ajax都要手动将cookie值跟在后面?有好的方法欢迎推荐。
redis+cookies实现session机制(解决 手机浏览器不自动回传cookies导致session不可用问题)的更多相关文章
- 解决chrome浏览器对于自动填充的input表单添加的默认的淡黄色背景问题 && 一般的浏览器input和button的高度不一致问题
解决chrome浏览器对于自动填充的input表单添加的默认的淡黄色背景问题 如果我们把一个表单设置位 autofocus ,这时这个表单在获取焦点后就会产生淡黄色的背景,我们就是使用!importa ...
- 把cookie以json形式返回,用js来set cookie.(解决手机浏览器未知情况下获取不到cookie)
.继上一篇随笔,链接点我,解决手机端cookie的问题. .上次用cookie+redis实现了session,并且手机浏览器可能回传cookies有问题,所以最后用js取出cookie跟在请求的ur ...
- 少部分手机浏览器对于COOKIE支持不够导致服务端无法读取session的解决方案
相信大家都遇到过这样的问题,有手机浏览器的问题导致服务端SESSION读取不正常,目前在项目中的解决方法是采取H5手机本地存储唯一KEY解决的 代码片段 //定义json格式字符串 var userD ...
- 解决手机浏览器和微信中select中border:none;无用和去掉小三角
设置select的边框为none:在PC端是没有问题的,但是放到手机浏览器和微信里上还是会出现边框 解决办法: appearance:none; -moz-appearance:none; /* Fi ...
- 解决手机浏览器上input 输入框导致页面放大的问题(记录)
在微信手机页面开发当中,页面是没有问题的,但是当焦点在input输入框的时候,手机页面会自动放大. 加入以下代码在head 区,可解决此问题 <meta name="viewport& ...
- 多tomcat 同一个浏览器 多个项目 会导致session覆盖
1,多tomcat 同一个浏览器 同一个项目 会导致session覆盖 个人猜测:一个服务器中有多个Tomcat服务器多个项目,每个服务器占用不同的端口号,当在同一个浏览器里面同时打开2个系统时,一个 ...
- 解决Chrome浏览器无法自动播放音频视频的问题,Uncaught (in promise) DOMException
转载自:http://www.nooong.com/docs/chrome_video_autoplay.htm 在最新版的Chrome浏览器(以及所有以Chromium为内核的浏览器)中,已不再允许 ...
- Session机制详解及分布式中Session共享解决方案
一.为什么要产生Session http协议本身是无状态的,客户端只需要向服务器请求下载内容,客户端和服务器都不记录彼此的历史信息,每一次请求都是独立的. 为什么是无状态的呢?因为浏览器与服务器是使用 ...
- php中session机制的详解
[补充]session_start()要放在php最前面,header()函数也要放在session_start()之后. [读了下面的文章转载的文章后自己的理解]: 1,通过phpinfo()函数可 ...
随机推荐
- 借助 Lucene.Net 构建站内搜索引擎(上)
前言:最近翻开了之前老杨(杨中科)的Lucene.Net站内搜索项目的教学视频,于是作为老杨脑残粉的我又跟着复习了一遍,学习途中做了一些笔记也就成了接下来您看到的这篇博文,仅仅是我的个人笔记,大神请呵 ...
- 细嗅Promise
读完这篇文章,预计会消耗你 40 分钟的时间. Ajax 出现的时候,刮来了一阵异步之风,现在 Nodejs 火爆,又一阵异步狂风刮了过来.需求是越来越苛刻,用户对性能的要求也是越来越高,随之而来的是 ...
- Unit Testing with NSubstitute
These are the contents of my training session about unit testing, and also have some introductions a ...
- SQL Server 系统数据库恢复
标签:SQL SERVER/MSSQL SERVER/数据库/DBA/故障恢复/master 概述 SQL Server 维护一组系统级数据库(称为“系统数据库”),这些数据库对于服务器实例的运行至关 ...
- C语言 · 回文数 · 基础练习
问题描述 1221是一个非常特殊的数,它从左边读和从右边读是一样的,编程求所有这样的四位十进制数. 输出格式 按从小到大的顺序输出满足条件的四位十进制数. 代码如下: 注意:这里要提醒一下读者:蓝 ...
- ORM小练习代码
DOG类 namespace RupengORM { public class Dog { public Dog() { } /// <summary> /// 显示提供无参构造函数 // ...
- Oozie 快速入门
设想一下,当你的系统引入了spark或者hadoop以后,基于Spark和Hadoop已经做了一些任务,比如一连串的Map Reduce任务,但是他们之间彼此右前后依赖的顺序,因此你必须要等一个任务执 ...
- Attribute富文本使用方法
★★★Attribut富文本★★★ 在UITextView和UILable的使用中很多的时候会用到富文本. UITextView和UILable的区别在于: ★★★★UITextView 当文字大于一 ...
- 使用Event Message 对 Package 进行Troubleshoot
在SSIS Server上,发现一个Package Job运行异常,该Package处于僵死状态.从 Job Activity Monitor中看到该Job一直处于运行状态,但是,DW中没有执行任何Q ...
- Security8:删除Role 和 User
数据库的Role 和 User都是基于Specified DB的,在删除这些Principal之前,必须使用Use clause,切换到指定的DB中. sys.database_role_member ...