在Web开发中有多种方法可以维护用户状态。
这些是我现在能想到的:
查询字符串
缓存
表格方法(获取和发布)
Viewstate(我猜的只是ASP.NET)
会话(InProc Web服务器)
会话(专用网络服务器)
会话(数据库)
本地持久性(Google Gears)(感谢Steve Moyer) 等
我知道每种方法都有自己的优点和缺点,比如cookie不安全,QueryString有长度限制,看起来很难看! ;)
但是,在设计Web应用程序时,我总是对使用什么方法来应用什么方法或避免使用哪种方法感到困惑。
我想知道的是,您通常使用哪种方法,并建议或更有趣的是,您希望在某些情况下避免使用哪些方法以及为什么?
答案 0 :(得分:12)
虽然这是一个非常复杂的问题,但在考虑实施州时,我会考虑一些快速的问题。
所以我想我无法想象除了最微不足道的原因之外不想使用基于会话的状态。
答案 1 :(得分:3)
安全也是一个问题;用户可以轻松更改查询字符串或表单字段中的值。用户身份验证应保存在加密或防篡改cookie或服务器端会话中。跟踪在用户完成流程时传递的值,就像站点注册一样,可以保存在隐藏的表单字段中。
关于查询字符串的好处(有时是危险的)是任何点击链接的人都可以选择状态。如上所述,如果它给用户一些他们不应该拥有的授权,这是危险的。不过,向你的朋友展示你在网站上找到的东西真是太好了。
答案 2 :(得分:2)
随着Web 2.0的使用越来越多,我认为您的列表中缺少两种重要的方法:
8个AJAX应用程序 - 由于页面没有重新加载且页面无页面导航,因此状态不是问题(但持久化用户数据必须使用异步XML调用)。
9本地持久性 - 基于浏览器的应用程序可以使用Google Gears等库将其用户数据和状态保存到本地硬盘驱动器。
至于哪一个最好,我认为它们都有自己的位置,但查询字符串方法对于搜索引擎来说是个问题。
答案 3 :(得分:1)
就个人而言,由于我的几乎所有Web开发都是使用PHP,因此我使用PHP的会话处理程序。
根据我的经验,会话是最灵活的:它们通常比数据库访问更快,并且当浏览器关闭时(默认情况下)它们生成的cookie会死亡。
答案 4 :(得分:1)
如果您计划在像webhost4life这样廉价且开朗的主机上托管您的网站,请避免使用InProc。我已经学到了很难,因为他们的系统过度订阅,他们经常回收非常的应用程序,这会导致会话丢失。很烦人。
他们建议使用StateServer,除非你必须序列化/反序列化会话eash回发。我爱对象,我的网络应用程序充满了它们。切换到StateServer时我很关心性能。我需要重构才能把我真正需要的东西放在会话中。
希望在我开始之前我知道...
干杯,罗布。
答案 5 :(得分:1)
小心存储客户端的状态(查询字符串,表单字段,cookie)。任何与安全相关的东西都不应该存储在客户端,除非是会话标识符,如果它被合理地模糊并且难以猜测。有太多网站具有“authenticated = true”之类的设置,并将这些设置存储在cookie或查询字符串或隐藏表单字段中。用户绕过类似的东西是微不足道的。请记住,来自客户端的任何输入都可能已被篡改,不应被信任。
答案 6 :(得分:1)
Signed Cookies链接到某种数据库存储。如果你有一个连接的后端,没有理由在客户端存储数据;如果这是一个面向公众的网站,你只是在寻找麻烦。
答案 7 :(得分:0)
使用什么并不是什么问题。要避免什么,但何时使用哪个。每一种情况都是最好的情况,另一种情况则是最糟糕的情况。
决定因素通常是数据的生命周期。会话状态比表单字段更长,依此类推。