基于Redis缓存的Session共享(附源码)
基于Redis缓存的Session共享(附源码)
在上一篇文章中我们研究了Redis的安装及一些基本的缓存操作,今天我们就利用Redis缓存实现一个Session共享,基于.NET平台的Seesion共享用的最多的应该是SQLServer数据库实现,我之前参与的一个项目么么亲子社区就是用的SQLSERVER实现不同子域名之间的Session共享。先打个广告嘿嘿,么么亲子网:enmuo.com,i.enmuo.com就是通过SQLSERVER实现Session共享 欢迎大家访问。
该片文章主要介绍主域名跟不同子域名之间的Session信息共享。
纠正上一篇文章中关于RredisHelper类中的一个错误,就是要把设置缓存过期时间的代码放在设置完缓存值的后面,要不当第一次给该缓存键赋值的时候设置的缓存时间不管用,这个我也不知道为真么,具体修改如下:
下面我们开始进入正题,首先介绍一下Cookie与Session的关系
我们都知道Session是存在Server端,Cookie是存在用户浏览器本地或内存中,用户在发起一个HTTP请求时,在请求的Header中会有Cookie信息,而Cookie中有一个ASP.NET_Sessionid的值,我们就是通过这个值获取到服务器端对应的Session信息。如下图所示:

说明:图片中的token值是我的另一篇博文中用到的,本篇文章中不涉及该值。
下面介绍一下我的思路
- 用户在给Session赋值的操作的时候我们可以为用户生成一个唯一的cookie值作为sessionID存储在用户的客户端,该cookie的key值可以自己命名,将该cookie值作为缓存的键和Session值一起存入到Redis缓存中。当然我们也可以直接用cookie中ASP.NET_Sessionid的值。
- 用户使用Session值得时候就可以根据cookie中的sessionId值在缓存中取出数据即可。
程序实现逻辑:
1、 我们新建一个如下项目,只用关注红线圈住的,其他没有用

- CookieHelper.cs Cookie操作,主要获取或生成SessionID值
- RredisHelper.cs 缓存操作,详见上一篇博文
- SessionHelper.cs 封装的Session操作
2、 CookieHelper.cs文件
在该文件中我们首先定义一个常量const string RedisSessionCookiesId = "RedisSessionCookiesId";作为cookie中存储SessionId的健。我们用Guid.NewGuid()
生成一个唯一的值存储在cookie中作为SessionId的值,我们给cookie的Domain属性复制 "session.com",作为共享cookie的顶级域名。
具体代码如下:
3、 RredisHelper.cs文件不做介绍,详见:http://www.cnblogs.com/lc-chenlong/archive/2013/07/26/3218157.html
4、 SessionHelper.cs 文件
通过索引器实现Session[“XX”]的取值赋值操作。对索引器不了解的童鞋可以百度一下。
因为在一个项目中我们可以定义很多Session,比如Session[“name”]、Session[“url”]等,然而SessionID却只有一个值,那么我们怎么区分这些Session值呢,我们可以用SessionID+”_”+Session索引值实现,如:SessionID+”_name”、 SessionID+”_url”。
代码如下:
对Session共享测试
1、新建两个web项目

2、我们在WebForm1.aspx.cs中添加如下代码:
3、在Default.aspx中添加如下代码:
4、我在IIS想新建了两个项目:session.com(对应WebForm1.aspx项目)和b.session.com(对应Default.aspx项目)

5、运行session.com下过如下:

6、运行 b.session.com,我们发现我们获取到session.com站点的session值

7、b.session.com在文本框中输入”陈龙”并点击【改变Session[user] 值】按钮。如下图:

8、刷新session.com发现session[‘user’]的值已经改变,而且过期时间也被刷新。

9、等到session.com 页面session[‘url’]的过期时间为0时刷新b.session.com

