【发布时间】:2012-06-07 07:26:33
【问题描述】:
总结
在我们的 Web 应用程序中,当用户点击“比加载页面更快”时,显然浏览器向用户显示了第一个请求(根据我们得到的一些错误消息)。我本来希望这是第二个请求。
更多背景资料
我们有一个 Struts1 Web 应用程序。在用户会话中,我们放置了用户交互的当前上下文。
request.getSession().setAttribute("context", <something>);
例如,应用程序显示主记录列表,上下文包含有关用户的信息。当用户单击主记录时,我们将有关该记录的信息保存在用户会话对象中。在 JSP 中,我们经常将上下文对象分配给一个局部变量。这需要转换为特定类型(例如MasterRecordDTO 或UserDTO):
<% MasterRecordDTO dto = (MasterRecordDTO) request.getSession().getAttribute("context"); %>
然后,用户可以深入了解该主记录的详细信息视图。我们有一个面包屑显示像list > master > 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