【问题标题】:Webapp: When user submits a second request before the 1st one is "finished" the browser shows the output of the first req. why?Webapp:当用户在第一个请求“完成”之前提交第二个请求时,浏览器会显示第一个请求的输出。为什么?
【发布时间】:2012-06-07 07:26:33
【问题描述】:

总结

在我们的 Web 应用程序中,当用户点击“比加载页面更快”时,显然浏览器向用户显示了第一个请求(根据我们得到的一些错误消息)。我本来希望这是第二个请求。

更多背景资料

我们有一个 Struts1 Web 应用程序。在用户会话中,我们放置了用户交互的当前上下文。

request.getSession().setAttribute("context", <something>);

例如,应用程序显示主记录列表,上下文包含有关用户的信息。当用户单击主记录时,我们将有关该记录的信息保存在用户会话对象中。在 JSP 中,我们经常将上下文对象分配给一个局部变量。这需要转换为特定类型(例如MasterRecordDTOUserDTO):

<% MasterRecordDTO dto = (MasterRecordDTO) request.getSession().getAttribute("context"); %>

然后,用户可以深入了解该主记录的详细信息视图。我们有一个面包屑显示像list &gt; master &gt; detail 这样的东西。这些是链接,因此用户可以使用面包屑导航。

现在,在这种情况下,当用户首先单击“master”并足够快地单击“list”时,他会收到 ClassCastException 提示

"UserDTO cannot be cast to MasterRecordDTO" 

在MasterRecord-JSP中,这意味着当MasterRecord-JSP在第一个请求中分配dto变量时,第二个请求已经将context会话属性设置为UserDTO对象。

问题

我原以为浏览器会“放弃”第一个请求,并向用户显示第二个请求的结果(本例中的主记录列表)。谁能给我解释一下?

更新

面包屑链接位于另一个 HTML 框架中。我们在 Internet Explorer 7 中遇到了这个问题。我在 Firefox 11 上进行了尝试,但显然它甚至没有提交第二次点击。

【问题讨论】:

  • 我猜这是一般的并发编程情况。浏览器同时发送 2 个请求。 (1) 请求/线程 1 将 context 设置为 MasterRecordDTO (2) 请求/线程 2 更改为 UserDTO (3) 请求/线程 1 继续运行,并且出现了 ClassCastException。浏览器的行为不受您的应用程序控制,它只是显示响应 1 的结果。尝试使用请求范围来存储此类上下文。

标签: java internet-explorer jsp servlets browser


【解决方案1】:

我猜这是一般的并发编程情况。

浏览器同时向服务器发送2个请求,服务器使用2个线程处理2个请求。

  1. 请求/线程 1 将会话属性 context 设置为 MasterRecordDTO
  2. request/thread 2 然后将其更改为 UserDTO这是问题的根源
  3. 请求/线程1继续运行,会导致ClassCastException发生。
  4. request/thread 2 继续运行,它会对客户端产生一个成功的响应。 (但浏览器不显示)

浏览器的行为不受你的应用程序的控制,它只是显示响应1的结果(有时可能是响应2,这也是并发的情况,因为现在大多数浏览器都是多线程设计的)。

尝试使用请求范围来存储这样的context信息以获得预期的结果。

【讨论】:

  • LuiYan,感谢您花时间回答我的问题。我完全了解并发编程的情况。只是我希望浏览器显示第二次点击的结果。无论如何都会执行第一次单击的代码,但 ClassCastException 对用户不可见。
  • 我用 IE7 提示更新了问题,因为我无法使用 FF 11 重现该行为。
猜你喜欢
  • 1970-01-01
  • 2021-01-04
  • 1970-01-01
  • 1970-01-01
  • 2015-08-04
  • 1970-01-01
  • 2020-07-02
  • 1970-01-01
  • 2017-05-22
相关资源
最近更新 更多