防止对java servlet的重复请求

时间:2017-03-20 20:33:17

标签: java hadoop servlets phoenix

我有一个java serlvet,它访问hadoop集群并从hadoop集群发送一些可下载的csv数据作为响应。

我的问题是,这个servlet似乎有多个GET请求(据我所知这是对chrome +其他浏览器的故意),这导致多个连接打开到我的Hadoop集群。我一次不想要多个请求。有没有办法拒绝来自同一来源的多个请求,只响应第一个请求?

1 个答案:

答案 0 :(得分:1)

我不清楚你声称行为是故意的依据是什么。您在评论中引用的另一个SO问题仅仅提出相同的主张,而没有引用它的任何来源。然而,最后,它可能并不重要:如果行为是常见的,而不是与您可以修复的少量特定错误实例相关联,那么您可能无论如何都需要处理它。

话虽如此,GET请求原则上不应该改变服务器的状态(并且它遵循它们应该是幂等的)。这可以作为各种有趣 - 和令人讨厌 - 行为的理由。但是,由于没有理由类似地制作重复或抢先的POST请求,我预计您可以通过禁用相关资源的GET方法来解决问题,并强制客户端改为POST请求。我不认为客户端会发出重复请求,除非用户明确指示(例如双击链接/按钮)。

另一方面,假设您的Web应用程序正在执行会话跟踪 - 默认情况下在大多数servlet容器中启用 - 您可以检测多个并发请求并处理它们。具体来说,您可以在开始处理此类请求时设置会话属性,在完成后清除它,并让servlet测试该属性以确定如何处理每个请求。

我在评论中建议您可能会返回重复请求的错误代码,实际上您可以,但这种行为可能会让客户感到惊讶,因为他们可能希望GET请求是幂等的。作为替代方案,您可以考虑在重复请求上推迟服务,直到计算完成,然后根据相同的计算结果为所有请求提供相同的响应。

据我所知,您不能简单地删除重复请求。 Servlet API中没有任何机制可以这样做。