我有一个javaserlvet,它访问hadoop集群并从hadoop集群发送一些数据的可下载csv作为响应。我的问题是,这个servlet似乎有多个get请求(据我所知,这是chrome+其他浏览器有意使用的),这导致多个连接打开到我的hadoop集群。我不想同时有多个请求。有没有办法拒绝来自同一来源的多个请求而只响应第一个请求?
7jmck4yq1#
我不清楚你声称这种行为是故意的依据是什么。你在评论中引用的另一个问题只是提出了同样的主张,没有引用任何来源。然而,最终,这可能无关紧要:如果行为是常见的,而不是与少量特定的bug示例相关联,那么不管怎样,您可能都需要处理它。也就是说,get请求原则上不应该改变服务器的状态(因此它们应该是幂等的)。这可以被看作是各种有趣和恼人行为的正当理由。但是,由于没有理由进行类似的复制或抢先post请求,因此我预计您可以通过禁用有关资源的get方法,并强制客户机为其发布请求来解决问题。我不认为客户端会发出重复的请求,除非用户明确指示(例如,通过双击链接/按钮)。另一方面,假设您的web应用程序正在执行会话跟踪(在大多数servlet容器中是默认启用的),您可以检测多个并发请求并处理它们。具体来说,您可以在开始处理此类请求时设置会话属性,完成时清除该属性,并让servlet测试该属性以确定如何处理每个请求。我在评论中建议您可以为重复的请求返回一个错误代码,确实可以,但是这种行为可能会让客户端感到意外,因为他们可能希望get请求是幂等的。作为替代方案,您可以考虑将重复请求上的服务推迟到计算完成,然后基于相同的计算结果为所有请求提供相同的响应。然而,据我所知,您不能简单地删除重复的请求。在ServletAPI的任何地方都没有这样做的机制。
1条答案
按热度按时间7jmck4yq1#
我不清楚你声称这种行为是故意的依据是什么。你在评论中引用的另一个问题只是提出了同样的主张,没有引用任何来源。然而,最终,这可能无关紧要:如果行为是常见的,而不是与少量特定的bug示例相关联,那么不管怎样,您可能都需要处理它。
也就是说,get请求原则上不应该改变服务器的状态(因此它们应该是幂等的)。这可以被看作是各种有趣和恼人行为的正当理由。但是,由于没有理由进行类似的复制或抢先post请求,因此我预计您可以通过禁用有关资源的get方法,并强制客户机为其发布请求来解决问题。我不认为客户端会发出重复的请求,除非用户明确指示(例如,通过双击链接/按钮)。
另一方面,假设您的web应用程序正在执行会话跟踪(在大多数servlet容器中是默认启用的),您可以检测多个并发请求并处理它们。具体来说,您可以在开始处理此类请求时设置会话属性,完成时清除该属性,并让servlet测试该属性以确定如何处理每个请求。
我在评论中建议您可以为重复的请求返回一个错误代码,确实可以,但是这种行为可能会让客户端感到意外,因为他们可能希望get请求是幂等的。作为替代方案,您可以考虑将重复请求上的服务推迟到计算完成,然后基于相同的计算结果为所有请求提供相同的响应。
然而,据我所知,您不能简单地删除重复的请求。在ServletAPI的任何地方都没有这样做的机制。