【问题标题】:Best practice: How to handle concurrency of browser and website navigation最佳实践:如何处理浏览器和网站导航的并发性
【发布时间】:2010-09-09 19:26:37
【问题描述】:

对于每个 Web 开发人员来说,这是一个众所周知的问题。至于我试图找到解决这个问题的好方法 - 没有(或者至少我找不到)。

假设如下:

用户的行为不符合预期。 我正在从事的实际项目使用 Web 门户中的导航。但如果用户使用浏览器的后退按钮,整个事情就会变得危险[?],结果并不总是可以预测的。

我们使用了 struts 框架并将后退 url 存储到表单中——在某些地方,我们需要后退 url——这已从表单的后退 url 中呈现出来。因为该信息只有一个字段,因此不可能返回多个步骤。

当您更改“struts-flow”时 - 这可能会导致使用不同的表单 - 此信息将丢失。

如果用户胆敢在您的 web 应用中的某处放置 书签 - 此信息可能永远不会被设置,结果将再次变得不可预测或不够灵活!

我的“解决方案”

我将用户访问的每个导航相关页面存储到 类似堆栈的存储到 会话中。这意味着收集并存储导航路径以供以后导航。

在 web 应用程序中涉及反向导航的任何页面上,我使用了一个自制标签,它将堆栈内容呈现到 url。

就是这样。 当点击这个后退 url 时,堆栈已经被用户点击的后退 url 中的内容填充(一旦返回链接被渲染,它保存了堆栈中的所有信息)。

这很清楚,因为点击链接是一个清晰的状态,Web 开发人员确切地知道此时用户“在”哪里 - 绝对独立于用户之前所做的任何事情(例如点击浏览器多次返回按钮)。然后导航堆栈建立在这个新状态之上。

简历: 很明显,这不是最好的解决方案。但它允许在堆栈上存储额外的信息,如页面参数和其他一些有用的东西(可能的进一步开发)。

那么,您对此问题的解决方案是什么?

干杯,

法力

【问题讨论】:

    标签: browser navigation struts


    【解决方案1】:

    堆栈解决方案听起来很有趣,但如果用户选择在不同选项卡上“并行”导航或使用书签,它可能会中断。

    恐怕我真的不明白为什么您必须为每个用户保留所有这些状态:理想情况下,网络应该遵循 REST principle 并且完全无状态。因此,单个 URL 应该标识单个资源,而不必保留每个用户的导航历史记录。

    如果您的 Web 应用程序严重依赖 AJAX,您可以尝试实现类似 GMail(诚然,这并不容易......),其中界面中的每个更改都会反映在页面 URL 的更改中。因此,每个页面都由当前 URL 标识,用户可以同时导航或像往常一样使用后退按钮。

    【讨论】: