【问题标题】:Servlet control multiple requestServlet 控制多个请求
【发布时间】:2009-08-05 07:35:03
【问题描述】:

当我单击链接时,我会调用 servlet。 当我多次单击该链接时,servlet 会引发错误(错误详细信息并不重要) 尽管此修复程序还有其他解决方法(例如单击后禁用链接等) 我很好奇有没有办法通过请求/响应对象来控制这个。

【问题讨论】:

  • 我认为错误详细信息对于查看您要修复的内容很重要。您可以在会话中存储某种状态。

标签: java servlets


【解决方案1】:

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

【讨论】:

  • 错误是我用一些逻辑创建了一些大型对象。这在多用户环境中不会成为问题。但是当对同一用户进行并行请求时,就会导致此问题。
【解决方案2】:

servlet 错误的细节可能很有趣。 servlet API 通常不应该抛出错误,我猜这是某种应用程序错误。

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

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

2)。我们构建应用程序来防御无意的重复请求,例如通过在请求中包含某种标识符来允许发现重复。

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

【讨论】:

  • 更新 HttpResponseObject 时是否有任何内置方法可用,这个问题得到解决
  • 当用户点击提交时,浏览器正在发送请求对象,servlet 正在构建响应对象。浏览器确实“知道”第二次点击与第一次点击有任何关系,因此这两个请求没有任何关系——除非你用 Java Script 编写代码。除非您编写一些代码,否则接收请求的 servlet(甚至可以在不同的集群成员上运行)对先前的请求(HTTP 是无状态的)一无所知。 Strust 等框架确实具有解决该问题的功能。
  • 有道理。但我仍然在谷歌上寻找解决这个问题的方法
  • 我不建议使用 javascript 作为不向客户信用卡收取两次费用的故障保险...
  • 嗯,这就是为什么我们在答案中的第 2 项中有真正的防御。 java脚本只是为了友好。
【解决方案3】:

这个错误真的非常相关。

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

(比赛条件:http://en.wikipedia.org/wiki/Race_condition

【讨论】:

    【解决方案4】:

    进入 servlet 时在 servlet 会话范围内设置一个标志,并在离开时重置它。如果进入时设置了flag,则默默忽略。

    您需要在您的 servlet 中进行错误处理,以便 ServletException 不会留下标记集。

    【讨论】:

    • 从概念上讲,是的,但在处理集群实例时可能会很棘手。可能更容易使用数据库来跟踪最近的请求,即。在业务逻辑而不是在 servlet 级别监管重复请求。
    猜你喜欢
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    • 2015-12-20
    • 2015-07-13
    • 2014-08-28
    • 2018-04-18
    • 1970-01-01
    • 2015-01-13
    相关资源
    最近更新 更多