我正在学习Java EE HttpSession(在Tomcat中)。它说当我们关闭浏览器时,cookie JSessionID=12345
将被销毁(但在服务器端,会话对象仍然保留,直到其生命周期结束)。
假设我们将会话寿命设置为一小时。有一种情况是用户重复以下操作:
访问servlet(此servlet调用getSession()
)
关闭浏览器(或清除Cookie)。
因此,这种重复将导致创建大量无用的会话对象,并且只有在它们的生命周期结束后才会被销毁。
在这种情况下,一些“黑客”将能够编写程序来利用我们的服务器(继续创建会话对象,直到我们用完RAM)。这种情况在真实环境中是否可行? Java EE是否做了什么来阻止这种情况?
答案 0 :(得分:1)
如果您有公共站点,则可能不需要会话,并且可以将Web应用程序配置为不创建它们。
如果您有一个需要登录的站点,则需要相应地计划:计划容量,仅为私有页创建会话,尽可能少地将对象放入会话,保持会话超时等等。
Java EE不提供对DDOS的开箱即用保护,就像Apache HTTP服务器无法防止每秒创建十亿个请求(并阻止其他用户访问该站点)的人一样,但建议的方法是能够最大限度地减少影响。
答案 1 :(得分:0)
是的,这绝对是一个真实的生活场景。我知道搜索引擎通过抓取网站来杀死网站的情况,因为他们为每个请求创建了一个新的庞大会话。
我想只有两种方法可以解决这个问题:
我通常更喜欢后者。恕我直言,很少有你需要在会话中存储大型对象的情况。
这也是迈克尔·T·尼加德(Michael T. Nygard)在Release it等书中所依据的(顺便说一下这本书非常好)。