前几天,我在与一位同事讨论时,他出来说在Web应用程序中使用用户会话是错误的。我回答说,这可能是错误的,具体取决于您存储的信息,否则,为什么Microsoft甚至还要提供Web会话服务(我们正在谈论ASP.NET)。
他再次回答我,即使在MS中,他们也可以轻易地回答我这是糟糕的设计。并且他可以给我看一些白皮书来证明这一点。
不幸的是,我再也没有机会联系这个人了,但是我真的很想了解他的观点。有人在此有任何信息/观点吗?
前几天,我在与一位同事讨论时,他出来说在Web应用程序中使用用户会话是错误的。我回答说,这可能是错误的,具体取决于您存储的信息,否则,为什么Microsoft甚至还要提供Web会话服务(我们正在谈论ASP.NET)。
他再次回答我,即使在MS中,他们也可以轻易地回答我这是糟糕的设计。并且他可以给我看一些白皮书来证明这一点。
不幸的是,我再也没有机会联系这个人了,但是我真的很想了解他的观点。有人在此有任何信息/观点吗?
Answers:
我认为他的意思不是“不良设计”,而是“不良实践”。一般来说,Web应用程序应该尽可能地无状态。即使例如,您可能需要了解用户信息才能授权页面查看,但该信息仍可以cookie的形式保存在客户端计算机上,而服务器每次都仅验证用户信息。
那将是理想的,但是您不能总是指望客户端能够保存cookie。此外,它涉及以无状态方式验证用户,这可能涉及从数据库中查询简单页面请求的信息。通常,将此类信息保存在会话中通常更简单。
但是,一旦您跨过Rubicon,很多程序员就会很想不仅在会话中保存身份验证信息,而且还会保存许多其他内容。这是一种反模式,会使您的Web应用程序严重依赖状态,而这恰恰是应该首先避免的状态。
一些程序员会依靠Spring之类的技术(如果您使用的是Java)来解开本来会造成混乱的依赖关系,但是我认为这只会使创建依赖关系变得容易,而不是消除依赖关系。这样的技术应该有助于您的开发,而不是使反模式成为一个问题。
因此,一个好的经验法则是,如果您可以将其写为无状态,那么这样做可能是一个更好的主意,否则您可能会陷入这种陷阱。显然,您将遇到需要这样做的情况,但是一般而言,您应该只保存否则将难以重新获取的信息。
but you can't always count on the client being able to save cookies
然后是AFAIK,您也不能指望会话。Cookie是否不用于标识哪个会话属于哪个用户,或者是否存在其他方法,而这仅仅是最常见的方法吗?
我认为您混淆了两个不同的主题:1)会话和2)asp.net Webforms的页面模型
Web会话对于验证用户是必需的。理想情况下,仅应将会话用于此目的。您不应该在会话中存储用户数据(无论是在服务器上,在cookie中还是在asp.net/webforms上:在页面本身内)。没有人可以说网络会话不好,而是存储用户数据在一个会话中是一个坏习惯。不将用户数据存储在服务器上的原因包括避免全局变量的相同原因。将用户数据存储在Cookie或页面中会带来安全问题。使用asp.net的页面模型也不符合Web的无状态本质。您可以进行搜索,以了解更多有关Webforms为什么是不良设计的信息。另一方面,会话是Web应用程序的必要部分。