gpt4 book ai didi

java - Web应用程序: When user submits a second request before the 1st one is "finished" the browser shows the output of the first req.为什么?

转载 作者:行者123 更新时间:2023-12-01 05:17:37 25 4
gpt4 key购买 nike

摘要

在我们的网络应用程序中,当用户单击的速度比页面加载的速度“快”时,显然浏览器会向用户显示第一个请求(根据我们收到的一些错误消息)。我本以为这是第二个请求。

更多背景信息

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

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

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

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

然后,用户可以深入查看该主记录的详细信息 View 。我们有一个面包屑显示诸如list>master>detail之类的内容。这些是链接,以便用户可以使用面包屑进行导航。

现在,当在这种情况下,用户首先单击“master”,然后足够快地单击“list”时,他会得到一个 ClassCastException 消息

"UserDTO cannot be cast to MasterRecordDTO" 

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

问题

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

更新

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

最佳答案

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

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

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

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

尝试使用请求范围来存储此类上下文信息以获得预期结果。

关于java - Web应用程序: When user submits a second request before the 1st one is "finished" the browser shows the output of the first req.为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10927424/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com