java - 防止对 java servlet 的重复请求

标签 java hadoop servlets apache-phoenix

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

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

最佳答案

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

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

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

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

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

关于java - 防止对 java servlet 的重复请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42913442/

相关文章:

java - 获取 LiveData 的初始值总是返回 Null

java - TableView 的两个不同的行工厂

java - Beanstalk 502 错误网关 Spring 应用程序

hadoop - 根据我的映射器代码中的某些逻辑,将我的映射器中的一些数据(行)写入单独的目录

spring - 简单的JSp和servlet代码可以迁移到Spring框架吗?

java - 在 Java 中使用 toString() 进行单元测试

hadoop - 基于字段组合元组?

hadoop - Pig 集成Cassandra : simple distributed query takes a few minutes to complete. 这正常吗?

http - ServletResponse.reset() 是阻止未经授权(注销)用户访问 servlet 的可行方法吗?

http - 如何从 HttpServletRequest 获取请求 url