繁体   English   中英

在会话中存储用户信息?

[英]Store user information in session?

您是否应该存储有关每个请求所需用户的信息,例如: 角色,电子邮件,用户名等

在Session中,还是可以转发数据库每个请求这个信息?

谢谢

如果您没有计划负载平衡,那么会话状态是完全可以接受的。 如果会话状态配置为使用数据库持久性,请小心,因为这样您不仅会访问数据库,还会产生对象序列化的开销。

如果它是用户特定的数据,那么分布式哈希表缓存系统可能会起作用。 像Memcached这样的东西对此有好处,因为它们是内存缓存(性能),但是分布在多个服务器上(负载平衡),因此您可以充分利用这两个世界。

当然,如果它的数据定期更改,特别是如果您的其他系统可能在没有Web应用程序知道的情况下修改数据库,那么返回数据库可能是唯一的选择。

我更喜欢使用加密的cookie。 在繁忙的大型系统中,db调用可能会变得昂贵。 会话很好,但如果您的会话后端是数据库驱动的,那也会变得昂贵。 显然,使用cookie时,必须包含身份验证令牌检查。

这取决于你所说的“应该”。 我曾经使用过几个使用会话来缓存用户信息的应用程序。 该方法运行良好,减少了每个Web请求所需的数据库往返次数。

另一方面,它确实向您的Web服务器引入了状态,因此您必须坚持使用一个Web服务器,使用“病态会话”(这会使管理Web服务器更复杂)或者开始将会话信息存储在共享数据中商店(它消除了您在使用它时可能获得的任何性能提升)。

会话数据也可以存储在数据库中,如果您的站点在Web Garden og Farm中运行,这将非常有用。 如果会话正在运行InProc,则用户数据将保存在内存中,这会导致更快,但代价是可伸缩性。

另一种常见的方法是将其保存为ViewState,然后在每次回发时将其发送回客户端和服务器之间,这当然会导致带宽受限,但比InProc会话要好得多。

我个人更喜欢会话状态,如果网站很小我运行它InProc,如果/当网站增长,我可以改为使用数据库。

我将用户ID保留在Session中,并且我将许多应用程序中的活动用户记录保存在Cache中,但是我再次将所有下拉列表的内容保留在Cache中,并且我必须每次都提供一个用户下拉列表接着。

我有很多人惊呼“OMG你把它保存在Cache!?!?” 但实际上,它很有效。 更好的是,我在Cache中只有一个用户列表副本,而不是每个应用程序实例一个副本(100个并发用户意味着内存中可能有100个用户列表副本)。 一般情况下,我在Cache中放置任何不经常更改的内容,如果它确实发生更改,则将其强制退出Cache,因此它将在下次访问时重新加载。

这取决于您的网站/应用程序。 一般规则是这样的:

如果同时用户数量相当少且数据相对较小,则会话中的保存效果很好。

如果同时用户数量很高且数据大小相对较低,则保存在cookie中效果很好。 显然,cookie是公开可见的,因此如果它是敏感的,如电子邮件,则应加密。

如果数据大小很大, 保存在数据库中效果很好。

注意。 正如其他人所说,如果你使用网络农场,那么我会忘记保存在会话中。

Martin Fowler对“企业应用程序架构模式”中的选项有很好的描述,但我不确定他是否有在线内容。

如果站点/应用程序需要身份验证,则.Net具有良好的内置功能,用于存储用户角色和唯一用户名。 如果在身份验证期间保存此值,则可以通过User.IsInRole()和User.Identity.Name访问这些值。

存储在会话中会导致性能问题吗? 如果您的数据大小相对较小,如电子邮件,那么我会使用会话或cookie并避免使用数据库。 运行性能测试,看看哪种方式最适合您。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM