11

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

我现在能想到的有这些:

  1. 请求参数

  2. 饼干

  3. 表单方法(Get 和 Post)

  4. Viewstate(我猜只有 ASP.NET)

  5. 会话(InProc Web 服务器)

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

  7. 会话(数据库)

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

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

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

我想知道的是您通常使用哪些方法,并且会推荐或更有趣的是您希望在某些情况下避免使用哪些方法,为什么?

4

8 回答 8

12

虽然这是一个非常复杂的问题要回答,但在考虑实现状态时,我会考虑一些简单的事情。

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

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

于 2008-09-18T19:09:31.583 回答
3

安全也是一个问题;用户可以轻松更改查询字符串或表单字段中的值。用户身份验证应保存在加密或防篡改 cookie 或服务器端会话中。当用户完成一个过程(例如站点注册)时,跟踪表单中传递的值,这可能可以保存在隐藏的表单字段中。

不过,关于查询字符串的好处(有时也很危险)是,任何单击链接的人都可以获取该状态。如上所述,如果它给用户一些他们不应该拥有的授权,这是很危险的。不过,它可以向您的朋友展示您在网站上找到的东西。

于 2008-09-18T19:14:34.707 回答
2

随着越来越多地使用 Web 2.0,我认为您的列表中缺少两个重要的方法:

8 AJAX 应用程序 - 由于页面不会重新加载并且没有页面到页面导航,因此状态不是问题(但持久化用户数据必须使用异步 XML 调用)。

9 本地持久性 - 基于浏览器的应用程序可以使用 Google Gears 等库将其用户数据和状态持久化到本地硬盘驱动器。

至于哪个最好,我觉得各有千秋,但是Query String方式对于搜索引擎来说是有问题的。

于 2008-09-18T19:06:56.613 回答
1

就个人而言,由于我几乎所有的 Web 开发都是用 PHP 进行的,所以我使用 PHP 的会话处理程序。

以我的经验,会话是最灵活的:它们通常比数据库访问更快,并且它们生成的 cookie 在浏览器关闭时消失(默认情况下)。

于 2008-09-18T19:03:44.997 回答
1

如果您打算将您的网站托管在像 webhost4life 这样便宜且愉快的主机上,请避免使用 InProc。我已经了解到,由于他们的系统被过度订阅,他们非常频繁地回收应用程序,这会导致您的会话丢失。很烦人。

他们的建议是使用 StateServer 这很好,除非您必须序列化/反序列化会话 eash 回发。我喜欢对象,我的网络应用程序充满了它们。我担心切换到 StateServer 时的性能。我需要重构以仅将我真正需要的东西放入会话中。

希望我在开始之前就知道...

干杯,罗布。

于 2008-09-18T19:16:55.950 回答
1

请注意您存储客户端的状态(查询字符串、表单字段、cookie)。任何与安全相关的东西都不应该存储在客户端,除非是会话标识符,如果它被合理地模糊且难以猜测的话。有太多的网站具有像“authenticated=true”这样的设置,并将这些设置存储在 cookie 或查询字符串或隐藏表单字段中。用户绕过类似的东西是微不足道的。请记住,来自客户端的任何输入都可能被篡改并且不应被信任。

于 2008-09-18T19:39:30.357 回答
1

当您需要获取数据时,已签名的 Cookie会链接到某种数据库存储。如果您有连接的后端,则没有理由在客户端存储数据;如果这是一个面向公众的网站,您只是在找麻烦。

于 2008-09-18T20:01:29.617 回答
0

这不是使用什么和避免什么的问题,而是什么时候使用哪个。每个人在最好的情况下都有特定的情况,在最坏的情况下也有不同的情况。

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

于 2008-09-18T19:09:34.967 回答