[英]How to tackle this session problem in ASP.NET,VB.NET?
如何在ASP.NET,VB.NET中解决这个会话问题?
有以下要求:
当授权用户登录系统时,不允许用户从另一台计算机或其他浏览器登录,而该用户此时正在使用该浏览器。
我们应用的补救措施是:我们将“Is_Loggedin”保留为mst_vendor中数据类型为“bit”的列作为表名。 当用户登录时,我们将标志Is_Loggedin设置为“1”,并且每当有人尝试使用此帐户登录时,系统显示错误“用户已登录。”。
当用户注销时,一旦用户单击注销按钮,注销过程就会调用“0”。
问题场景:
当用户关闭浏览器时,标志保持不变,即“1”。
电源关闭时,它仍然与“1”相同。
如果会话在预定义值之后超时,则它保持不变。
除此之外可能有不同的场景。
有没有办法让我们可以使用应用程序对象为用户的登录状态存储此内部标记?
它可以提高系统的效率并且还消除了上述有问题的情况。
您应该使用Global.asax
文件并使用Session_End
函数。
Session_End: 当用户的会话超时,结束或离开应用程序网站时触发 。
将日期时间存储为该位旁边的另一列,并在每次用户请求页面时更新它。
当新用户使用相同的凭据并且位为“1”时,您可以检查日期时间,如果是一段时间之前,您可以确定用户不再存在。 所以让登录继续。
您可以在脚本中保持脉冲,当脉冲超时时,请考虑用户完成该会话。
这样做的好处是,您可以区分用户在网站上闲置和离开网站的用户之间的区别。
是的,脚本是个好主意。 只需将会话超时设置为5分钟而不是20分钟,然后将方法写入global.asax
文件中的session.end
,该文件相应地更新数据库。
从最顶层的视图,您可以做到这一点
使用带有SlidingExpiration的缓存。
每次用户尝试登录时,请以用户名作为密钥检查缓存。 如果缓存中存在条目,则可以说该用户已登录并拒绝登录。
如果未找到密钥,则允许登录并在缓存中创建新密钥作为用户名并设置滑动到期时间。 (这应该仔细选择,因为这将是持续时间,用户在浏览器关闭并且用户尝试重新登录后不会被锁定。)
在Global中的Application_PreRequestHandlerExecute处理程序中,检查用户当前是否处于活动状态(您可以使用会话),重置用户的滑动到期时间。 这样,对于每个页面请求,将重置缓存到期时间。
如果用户关闭浏览器并离开,则缓存将在设置的时间段后过期,并将释放用户再次登录。
如果用户在缓存过期之前尝试再次登录,则用户必须等待一段时间才能使缓存过期。
如果用户正确注销,则可以删除注销事件上的缓存条目,以便用户不必等待重新登录。
Sliding到期超时可以与会话超时同步,以模拟应用程序的实际会话超时。
使用这种方法,您还可以节省大量数据库往返以更新/检查用户状态,无论托管环境或会话模式如何,这都可以。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.