none
如何访问所有用户的Session数据? RRS feed

  • 问题

  • 如题,我的需求是这样的:当后台管理员将前台的某用户禁用以后,该用户(在登录状态下)将不能继续做任何操作。

    我现在的系统设计是:仅仅在登录时会判断一下该用户的状态是否被禁用,如被禁用则不允许登录。登录成功以后的各种操作便不再判断了,所以在登录状态下,后台把用户禁用掉,只要用户不退出,他仍然能继续做任何操作。我的想法是,如果能取到所有的Session数据就好了,这样在禁用的时候,就把这个用户的会话数据失效掉,让他强制退出,但是该怎么拿到他的Session数据呢?我的Session数据是放到内存里的。

    多谢大家!
    2012年8月9日 4:15

答案

  • 绕了个大圈子。

    既然你获得了用户,你之前怎么设置的Session,现在就怎么获取,这个就没有什么可说的了。


    如果有帮助,标记为答复!Mark as Answer if answered!

    2012年8月9日 8:43
    版主

全部回复

  • 这就需要每次访问就进行状态检查,你可以在Application_BeginRequest方法里面进行(Global.asax.cs文件里),因为用户已经登录,你可以在Application_BeginRequest里面获取到用户信息,然后判断他的状态就可以了,不需要获取到所有Session。

    P.S. HttpSessionState本身实现了ICollection,要获取所有也很简单:)


    如果有帮助,标记为答复!Mark as Answer if answered!

    2012年8月9日 7:28
    版主
  • 我现在使用的是ASP.NET MVC框架,可以通过加入过滤器的方式来在每次执行请求之前做判断,但是目前还是想用失效会话数据的方式来处理这个问题,因为感觉使用过滤器的方式会带来一些系统开销,因为每一次请求都需要从数据库里读取客户的状态。可否详细介绍一下如何取得其他用户的session数据?我取得所有的session数据后,会根据里边存储的客户编号来找到指定客户的session数据,然后将它失效掉,这样应该可以解决我的问题。

    多谢。

    2012年8月9日 7:48
  • 好吧,你设置Session的时候是通过Session[key]=object来设置的,那么你看HttpSessionStateBase这个抽象类里有一个Keys属性,遍历整个Keys集合就可以获取到所有Session里保存的对象了。

    我不建议这么做,是因为如果用户量一大,每次都去遍历Session,还不如针对单个用户查询状态来得快,而且逻辑明了,数据也可以做缓存来解决压力问题。


    如果有帮助,标记为答复!Mark as Answer if answered!

    2012年8月9日 8:05
    版主
  • 好吧,你设置Session的时候是通过Session[key]=object来设置的,那么你看HttpSessionStateBase这个抽象类里有一个Keys属性,遍历整个Keys集合就可以获取到所有Session里保存的对象了。

    我不建议这么做,是因为如果用户量一大,每次都去遍历Session,还不如针对单个用户查询状态来得快,而且逻辑明了,数据也可以做缓存来解决压力问题。


    如果有帮助,标记为答复!Mark as Answer if answered!

    我是想取得所有用户的Session对象,不是当前Session的所有数据~~ ; )
    2012年8月9日 8:42
  • 绕了个大圈子。

    既然你获得了用户,你之前怎么设置的Session,现在就怎么获取,这个就没有什么可说的了。


    如果有帮助,标记为答复!Mark as Answer if answered!

    2012年8月9日 8:43
    版主
  • 你好!

    当用户通过登录验证后,将该用户的SessionID存入全局变量Application对象中,例如:

    Application.Set(Session.SessionID, strUserID);

    Application.Set(strUserID, Session.SessionID);

    然后在用户操作时,执行验证:

    Application.Get(strUserID)是否与Application.Get(Session.SessionID)一样

    当需要你禁止该用户任何操作时,可以执行

    oSessionID = Application.Get(strUserID);

    if(oSession == null)//该用户不在线

    {return;}

    Application.Remove(strUserID);

    Application.Remove(oSessionID.ToString());

    希望以上对你有所帮助.

    2012年8月9日 14:58
  • 补充一点

    当用户正常退出系统时,你必须执行环境变量的清理工作,即用户退出系统后,移除Application对象中存储的相应变量

    2012年8月9日 15:02