问题描述:更新数据库里用户表中登陆状态字段出现问题。我现在是用Session["userId"]来保存登陆用户的ID号。用户点击退出按钮后更新登陆字段(1为登陆;0为非登陆)。但Session有超时问题,我不可能让Session不超时。一旦Session超时,用户的登陆状态在用户表里就无法更改,因为Session["userId"]里没有先前登陆用户的ID号了。
请教怎么解决这个问题。

解决方案 »

  1.   

    如果是统计在线人数,应该用APPLICATION,不需要写数据库.因为一旦IIS重启,在线人数就清空了,数据库里记录的都是垃圾信息.APPLICATION刚好能满足你的需求.
    如果是为了一个帐号同时只有一个人在用.就用后者踢前者的方式.用户登陆以后,在数据库里记录登陆状态和一个身份票.(SESSIONID就可以),用户每次操作都用身份票来验证,后面的用户登陆的时候更新了身份票,前面用户的身份票就失效了.后面的用户就成了合法用户.
      

  2.   


    1. Google一下单点登陆
    2. 2楼的第二种方法是比较通用的做法
      

  3.   

    Session集合中的数据不但会“超时”,而且会提前“丢失”。超时了本来就应该判定为离线,实际上判断用户登录与否应该在20秒到一分钟只能判断出来,而不能等待用于已经关闭浏览器或者切换到其它网站你超过20分钟之后才反应出来。关于Session在管理比较严格的web服务器上会自动“丢失”信息的解释太多太多了,懒得重复了。主要是两种办法:如果你拥有web服务器,启用状态服务器而不是继续使用InProc方式管理应用程序状态;如果你不肯定拥有web服务器,那么应该提早放弃使用Session集合,你的程序中的状态数据使用自定义的会话数据库,例如使用Linq to XML将数据保存在服务器磁盘文件中(以SessionID作为文件名),这样即使服务器重新开机启动客户端也感觉不到异常,因此没有“丢失”的困扰。关于迅速感应用户登录、离线状态,也可以google到很多资料。关键是知道需要满足什么样的测试条件的答案,剔除错误的方案。
      

  4.   

    状态服务器能解决session丢失的问题,但是带来新的问题...
    太....慢.....
      

  5.   

    ...............
    最通俗的讲发:
    用户A登陆.假设sessionid为12345,12345就是钥匙.记录到数据库.用户A以后每个操作,都去匹配一下看钥匙对得上不.
    用户B于用户A以后登陆,假设sessionid为12346,12346记录到数据,那么用户A的要是就失效了.用户B就取代了用户A成为了唯一的合法用户.用户A就被踢掉了...
    以前前程无忧就是这么做的.
      

  6.   


    任何保存在进程以外的数据都应该同时保存在Cache中。读取数据也是首先读取Cache,当发现数据已经丢失时才读取外存的。
      

  7.   

    另外我有一点看错了,我以为楼主是要在后台统一管理用户登录。原来不是!楼主只是要在用户正常访问自己打开的网页时知道用户自己是否自己登录,那么我关于“20秒钟到1分钟”的那句话很抱歉就跟楼主这个问题无关了。Session会随时“丢失”。当在自己的机器上测试程序时感觉不出来,租一个网上空间测试一下程序就知道了,很多空间下平均10分钟多一点就会“丢失”,这还是只有2、3个人同时访问的情况。因此,要首先解决这个问题。在用户访问网页时,通常服务器即使重新开机,用户也感觉不出来,因为SessioID编号是保存在cookie中的。但是如果你的程序依赖于Session集合保存数据,或者使用Application集合、Cache集合,就应该知道数据时随时丢失的。使用Cache本来就是缓存,随时丢失数据是正常的,因此Cache可以继续使用。而Session集合和Application集合等就应该慎重使用,最好使用状态服务器来改变策略,或者干脆Session集合自己使用cookie或者后台程序管理会话数据。
      

  8.   

    干脆Session集合自己使用cookie或者后台程序管理会话数据  -->  干脆放弃Session集合自己使用cookie或者后台程序管理会话数据