权限管理——在线列表

我们知道在后台管理系统中如何限制用户重复登陆是个讨论不觉的问题。一些人刚开始说在数据库里设置一个标志,当同样用户登录的时候就提示已经重复登陆,但是这里存在一个问题就是如果用户突然非法关机,那么其他的用户将永远无法登录。因此,这里要考虑两种情况,一个是用户已经登录的情况下,在有其他的用户用相同的帐号密码登录的时候可以让其他用户强制之前一个用户下线,这个很符合逻辑,既然都知道用户名和密码,那么系统就没办法判断到底哪个登录的是对的。因此,系统有权让知道密码的用户都可以登录系统。第二个还要防止用户非法关机之类的,一旦用户关机后,我们应该设置一个定时器,当然这个时间由我们自己来定义一个合理的时间,然后让服务器每到指定的时间就触发这个事件。不断的判断在线的用户列表中的用户是否已经达到指定的时间没有操作,如果是的话就把用户从在线列表中清除,让用户重新登陆。我觉得这样的设计比较合理,如果有更好的可以给我留言。 

    根据这样的需求,我们就定义个管理用户的系统类,它具有用户ID,用户名,开始时间,最后操作时间,最后操作网址,用户类型,在线时间,还有IP。定义完后,我们就需要定义一个来存储这些信息的集合。系统里是定义一个缓存辞典来存储这些信息。一共定义了2个辞典和一个双向链表。第一个是 Dictionary<string,LinkedListNode<TValue>> _MemberUserList;用来存储所有的会员信息。Dictionary<TKey,LinkedListNode<TValue>> _AllUserList;定义所有的信息,包括会员和游客。在定义一个 LinkedList<TValue> _TValueLink;双向链表进行排序。因为,我们要对链表进行增删改,来达到不断维护在线链表的功能,因此,必须定义一个锁,来限制同一个时间只能对在线列表进行读或者写操作,因此系统中定义了一个 protected ReaderWriterLock _CacheDataRwl = new ReaderWriterLock();锁。接下来就是要定义一个时间,前一篇我已经提到过的system.time.timer类来时间,让它根据指定的时间不断的触发事件。这里的事件就是不断的清除那些已经过期的用户。当然这个类的功能还不限于此,既然可以删除过期用户,当然要具有可以添加新的用户,和更新新的用户的功能。因此,这个类中重载了多种删除的方法。可以根据用户给定的键值也就是key来删除,也可以通过name属性来删除,因此这里要求,name和key一样都具有唯一性。不过在删除和增加的时候都要加锁。判断用户是否长时间都没有操作的方法很简单,只要把用户最后操作时间和当前时间进行判断,如果操作系统指定时间则说明超时,当然,这样也要求用户每访问一个页面的时候都要更新最后操作的时间。

     当然也可以把用户信息存在表中,其实方法大同小异,一个是放在内存中,一个放在数据库中,一个访问快点但是占用内存,另外一个速度慢点每次都要去连接数据库,但是可以存储大量的数据,因此可以满足有大量用户在线的需求。

 

 public class CacheOnline<TKey,TValue>
         where TKey : IComparable<TKey>
         where TValue : OnlineUser<TKey>,new()
