【问题标题】:Handling the browser 'Back' button in jsp处理jsp中的浏览器“返回”按钮
【发布时间】:2010-07-27 08:25:10
【问题描述】:

我有一个jsp搜索页面(Search.jsp)和一个结果页面(Result.jsp),两者都可以选择搜索条件。然后将参数传递给 java 控制器文件 (Controller.java) 以构建查询字符串并执行查询搜索。查询字符串和搜索结果将传递给 Result.jsp 进行显示。

目前我使用 servletContext 来记住处理后的查询字符串,如果用户使用 Result.jsp 选择搜索条件,Controller.java 会将这些条件附加到现有的查询字符串中。如果我使用 Result.jsp 进行一些搜索。例如,查询字符串将在 Result.jsp 页面上显示 ((Query1) AND Query2) AND Query3。然后使用浏览器的返回按钮返回上一个显示页面。对于同一示例,查询字符串显示(Query1) AND Query2。然后,如果我再次搜索。将使用查询字符串(((Query1) AND Query2) AND Query3) AND Query4。我知道这是我当前的实现所期望的,因为 Result.jsp 不会对已处理的查询字符串进行任何修改。

但是,我想当用户使用浏览器的返回按钮时,例如查询字符串在页面上显示为(Query1) AND Query2,并执行搜索,查询字符串应该是((Query1) AND Query2) AND Query4,其中查询字符串是基于构建的在 Result.jsp 页面上当前显示的查询字符串加上当前选择。我怎样才能做到这一点?这听起来很简单,但我尝试了几种使用 Result.jsp 更新查询字符串的方法,但仍然无法正确处理。因此我想知道我使用<c:set> 的方法可能是错误的。我想听听你的建议。提前致谢。

【问题讨论】:

    标签: java jsp search servlets


    【解决方案1】:

    目前我使用 servletContext 来记住处理后的查询字符串

    您是否意识到ServletContext 在访问您的网络应用程序的所有 用户/会话之间共享?一旦访问者 X 对其进行了修改,这些更改就会反映给所有其他访问者。您不想将其存储在HttpSession 中以保持数据访问者的特定性吗?

    另见:


    我想使用返回按钮出于某种原因

    我真的很难理解您的功能需求(一些原因部分)。但至少,由于您希望后退按钮正常工作,因此您希望在此处使用幂等请求。因此,在适用的情况下,将 POST 替换为 GET。

    当您想在服务器上重新触发一个真正的 HTTP 请求而不是从浏览器的缓存中加载页面时,您希望通过在响应中添加以下标头来指示浏览器不缓存页面:

    response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
    response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
    response.setDateHeader("Expires", 0); // Proxies.
    

    您可以在您的控制器或覆盖url-pattern 感兴趣的Filter 中执行此操作。

    另见:

    【讨论】:

    • 嗨,巴鲁斯,谢谢!你给我的总是比我要求的多。非常感谢您纠正使用 ServletContext 的隐藏错误!那我需要做更多的阅读。关于 GET 和 POST,我认为 POST 只是为了允许将更多参数传递给 servlet。就我而言,查询字符串可能很长,因此它可能超过 GET 的最大长度。与幂等关注相比,我认为超过 GET 最大长度更为严重。那时我可能仍然坚持 POST。你怎么看?
    • 如果您坚持使用 POST,您将无法在返回浏览器历史记录时重新触发请求,而不会向最终用户发出安全警告(例如“您确定要重新发送数据吗?”确认或可能出现“页面已过期”错误)。我只是将搜索字符串长度限制为 2K 个字符。这已经差不多了。 Google 也只使用 GET。
    猜你喜欢
    • 2014-10-26
    • 2011-07-11
    • 1970-01-01
    • 2017-12-26
    • 2012-05-22
    • 2013-01-10
    • 2023-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多