使用SQL Server保存Session状态,实现单点登录
在做一些应用网站时,我们可能会碰到这样一种情况:整个项目是由多个网站组成的,而我们要实现用户从一个站点登录后,跳转到其他网站不需要重复登录,即实现单点登录。目前实现单点登录的技术也有好几种,这篇文章描述一下如何使用ASP.NET2.0和SQL Server来实现单点登录。一般在用户登录成功后,我们需要把用户登录成功的信息保存在Session里,但是Session的值只能保存在用户当前访问的站点下,只要我们实现了Session的跨站共享,也就基本上实现了用户在一个站点登录成功后在其他站点不需要重复登录,在这里,我们使用SQL Server来保存Session状态,实现多个站点共享Session。
开发环境:WindowsXP、VS2005、.NET Framework 2.0、SQL Server 2000
首先我们需要创建一个单独的数据库来保存Session状态,安装了Framework2.0后,我们可以在“C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727”目录下找到一个“InstallPersistSqlState.sql”的SQL文件,这个文件就是用来创建保存Session状态的数据库,只需要在查询分析器中执行一下就可以了,当然也可以使用“UninstallPersistSqlState.sql”这个文件来卸载已创建的状态数据库。
“InstallPersistSqlState.sql”执行完毕后,刷新一下对象浏览器,我们就可以看到一个叫做“ASPState”的数据库,数据库中有两个表,“ASPStateTempApplications”是用来存储所有使用SQLServer保存状态的站点的,“ASPStateTempSessions”当然就是用来保存所有Session的了。如下图:

创建完数据库后,我们可以新建一个测试网站,来看一下Session状态是否可以保存到数据库中,当然测试之前我们还需要对web.config文件做一些设置。打开web.config,在<system.web>标签下创建<sessionState>标签,mode属性是说明把Session状态保存在什么地方,有状态服务器、内存、数据库等,这里我们要选择SQLServer。设置如下所示:
- <system.web>
- <sessionState mode="SQLServer" sqlConnectionString="Data Source=127.0.0.1;User ID=sa;Password=;" timeout="60"/>
- </system.web>
在测试Session状态时,有一点需要注意,就是如果我们在程序中没有给Session任何值,Session状态是不向数据库中保存的。我们随便给Session一个键值,运行后,使用查询分析器来看一下“ASPState”数据库中两个表的内容,如下:
ASPStateTempApplications表

ASPStateTempSessions表

下图为测试页上显示的Session内容:

在这里我们需要解释一下AppID和SessionID,先看一下下面两张图中的SessionID,表ASPStateTempSessions中的SessionID比页面上多出了8位,就是后面的“64021378”,这段字符串其实是表ASPStateTempApplications里的AppID的十六进制表示,可以看出数据库中SessionID的值,是“页面SessionID+AppID”组合而成的。
既然我们要实现的是跨站共享Session,那么我们需要创建另外一个测试站点2,也按照上述方法把Session状态保存到数据库中,下图显示了在浏览器中访问这两个站点后,“ASPStateTempSessions”表保存的Session信息:

