无限的会话对象导致RAM已满

时间:2012-10-30 10:03:12

标签: java session java-ee tomcat

我正在学习Java EE HttpSession(在Tomcat中)。它说当我们关闭浏览器时,cookie JSessionID=12345将被销毁(但在服务器端,会话对象仍然保留,直到其生命周期结束)。

假设我们将会话寿命设置为一小时。有一种情况是用户重复以下操作:

  1. 访问servlet(此servlet调用getSession()

  2. 关闭浏览器(或清除Cookie)。

  3. 因此,这种重复将导致创建大量无用的会话对象,并且只有在它们的生命周期结束后才会被销毁。

    在这种情况下,一些“黑客”将能够编写程序来利用我们的服务器(继续创建会话对象,直到我们用完RAM)。这种情况在真实环境中是否可行? Java EE是否做了什么来阻止这种情况?

2 个答案:

答案 0 :(得分:1)

如果您有公共站点,则可能不需要会话,并且可以将Web应用程序配置为不创建它们。

如果您有一个需要登录的站点,则需要相应地计划:计划容量,仅为私有页创建会话,尽可能少地将对象放入会话,保持会话超时等等。

Java EE不提供对DDOS的开箱即用保护,就像Apache HTTP服务器无法防止每秒创建十亿个请求(并阻止其他用户访问该站点)的人一样,但建议的方法是能够最大限度地减少影响。

答案 1 :(得分:0)

是的,这绝对是一个真实的生活场景。我知道搜索引擎通过抓取网站来杀死网站的情况,因为他们为每个请求创建了一个新的庞大会话。

我想只有两种方法可以解决这个问题:

  • 保持会话生命周期尽可能短。
  • 禁止使用会话存储大型对象。

我通常更喜欢后者。恕我直言,很少有你需要在会​​话中存储大型对象的情况。

这也是迈克尔·T·尼加德(Michael T. Nygard)在Release it等书中所依据的(顺便说一下这本书非常好)。