...{...}
跟想象中的类实在太不一样,我也是才接触一天,有些错误也是难免的,
CacheOnline<TKey,TValue>
其中 TKey,TValue 就是泛型类型关键字,通常规定用大写字母T开头,包含在尖括号<>中,它实际上并不是一个类型,而更像是一个类型的蓝图。若要使用 GenericList<T>,客户端代码必须通过指定尖括号中的类型参数来声明和实例化构造类型。此特定类的类型参数可以是编译器识别的任何类型。(http://www.gzctu.com/blog/blogview.asp?id=250)

再来看看
         where TKey : IComparable<TKey>
         where TValue : OnlineUser<TKey>,new()
where关键字实现的是对类型参数的约束,(http://www.gzctu.com/blog/blogview.asp?id=251)这里则:TKey必须为IComparable接口,TValue必须为类OnlineUser(OnlineUser 类主要描述用户信息)而new()则 约束指定泛型类声明中的任何类型参数都必须有公共的无参数构造函数。当泛型类创建类型的新实例时,将此约束应用于类型参数.当与其他约束一起使用时,new() 约束必须最后指定:

关于更多的就不再说了,实在说不清楚,也不是下子能明白的,多看看MSDN吧.
泛型可用于变量的声明如
Dictionary<string,LinkedListNode<TValue>> _MemberUserList;
Dictionary 为泛型集合(http://www.gzctu.com/blog/blogview.asp?id=265)总之这里就是要把在线用户的信息方入这个集合里面去,
然而,在声明变量地方看到三个关键字 LinkedListNode,LinkedList和ReaderWriterLock 其解释分别如下

LinkedList<(Of <(T>)>) 为通用链表(http://msdn2.microsoft.com/zh-cn/library/he2s3bh7.aspx)

LinkedList<(Of <(T>)>) 集合的每个元素都是 LinkedListNode<(Of <(T>)>)。LinkedListNode<(Of <(T>)>) 包含一个值、对其所属的 LinkedList<(Of <(T>)>) 的引用、对下一个节点的引用,以及对上一个节点的引用。(http://msdn2.microsoft.com/zh-cn/library/ahf4c754.aspx)

ReaderWriterLock 用于同步对资源的访问。在任一特定时刻,它允许多个线程同时进行读访问,或者允许单个线程进行写访问。在资源不经常发生更改的情况下,ReaderWriterLock 所提供的吞吐量比简单的一次只允许一个线程的锁更高。

在多数访问为读访问,而写访问频率较低、持续时间也比较短的情况下,ReaderWriterLock 的性能最好。多个读线程与单个写线程交替进行操作,所以读线程和写线程都不会长时间阻止。(http://msdn2.microsoft.com/zh-cn/library/system.threading.readerwriterlock(VS.80).aspx)

至此这个 在线用户类 的整体轮廓也出来了,其主要就是对 泛型集合 Dictionary 的各种操作
构造一个定时器,默认为每30分钟更新一下在线用户(清除不在线的 其具体的我也还说不出来 始终学得太少了 哈哈)

说了很多废话,来简单看下怎么调用,其实 FrameWorkLogin.cs 中已经有很多例子了,
比如 检测在线列表(checkOnline)中获取 用户信息
OnlineUser<int> ou =   FrameWorkPermission.UserOnlineList.GetValue(U_LoginName);
OnlineUser<int> ou 与 用户基础类 public class OnlineUser<TKey>相呼应,此处 <int>ou 则表名ou为整型,如果是常规的 int ou 则会有个装箱过程,根据 FrameWorkPermission.UserOnlineList 跳到 文件 FrameWorkPermission.cs 看到
public static CacheOnline<int,OnlineUser<int>> UserOnlineList = null;
CacheOnline<int,OnlineUser<int>> 则与public class CacheOnline<TKey,TValue>向呼应 这里取出的值都为整型(根据用户名获取用户信息),

 

文章来自:http://www.cnblogs.com/zgqys1980/archive/2010/08/20/1804798.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


引言 本文从Linux小白的视角, 在CentOS 7.x服务器上搭建一个Nginx-Powered AspNet Core Web准生产应用。 在开始之前,我们还是重温一下部署原理,正如你所常见的.Net Core 部署图: 在Linux上部署.Net Core App最好的方式是在Linux机器
引言: 多线程编程/异步编程非常复杂,有很多概念和工具需要去学习,贴心的.NET提供Task线程包装类和await/async异步编程语法糖简化了异步编程方式。 相信很多开发者都看到如下异步编程实践原则: 遵守以上冷冰冰的②③条的原则,可保证异步程序按照预期状态正常运作;我们在各大编程论坛常看到违背
一. 宏观概念 ASP.NET Core Middleware是在应用程序处理管道pipeline中用于处理请求和操作响应的组件。 每个组件是pipeline 中的一环。 自行决定是否将请求传递给下一个组件 在处理管道的下个组件执行之前和之后执行业务逻辑 二. 特性和行为 ASP.NET Core处
背景 在.Net和C#中运行异步代码相当简单,因为我们有时候需要取消正在进行的异步操作,通过本文,可以掌握 通过CancellationToken取消任务(包括non-cancellable任务)。 Task&#160;表示无返回值的异步操作, 泛型版本Task&lt;TResult&gt;表示有返
HTTP基本认证 在HTTP中,HTTP基本认证(Basic Authentication)是一种允许网页浏览器或其他客户端程序以(用户名:口令) 请求资源的身份验证方式,不要求cookie,session identifier、login page等标记或载体。 - 所有浏览器据支持HTTP基本认
1.Linq 执行多列排序 OrderBy的意义是按照指定顺序排序,连续两次OrderBy,后面一个有可能会打乱前面一个的排序顺序,可能与预期不符。 要实现sql中的order by word,name类似效果; LINQ 有ThenBy可以紧接使用, ThenBy记住原本排序的值,然后再排其他值,
ASP.NET Core 核心特性:开源、跨平台、高性能是其决战JAVA的必胜法宝,最引人关注的跨平台特性 到底是怎么实现? &#xA; 本文分Unix、Windows剖析跨平台内幕,读完让你大呼过瘾。
前导 Asynchronous programming Model(APM)异步编程模型以BeginMethod(...) 和 EndMethod(...)结对出现。 IAsyncResult BeginGetResponse(AsyncCallback callback, object state
引言 最近在公司开发了一个项目,项目部署架构图如下: 思路 如图中文本所述,公司大数据集群不允许直接访问外网,需要一个网关服务器代理请求,本处服务器A就是边缘代理服务器的作用。 通常技术人员最快捷的思路是在服务器A上部署IISʺpplication Request Routing Module组件
作为一枚后端程序狗,项目实践常遇到定时任务的工作,最容易想到的的思路就是利用Windows计划任务/wndows service程序/Crontab程序等主机方法在主机上部署定时任务程序/脚本。 但是很多时候,若使用的是共享主机或者受控主机,这些主机不允许你私自安装exe程序、Windows服务程序
引言 熟悉TPL Dataflow博文的朋友可能记得这是个单体程序,使用TPL Dataflow 处理工作流任务, 在使用Docker部署的过程中, 有一个问题一直无法回避: 在单体程序部署的瞬间(服务不可用)会有少量流量无法处理;更糟糕的情况下,迭代部署的这个版本有问题,上线后无法运作, 更多的流
合格的web后端程序员,除搬砖技能,还必须会给各种web服务器配置Https,本文结合ASP.NET Core部署模型聊一聊启用Https的方式。 温故知新 目前常见的Http请求明文传输,请求可能被篡改,访问的站点可能被伪造。 HTTPS是HTTP加上TLS/SSL协议构建的可进行加密传输、身份认
长话短说 前文《解剖HttpClientFactory,自由扩展HttpMessageHandler》主要讲如何为HttpClientFactory自定义HttpMessageHandler组件, 现在来完成课后的小作业: 将重点日志字段显示到Nlog的LayoutRenderer上。 本文实现一个
引言问题 作为资深老鸟,有事没事,出去面试;找准差距、定位价值。 面试必谈哈希, Q1:什么是哈希? Q2:哈希为什么快? Q3:你是怎么理解哈希算法利用空间换取时间的? Q4:你是怎么解决哈希冲突的? Q5:你有实际用写过哈希算法吗? 知识储备 哈希(也叫散列)是一种查找算法(可用于插入),哈希算
前言 如题,有感于博客园最近多次翻车,感觉像胡子眉毛一把抓, 定位不了生产环境的问题。 抛开流程问题,思考在生产环境中如何做故障排除,&#160;发现博客园里面这方面的文章比较少。 .Net 本身是提供了sos.dll工具帮助我们在生产中故障排除,通过提供有关内部公共语言运行时(CLR)环境的信息,
.NET程序是基于.NET Framework、.NET Core、Mono、【.NET实现】开发和运行的 ,定义以上【.NET实现】的标准规范称为.NET Standard .NET Standard .NET标准是一组API集合,由上层三种【.NET实现】的Basic Class Library
长话短说 上个月公司上线了一个物联网数据科学项目,我主要负责前端接受物联网事件,并提供 参数下载。 webapp 部署在Azure云上,参数使用Azure SQL Server存储。 最近从灰度测试转向全量部署之后,日志时常收到: SQL Session超限报错。 排查 我在Azure上使用的是 S
临近年关,搜狗,360浏览器出现页面无法成功跳转,同域Cookie丢失? 也许是服务端 SameSite惹的祸。&#xA;本文揭示由于Chrome低版本内核不识别 SameSite= None, 引发的单点登录故障。
本文聊一聊TraceID的作用和一般组成,衍生出ASP. NETCore 单体和分布式程序中 TraceId 的使用方式
通过给 HttpClint请求的日志增加 TraceId,解锁自定义扩展 HttpClientFacroty 的姿势