这两条SessionID前面的部分相同,不同的地方是后面8位标识AppID的值不同,在ASPState库中,判断是否为同一用户是根据SessionID为条件的,虽然这里用户是同一人,但访问的站点不同,SessionID也就不相同了。下面我们要做的就是忽略SessionID里面的站点标识,这样就ASPState就可以把来自同一用户的多个站点访问当做是同一站点访问,Session值也就可以在多个站点共享了。
在ASPState库里,我们需要修改“TempGetAppID”这个存储过程,把里面两句“WHERE AppName = @appName”注释掉就可以了。在这里,应注意修改完存储过程后,需要把ASP.NET网站程序重新启动一下。
- ALTER PROCEDURE dbo.TempGetAppID
- @appName tAppName,
- @appId int OUTPUT
- AS
- SET @appName = LOWER(@appName)
- SET @appId = NULL
- SELECT @appId = AppId
- FROM [ASPState].dbo.ASPStateTempApplications
- --WHERE AppName = @appName
- IF @appId IS NULL BEGIN
- BEGIN TRAN
- SELECT @appId = AppId
- FROM [ASPState].dbo.ASPStateTempApplications WITH (TABLOCKX)
- --WHERE AppName = @appName
- IF @appId IS NULL
- BEGIN
- EXEC GetHashCode @appName, @appId OUTPUT
- INSERT [ASPState].dbo.ASPStateTempApplications
- VALUES
- (@appId, @appName)
- IF @@ERROR = 2627
- BEGIN
- DECLARE @dupApp tAppName
- SELECT @dupApp = RTRIM(AppName)
- FROM [ASPState].dbo.ASPStateTempApplications
- WHERE AppId = @appId
- RAISERROR('SQL session state fatal error: hash-code collision between applications ''%s'' and ''%s''. Please rename the 1st application to resolve the problem.',
- 18, 1, @appName, @dupApp)
- END
- END
- COMMIT
- END
- RETURN 0
好了,现在我们可以测试一下了,在一个站点中给Session赋个值,然后在另一个站点中取一下,是不是可以取出来呢,如果可以,那么恭喜你,你已经实现了Session共享,应用到你的系统中吧。
- 顶
- 0
- 踩
使用SQL Server保存Session状态,实现单点登录的更多相关文章
- SQL server数据库内置账户SA登录设置
SQL server数据库内置账户SA登录不了 设置SQL Server数据库给sa设置密码的时候 提示18456 解决步骤: 第二步:右击sa,选择属性: 第三步:点击状态选项卡:勾选授予 ...
- 采用集成的Windows验证和使用Sql Server身份验证进行数据库的登录
采用集成的Windows验证和使用Sql Server身份验证进行数据库的登录 1.集成的Windows身份验证语法范例 1 string constr = "server=.;databa ...
- 基于SpringBoot+Redis的Session共享与单点登录
title: 基于SpringBoot+Redis的Session共享与单点登录 date: 2019-07-23 02:55:52 categories: 架构 author: mrzhou tag ...
- SQL Server账号密码(sa)登录失败 错误原因:18456
(其实以前经常用的时候,都很简单,最近一段时间不用了,再一看发现都忘记的差不多了,还是写一篇博客吧,防止下一次再在这种问题上面浪费时间) 使用window登录 打开属性 打开安全性 选择SQL ser ...
- SessionStateMode之SQL Server共享session
分布式应用首先要解决的是跨域的问题,解决session.frame.cookie的跨域是最基本的,然后才是负载均衡和性能优化,上面的不解决就没法往后面进行.上一博客主要是解决了frame跨域的问题,今 ...
- [ASP.NET]配置使用SQL Server保存会话状态
会话状态是ASP.NET应用程序状态的其中一种,这种状态的特点是以用户为单位,每个会话对应一个用户,也就是说在该用户的整个访问过程,会话状态保存的数据都会持续保存于服务器的介质中,直到会话超时(即用户 ...
- .net用SQL Server进行session会话管理
保存在内存中的session经常由于dll的变动导致丢失.有一种方法可以长期保存session,那就是session的SqlServer模式. ASP.NET允许将会话数据存储到一个数据库服务器中,方 ...
- SQL Server 保存不了修改后的表的解决方法
客户端报错(配图): 出现问题环境:在新建一个表之后,又想添加一个字段保存表,提示错误. 解决方案:在SQL Server 2008R2 中 对于对于重新保存新建表系统默认设置为“阻止”,在对应设置解 ...
- sql server数据库可疑状态解决方法
前段时间客户数据服务器断电,开机后发现数据库状态标记为可疑,可能是断电引起的数据库日志文件损坏,修复方法如下: 只有mdf文件,重建日志: --注:example为测试用数据库,相应的Example_ ...
随机推荐
- ReverseInteger
public class ReverseInteger { public static int reverse(int x) { long ret = 0; //如果是个位数,直接返回. if(x/1 ...
- UI(UGUI)框架(一)---------概述与保存/读取面板类型与路径
01.概念:管理场景中所有的面板,控制面板之间的跳转 02.项目层级目录: Resources:存放UIPanel,习惯把所有的一个个面板做成预制源,使用时加载 Scenes:存放场景 UIFrame ...
- 触摸控(触摸与移动 Touch & Mobility)的官方教程
http://blogs.msdn.com/b/linanw/archive/2010/05/02/windows-1-wpf-4.aspx
- Python爬虫之利用BeautifulSoup爬取豆瓣小说(三)——将小说信息写入文件
#-*-coding:utf-8-*- import urllib2 from bs4 import BeautifulSoup class dbxs: def __init__(self): sel ...
- static数据成员与const数据成员的定义与初始化
三种数据类型的初始化 1.static int a 的初始化 const int a 的初始化 static const int a的初始化 三种初始化方式 在类外初始化 在构造函数中通过初始化列表初 ...
- Linux-Crontab服务
1.安装并检查Crontab服务 检查cron服务: 检查Crontab工具是否安装:crontab -l 检查crond服务是否启动:service crond status 安装cron: yum ...
- 201621123014《Java程序设计》第十二周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 面向系统综合设计-图书馆管理系统或购物车 使用流与文件改造你的图书馆管理系统或购物车. 2.1 简述如何 ...
- bzoj 3681 Arietta
一棵有根树,每个点有一个音高,有 $m$ 中弹奏方法,每种方法可以弹奏 $d$ 子树中音高在 $[l,r]$ 间的音符,每种方法最多弹 $t$ 次 求最多能弹出多少个音符 $n \leq 10000$ ...
- C#进阶之路(一):委托
一.什么是委托 简单说它就是一个能把方法当参数传递的对象,而且还知道怎么调用这个方法,同时也是粒度更小的“接口”(约束了指向方法的签名). 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方 ...
- 转: 全局变量报错:UnboundLocalError: local variable 'l' referenced before assignment
http://blog.csdn.net/my2010sam/article/details/17735159