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()函数可 ...
随机推荐
- c#开源消息队列中间件EQueue 教程
一.简介 EQueue是一个参照RocketMQ实现的开源消息队列中间件,兼容Mono,具体可以参看作者的文章<分享一个c#写的开源分布式消息队列equeue>.项目开源地址:https: ...
- 微软StockTrader应用程序
这是一个采用 .NET Enterprise Application Server 技术的端到端示例应用程序.应用程序代码可以从 这里 下载. 代码中演示了WCF服务和移动开发,包括用Xamarin ...
- 细数iOS上的那些安全防护
细数iOS上的那些安全防护 龙磊,黑雪,蒸米 @阿里巴巴移动安全 0x00 序 随着苹果对iOS系统多年的研发,iOS上的安全防护机制也是越来越多,越来越复杂.这对于刚接触iOS安全的研究人员来说非 ...
- Backbone源码分析(二)
在传统MVC框架模式中,Model承担业务逻辑的任务.Backbone作为一个mvc框架,主要的业务逻辑交由Model与Collection来实现.Model代表领域对象,今天主要学一下Model源码 ...
- EF:oracle的number类型映射为C#的boolean类型
一开始用下面的方法映射, Property(p => p.IsFixed).HasColumnName("IS_FIXED").HasColumnType("num ...
- 获取Linux主机的CPU、内存、主板、BIOS的信息(Centos)
#!/usr/bin/env python #coding:utf-8 import subprocess import re def Cmd_Exec(cmd): ''' 执行获取信息命令 :par ...
- EF-DbUpdateException解决方案
图二:
- LINQ系列:Linq to Object排序操作符
LINQ排序操作符包括:OrderBy.OrderByDescending.ThenBy.ThenByDescending及Reverse. 1. OrderBy 1>. 原型定义 public ...
- Create views of OpenCASCADE objects in the Debugger
Create views of OpenCASCADE objects in the Debugger eryar@163.com Abstract. The Visual Studio Natvis ...
- Change Line Type in OpenCascade
Change Line Type in OpenCascade eryar@163.com 关键字KeyWords:OpenCascade,Line Aspect, Line Type 在OpenCa ...