如何解决ASP.NET,VB.NET中的会话问题?
有以下要求:
当授权用户登录系统时,不允许用户从另一台计算机或其他浏览器登录,而该用户此时正在使用该权限。
我们应用的补救措施是:我们将“Is_Loggedin”保留为mst_vendor中数据类型为“bit”的列作为表名。当用户登录时,我们将标志Is_Loggedin设置为“1”,每当有人尝试使用此帐户登录时,系统显示错误“用户已登录。”。
当用户注销时,一旦用户单击注销按钮,注销过程就会调用“0”。
问题场景:
当用户关闭浏览器时,标志保持不变,即“1”。
当电源关闭时,它仍然与“1”相同。
如果会话在预定义值之后超时,则保持不变。
除此之外,可能会有不同的情况。
有没有办法让我们可以使用应用程序对象为用户的登录状态存储此内部标记?
它可以提高系统的效率并且还消除了上述有问题的情况。
答案 0 :(得分:4)
您应该使用Global.asax
文件并使用Session_End
功能。
Session_End:Fired when a user's session times out, ends, or they leave the application Web site。
答案 1 :(得分:2)
将日期时间存储为该位旁边的另一列,并在每次用户请求页面时对其进行更新。
当新用户使用相同的凭据并且位为“1”时,您可以检查日期时间,如果是一段时间之前,您可以确定用户不再存在。所以让登录继续。
答案 2 :(得分:0)
您可以在脚本中保持脉冲,当脉冲超时时,请考虑用户完成该会话。
这样做的好处是,您可以区分在网站上闲置的用户与离开网站的用户之间的区别。
答案 3 :(得分:0)
是的,脚本是个好主意。只需将会话超时设置为5分钟而不是20分钟,然后将方法写入session.end
文件中的global.asax
文件中,相应地更新数据库。
答案 4 :(得分:0)
从顶级视图来看,这是您可以做的事情
使用带SlidingExpiration的缓存。
每次用户尝试登录时,请使用其用户名作为密钥检查缓存。如果缓存中存在条目,则可以说该用户已登录并拒绝登录。
如果未找到密钥,请允许登录并在缓存中创建新密钥作为用户名并设置滑动到期时间。 (这应该仔细选择,因为这将是持续时间,用户在浏览器关闭并且用户尝试重新登录后不会被锁定。)
在Global中的Application_PreRequestHandlerExecute处理程序中,检查用户当前是否处于活动状态(您可以使用会话),重置用户的滑动到期时间。这样,对于每个页面请求,将重置缓存过期时间。
如果用户关闭浏览器并离开,缓存将在设定的时间段后过期,并将释放用户再次登录。
如果用户在缓存过期之前尝试再次登录,则用户必须等待一段时间才能使缓存过期。
如果用户正确注销,您可以删除注销事件中的缓存条目,以便用户不必等待重新登录。
Sliding expiration timeout可以与会话超时同步,以模拟应用程序的实际会话超时。
使用这种方法,您还可以节省大量的数据库往返次数来更新/检查用户状态,无论托管环境或会话模式如何,这都可以。