比较维持国家的方式

时间:2008-09-18 18:54:00

标签: state

在Web开发中有多种方法可以维护用户状态。

这些是我现在能想到的:

  1. 查询字符串

  2. 缓存

  3. 表格方法(获取和发布)

  4. Viewstate(我猜的只是ASP.NET)

  5. 会话(InProc Web服务器)

  6. 会话(专用网络服务器)

  7. 会话(数据库)

  8. 本地持久性(Google Gears)(感谢Steve Moyer) 等

  9. 我知道每种方法都有自己的优点和缺点,比如cookie不安全,QueryString有长度限制,看起来很难看! ;)

    但是,在设计Web应用程序时,我总是对使用什么方法来应用什么方法或避免使用哪种方法感到困惑。

    我想知道的是,您通常使用哪种方法,并建议或更有趣的是,您希望在某些情况下避免使用哪些方法以及为什么?

8 个答案:

答案 0 :(得分:12)

虽然这是一个非常复杂的问题,但在考虑实施州时,我会考虑一些快速的问题。

  • 查询字符串状态仅对最基本的任务有用 - 例如,维护用户在向导中的位置,或者提供在用户完成给定任务后将用户重定向到的路径(例如,登录)。否则,查询字符串状态非常不安全,难以实现,并且为了做到公正,它需要通过包含一个密钥将客户端绑定到该客户端的服务器维护状态来绑定到某些服务器端状态机。
  • Cookie状态或多或少相同 - 它比查询字符串状态更有趣。但它仍然完全维护在客户端,除非cookie中的数据是将客户端绑定到某个服务器端状态机的关键。
  • 表单方法状态再次类似 - 它隐藏了将给定表单绑定到后端的某些数据的字段(例如,“此用户正在编辑记录#512,因此表单将包含隐藏的输入值为512“)。它对其他许多东西没有用,而且只是查询字符串和cookie状态背后的同一个想法的另一个实现。
  • 会话状态(您描述的任何方式)都很棒,因为它们是无限可扩展的,可以处理您选择的编程语言可以处理的任何内容。第一个需要注意的是,客户端需要有一个密钥才能将客户端与存储在服务器上的状态联系起来;这是大多数Web框架向客户端提供基于cookie或基于字符串查询的密钥的地方。 (几乎每个现代人都使用cookie,但如果没有启用cookie,则会回到查询字符串上。)第二个警告是,你需要把一些内容放到你存储状态的方式中...你会把它放在一个数据库?您的Web框架是否完全为您处理?同样,大多数现代Web框架都需要完成这项工作,而且对于我来说,实现我自己的状态机,我需要一个非常的理由......否则,我很可能会创建安全性随着时间的推移,在任何成熟的框架中都会出现漏洞和功能破坏。

所以我想我无法想象除了最微不足道的原因之外不想使用基于会话的状态。

答案 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)

使用什么并不是什么问题。要避免什么,但何时使用哪个。每一种情况都是最好的情况,另一种情况则是最糟糕的情况。

决定因素通常是数据的生命周期。会话状态比表单字段更长,依此类推。