Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
防止对Javaservlet的重复请求_Java_Hadoop_Servlets_Phoenix - Fatal编程技术网

防止对Javaservlet的重复请求

防止对Javaservlet的重复请求,java,hadoop,servlets,phoenix,Java,Hadoop,Servlets,Phoenix,我有一个java serlvet,它访问hadoop集群,并从hadoop集群发送一些数据的可下载csv作为响应 我的问题是,这个servlet似乎有多个GET请求(我理解这是chrome+其他浏览器故意使用的),这导致多个连接打开到我的Hadoop集群。我不希望同时有多个请求。有没有办法拒绝来自同一来源的多个请求而只响应第一个请求?我不清楚你声称该行为是故意的依据是什么。你在评论中引用的另一个问题只是提出了同样的主张,没有引用任何来源。然而,最终,这可能并不重要:如果行为是常见的,而不是与少量

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


我的问题是,这个servlet似乎有多个GET请求(我理解这是chrome+其他浏览器故意使用的),这导致多个连接打开到我的Hadoop集群。我不希望同时有多个请求。有没有办法拒绝来自同一来源的多个请求而只响应第一个请求?

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

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

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

我在评论中建议,对于重复的请求,您可能会返回一个错误代码,确实可以,但这种行为可能会让客户端感到惊讶,因为他们可能希望GET请求是幂等的。作为替代方案,可以考虑在重复请求上延迟服务,直到计算完成,然后基于相同的计算结果为所有请求提供相同的响应。
然而,据我所知,您不能简单地删除重复的请求。Servlet API中的任何地方都没有这样做的机制。

您可以在每个会话的基础上跟踪是否有正在进行的计算,并相应地修改您的响应。问题是,如果客户机发出第二个请求,那么它可能再也无法收到第一个请求的回复。如果它能做到,那么它将期望做到,所以您不应该试图忽略重复的请求。如果您不打算正常处理请求,则返回适当的HTTP状态代码,在本例中可能是409(“冲突”)。使用servlet筛选器阻止已建立会话的请求如何。更好地描述不需要的行为是值得的。除此之外,它是否只适用于获取请求?在这种情况下,你可以考虑让客户来代替。对于Web浏览器来说,没有理由地进行多个请求是不正常的。您的代码、web服务器配置有问题,或者用户实际上触发了两次请求。@根据这一点,某些web浏览器发送多个GET请求是正常的。这就是为什么更改应用程序状态是不好的。不过,这看起来确实很奇怪。我的服务器配置有什么问题,导致客户端发送多个请求?顺便说一句,我是用户,所以除非它发生在幕后,而且据我所知,我不会两次发送相同的请求。如果您可以发送回缓存响应,则无需删除请求。正如您所说的GET是幂等的,这只是一个设置可接受的缓存策略的问题users@Brad,OP假设拒绝重复的请求,尽管我想他实际上并没有说“放弃”。但无论如何,缓存不是问题所在,因为您只能缓存已经发出的响应。OP希望避免将资源同时用于计算对等效请求的响应(“我不希望同时有多个请求”),因此在他的情况下,没有(尚未)缓存。