0

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

假设我们将会话生命周期设置为一小时。有一种场景是用户重复以下动作:

  1. 访问 servlet(并且这个 servlet 调用getSession()

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

所以这种重复会导致大量无用的会话对象被创建出来,只有在它们的生命周期结束后才会被销毁。

在这种情况下,一些“黑客”将能够编写一个程序来利用我们的服务器(继续创建会话对象,直到我们用完 RAM)。这种情况在真实环境中是否可行?Java EE 是否采取任何措施来防止这种情况发生?

4

2 回答 2

1

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

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

Java EE 不提供针对 DDOS 的开箱即用保护,就像 Apache HTTP 服务器不保护每秒创建十亿个请求的人(并阻止其他用户访问该站点)一样,但提出了能够尽量减少影响。

于 2012-10-30T11:09:51.390 回答
0

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

我想只有两种方法可以处理这个问题:

  • 保持会话生命周期尽可能短。
  • 防止使用会话来存储巨大的对象。

我一般更喜欢后一种。恕我直言,在极少数情况下您真的需要在会话中存储巨大的对象。

这也是您将在诸如Michael T. Nygard 的Release it(顺便说一句非常好书)之类的书中所依赖的内容。

于 2012-10-30T10:08:32.337 回答