我们“做错了”吗?
我和一位同事正在使用 ASP.NET 页面来充当“门户”来查看 UniData 服务器上诊断程序的结果。尽管我们在工作中做了 ASP/ASP.NET 的零星工作,但它并不是我们的主要语言。
要访问此服务器,我们必须使用 UniObjects,这是一个用于验证和使用 UniData 服务器的 API。
我们需要每个访问该网站的用户都必须通过 UniData 进行身份验证并通过 UniObjects 库获取他们自己的会话,然后无需再次登录即可使用它(除非会话在“x”分钟内未使用)。
我们想出的方法如下:
我们有一个带有 Hashtable 的单例。它将 Windows 用户名与会话对象映射。
如果用户访问我们的页面并且 Hashtable 中不存在“用户名”,它会重定向到登录页面,在该页面中创建会话对象并在身份验证成功时将其添加到 Hashtable。否则,它会从 Hashtable 中获取用户现有的会话对象并将其用于请求(除非它已过期,在这种情况下我们将其删除并重定向到登录页面)。
每个会话对象(它是 UniObjects 中的东西的包装对象)都有一个“lastUsed”方法。我们需要清理用户的会话,因为我们对登录到 UniData 服务器的用户有许可证限制,所以每次用户被重定向到登录页面时,它都会检查是否在“x”分钟内没有使用任何会话,在这种情况下,它会关闭该会话并将其从哈希表中删除。它在这里完成,因此用户不会遇到与检查每个请求的所有会话相关的任何延迟,仅在登录时。
有些东西告诉我这个解决方案有异味,但我没有足够的 ASP.NET 经验来确定我们应该做什么?有没有更好的方法可以做到这一点,或者实际上可以吗?