使用Sessions是不好的事情,它有什么不对吗?

时间:2010-05-07 22:52:19

标签: asp.net session

我知道在社区服务器<sessionState mode="Off" />这意味着你不能使用Sessions,几年前我记得我在一个不允许使用会话的网站上工作。
在我的观点中,如果我们管理如何使用正确的方法,会话是一个非常有用的工具,但是在网站中使用会话变量是不好的,当它不好时,什么时候不是?

更新
我们可以用什么来避免混乱?

7 个答案:

答案 0 :(得分:8)

会话本身本身。但他们也不应该被滥用。你必须特别避免“哦,我需要这里和这里的这些信息,让我们将它存储在会话中并在以后重复使用”。

会话被用作全局无组织存储 - 而不是进行适当的OO设计,其中信息在参数中正确传递,这会导致潜在的混乱。

这种全球状态也阻碍了可测试性。一个大的无组织会话也会导致内存使用量增加。例如,会话状态的替代方案可以是视图状态。

(我不知道你是否谈论会话状态,或会话的整个概念。如果是后者,我的回答并不合适)

答案 1 :(得分:2)

会话过期它是不稳定的,所以它可能会发生会话超时,所以这是一个减去

答案 2 :(得分:2)

您不希望在生产环境中使用Sessions的一个主要原因是SessionID是通过cookie传递的(至少在JSP中)。并且,您不能保证您的客户端会一直打开cookie。因此,即使您使用Session,也建议您实现URL重写。因此,Container将在第一个请求时使用Session和URL Rewriting(以确定是否启用了cookie)。并且,如果客户端接受cookie,它将使用会话。否则,它将转向URL重写。

请注意,使用网址重写时,您必须确保响应具有已编码的网址。此外,如果您使用的是Session,则必须考虑同一系统上多个浏览器的会话跟踪等奇怪事件。

答案 3 :(得分:2)

有时会话状态现有会导致性能下降。说真的,在那里放一个布尔值可以在某些情况下杀死你的表现。这是一个具体的例子:

你有一个仪表板页面,它有几个小模块,每个模块都通过ajax加载它们的内容。如果您正在使用会话,则一次只能加载一个模块,因为会话在请求期间被锁定(每个用户)。如果没有使用会话,则没有锁定,浏览器将能够请求最大数量的资源(同时为4个或更多)。

请参阅“并发请求和会话状态”:

http://msdn.microsoft.com/en-us/library/ms178581.aspx

如果遇到这种情况,要么不使用会话,要么将其设置为只读(上次我检查时,这很难在ASP.NET MVC中完成)。

更新:可能发生这种情况的另外两个真实场景:

  • 您有一个asp.net页面,可以将图像写入二进制响应。这样做是因为您需要检查权限或其他条件以确定是否以及要投放的图像。如果你的SRC中有一堆图像标签引用此页面来获取图像,那么你一次只能获得一个。
  • 您有一个管理控制台,可让您管理任务。您希望能够点击按钮并使用ajax进度条异步启动服务器上的任务。如果您的ajax在您有会话时调用请求asp页面(无论您是否参考),您将只能一次运行一个。我想这与仪表板示例类似,但实际上我碰到了这个,它杀了我。

答案 4 :(得分:1)

人们仍然害怕接受使用会话所需的cookie。此外,存在安全问题。

答案 5 :(得分:0)

您不希望使用会话来存储私人信息。排序人们如何尝试将密码直接存储到cookie中,这也是禁忌。

答案 6 :(得分:0)

这是一个有趣的问题,我同意如果没有正确使用Sessions可能会非常混乱。缓解它的一种方法是将一个完整的复杂对象(如购物车内容)存储在一个会话中,而不是让多个会话溢出同一个Web应用程序。如果让我们说断电,会话实际上可以存储在SQL Server数据库中。