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

这些是我现在能想到的:

  1. 请求参数

  2. 饼干

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

  4. Viewstate(我猜仅限 ASP.NET)

  5. 会话(InProc Web 服务器)

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

  7. 会话(数据库)

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

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

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

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

有帮助吗?

解决方案

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

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

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

其他提示

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

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

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

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

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

至于哪一种最好,我认为它们都有自己的位置,但是查询字符串方法对于搜索引擎来说是有问题的。

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

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

如果您计划将网站托管在像 webhost4life 这样便宜又愉快的主机上,请避免使用 InProc。我经历了惨痛的教训,因为他们的系统被超额订阅,他们回收了应用程序 非常 频繁,这会导致您的会话丢失。很烦人。

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

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

干杯,罗布。

请注意客户端存储的状态(查询字符串、表单字段、cookie)。任何与安全相关的内容都不应该存储在客户端,除非会话标识符被相当模糊且难以猜测。有太多网站具有“authenticated=true”等设置,并将这些设置存储在 cookie 或查询字符串或隐藏表单字段中。对于用户来说绕过这样的事情是微不足道的。请记住,来自客户端的任何输入都可能被篡改,因此不应被信任。

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top