这是一个初学者的问题......
在网站中,会话中应包含或不应包含哪些类型的数据?我知道我不应该包含任何需要保持安全的信息。我对编程最佳实践更感兴趣。例如,可以在会话中包括一些数据,否则这些数据将作为依赖注入从页面发送到页面。这对应于创建全局变量吗?
一般来说,哪种数据在会话表中有或没有位置?
谢谢,
JDelage
答案 0 :(得分:7)
在请求之间维护所需状态信息所需的最少信息量。
答案 1 :(得分:1)
通常,您可以在会话中放置任何您喜欢的内容。将信息放在必须存在的会话中以使页面运行时没有(技术)错误是不好的做法。
我建议尽可能减少会话中的数据量。
答案 2 :(得分:1)
您可以在会话中保存的内容,这样您就不必为不会改变的信息进行另一个数据库查询。比如他们的用户名,地址,电话号码,帐户余额,网站上的安全权限等。
答案 3 :(得分:1)
(这可能比您正在寻找的更多,但可能会提供更好的补充信息,以便添加到已发布的好答案中。)
由于您提到了最佳实践,因此您可能需要查看一些项目/技术,这些项目/技术可用于进一步了解会话状态。跨多个服务器横向扩展Web应用程序的一个常见缺陷是维护它们之间的会话状态。 (用户A登录到存储用户会话的服务器A,但是在下一个请求中命中服务器B,该服务器B不知道用户A的会话等。)
我总是对自己和同事说的一件事是,会话本身并不是存储数据的最佳位置,即使这些数据本质上是高度短暂的。 Web服务器是请求/响应系统,而不是数据存储。它非常适合前者,但对后者来说并不总是那么好。
因此,有一些方法可以将您的应用程序的会话数据(或任何有状态数据,实际上应该保持在Web服务器的RESTful无状态特性中的设计最小值)外部化到另一个系统。 Memcached是一个非常常见的工具。还有一些插入式会话替换(或各种框架/环境的可配置会话选项),它们将会话存储在SQL或MySQL等数据库中。
我最近一直在玩弄的一个想法是在NoSQL数据库中存储会话数据(以及可以在灾难中丢失它的任何瞬态数据)。 CouchDB和MongoDB是我目前的最佳选择,但其他选项并不缺乏。 CouchDB具有出色的水平扩展,MongoDB在完全在内存中运行时速度非常快。
至少在我看来,像这样的一个主要好处是部署很容易变成非事件。可以重新启动任何给定服务器上的Web服务,并重新初始化其中的应用程序,而不会丢失有状态数据。如果数据持久存储到磁盘(即,不完全在内存中运行),则甚至可以重新启动服务器而不会丢失它。服务器/服务可以进出服务器场,用户永远不会知道差异。
此外,外部化此数据允许您以可能有用的方式分析数据。查询它,在其上运行指标,通过其他Web应用程序或完全脱机工具等与它进行交互。随着项目复杂性的增加,它真正打开了选项。
(同样,这并不是真的想回答你的问题,而只是添加你可能觉得有用的信息。这是我和我的同事一直在修补的东西,你的问题似乎是一个好地方提到它。)
答案 4 :(得分:1)
您应该将会话视为一次写入,读取多个存储空间。但是一个相当不稳定的 - 例如如果所有会话突然消失,那么底层应用程序数据的状态应该是一致的(或可恢复的)。
这有一些例外(通常情况下,购物篮会存储在会话中 - 但您可能希望在结帐前对“预订”项目进行库存调整)。这里的项目可能会被多次添加/编辑/更改 - 因此它不是一次性写入 - 而是通过预先保留库存项目来保持数据库的可恢复性 - 但这意味着您应该撤消库存调整< em>会话到期时没有完成。
如果您开始尝试存储有关单个页面翻转的数据的信息,当用户开始单击前进/后退按钮或打开一个新窗口时,您很快就会遇到问题。