Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.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
Java Servlet控制多个请求_Java_Servlets - Fatal编程技术网

Java Servlet控制多个请求

Java Servlet控制多个请求,java,servlets,Java,Servlets,当我点击一个链接时,我正在调用一个servlet。 当我多次单击该链接时,servlet抛出错误(错误详细信息不重要) 尽管此修复程序还有其他解决方法(如单击后禁用链接等) 我很好奇是否有任何方法可以通过请求/响应对象来控制这个问题。错误是相关的,对一个servlet的多个调用的行为不同于一个,这意味着您有线程安全问题,可能是由于您实现servlet的方式。servlet错误的详细信息可能很有趣。ServletAPI一般不应该抛出错误,我猜这是某种应用程序错误 我尝试应用的一般原则是: 1) 。

当我点击一个链接时,我正在调用一个servlet。 当我多次单击该链接时,servlet抛出错误(错误详细信息不重要) 尽管此修复程序还有其他解决方法(如单击后禁用链接等)
我很好奇是否有任何方法可以通过请求/响应对象来控制这个问题。

错误是相关的,对一个servlet的多个调用的行为不同于一个,这意味着您有线程安全问题,可能是由于您实现servlet的方式。

servlet错误的详细信息可能很有趣。ServletAPI一般不应该抛出错误,我猜这是某种应用程序错误

我尝试应用的一般原则是:

1) 。我们构建UI是为了让用户很难无意中提交两次相同的请求(例如,借记我的账户100英镑,真的不想发送两次这样的请求。这是一些nift javascript可以提供帮助的地方

2) 。我们构造应用程序来防御不谨慎的双重请求,例如,通过在请求上包含某种标识符,允许is发现重复的请求


我们不认为UI是完美的,我们的业务应用层对防止双重操作负有最终责任。

进入servlet时在servlet会话范围内设置一个标志,离开时将其重置。如果输入时设置了该标志,则默认忽略


您将需要在servlet中进行错误处理,以便ServletException不会保留标志集。

错误确实非常相关

您可能有线程安全问题,但也可能有“竞争条件”,即进程的结果取决于执行顺序,其中一个可能会给您一个错误


(竞赛条件:)

我认为错误详细信息对于查看您试图修复的内容很重要。您可能会在会话中存储某种状态。错误是正在使用某些逻辑创建一些大型对象。这在多用户环境中不会成为问题。当我们更新HttpResponseObject时,是否已经有任何内置方法可用?这个问题得到解决当用户点击submit时,浏览器正在发送请求对象,servlet正在构造响应对象。浏览器确实“知道”第二次点击与第一次点击有任何关系,因此这两个请求没有关系——除非用Java脚本编写代码。接收请求的servlet(它甚至可以在不同的集群成员上运行)不能对之前的reuqest(HTTP是无状态的)做任何事情,除非您编写一些代码。像Strust这样的框架确实有解决这个问题的功能。但是我仍然在谷歌上寻找这个问题的解决方案。我不建议使用javascript作为故障保护,因为它不会向客户的信用卡收取两次费用……嗯,这就是为什么我们在答案的第2项中有真正的辩护理由。java脚本只是为了友好。从概念上讲,是的,但在处理集群实例时可能会很棘手。使用数据库来跟踪最近的请求可能更容易,即在业务逻辑中而不是在servlet级别执行重复请求。