说明Session值已过期。
整个例子已经写完,如果文中有说的不对的地方欢迎指正。
点击下载源码
每天学习一点点,每天进步一点点。
基于Redis缓存的Session共享(附源码)的更多相关文章
- 基于Redis缓存的Session共享测试(转)
本机ip为192.168.1.101 1.准备测试环境 两个Tomcat 在Eclipse中新建2个Servers,指定对应的Tomcat,端口号错开. Tomcat1(18005.18080.180 ...
- 一文详解如何用 TensorFlow 实现基于 LSTM 的文本分类(附源码)
雷锋网按:本文作者陆池,原文载于作者个人博客,雷锋网已获授权. 引言 学习一段时间的tensor flow之后,想找个项目试试手,然后想起了之前在看Theano教程中的一个文本分类的实例,这个星期就用 ...
- 基于jQuery左右滑动切换特效 附源码
分享一款基于脚jQuery左右滑动切换特效.这是一款鼠标点击左右箭头按钮图片滚动切换,鼠标移到图片上显示透明边框特效. 效果图如下: 废话不多说,代码奉上! html代码: <div ...
- 一个基于jQuery写的弹窗效果(附源码)
最近项目中频繁遇到需要弹出窗口的功能,一直使用浏览器默认的Alert和Confirm弹窗,感觉视觉效果不是那么好,而从网上下载的话又找不到合适的,找到的话有些也是十分臃肿,有时候感觉学习配置的功夫自己 ...
- 基于S2SH开发学生考勤管理系统 附源码
开发环境: Windows操作系统开发工具:Eclipse+Jdk+Tomcat+mysql数据库 运行效果图 源码及原文链接:http://javadao.xyz/forum.php?mod=vie ...
- 基于SSH开发银行个人业务管理系统 附源码
开发环境: Windows操作系统开发工具: MyEclipse+Jdk+Tomcat+MySql数据库 运行效果图
- (干货)基于 veImageX 搭建海报生成平台 -- 附源码
前言 618 年中促销即将来临,很多公司都会通过海报来宣传自己的促销方案,通常情况下海报由设计团队基于 PS.Sketch 等工具创作,后期若想替换海报文案.商品列表等内容则需打开原工程进行二次创作, ...
- .NET基于Redis缓存实现单点登录SSO的解决方案[转]
一.基本概念 最近公司的多个业务系统要统一整合使用同一个登录,这就是我们耳熟能详的单点登录,现在就NET基于Redis缓存实现单点登录做一个简单的分享. 单点登录(Single Sign On),简称 ...
- .NET基于Redis缓存实现单点登录SSO的解决方案
一.基本概念 最近公司的多个业务系统要统一整合使用同一个登录,这就是我们耳熟能详的单点登录,现在就NET基于Redis缓存实现单点登录做一个简单的分享. 单点登录(Single Sign On),简称 ...
随机推荐
- 快速构建Windows 8风格应用23-App Bar概述及使用规范
原文:快速构建Windows 8风格应用23-App Bar概述及使用规范 本篇博文主要介绍App Bar概述.App Bar命令组织步骤.App Bar最佳实践. App Bar概述 Windo ...
- leetcode第13题--Roman to Integer
Problem: Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range ...
- Sql Server中如何快速修正SQL 语句错误
本文将和大家讨论一些关于找SQL 错误的问题. 现在的系统基本都是需要用到数据库的,既然用到数据库我们就要写SQL 脚本,常用的做法是现在Microsoft Sql Server Management ...
- html5 Geolocation(地理位置定位)学习
1.html5 Geolocation html5 Geolocation API 使用很简单,请求一个位置信息,如果用户同意,浏览器会返回一个位置信息,该位置是通过用户的底层设备(手机,电脑) 提供 ...
- iOS_1_加法器
: BeyondViewController.h // // BeyondViewController.h // 01_calc // // Created by beyond on 14-7-20. ...
- Scala是一门现代的多范式编程语言
Scala是一门现代的多范式编程语言 Scala是一门现代的多范式编程语言,志在以简练.优雅及类型安全的方式来表达常用编程模式.它平滑地集成了面向对象和函数语言的特性. Scala是面向对象的:Sca ...
- 从Http它被连接到WebSocket
1.HTTP协议长期-fi支持和各支持的浏览器 http://blog.csdn.net/fenglibing/article/details/7100222 2.WEBclient与服务端信息交互的 ...
- Mvc快速开发
Asp.Net Mvc + ComBoost.Mvc快速开发 ComBoost项目地址 http://comboost.wodsoft.com https://github.com/Kation/ ...
- 在现有代码中通过async/await实现并行
在现有代码中通过async/await实现并行 一项新技术或者一个新特性,只有你用它解决实际问题后,才能真正体会到它的魅力,真正理解它.也期待大家能够多分享解一些解决实际问题的内容. 在我们遭遇“黑色 ...
- CString转换为const char*
CString str=_T("这是我的测试程序.");// 先得到要转换为字符的长度const size_t strsize=(str.GetLength()+1)*2; // ...