在jsp中处理浏览器的“后退”按钮

我有一个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不会对已处理的查询字符串进行任何修改。

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

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

您是否意识到ServletContext是在访问您的Web应用程序的所有用户/会话之间共享的? 一旦访问者X修改了它,就会反映所有其他访问者的更改。 您是否更愿意将其存储在HttpSession以保持数据访问者特定?

也可以看看:

  • Servlet生命周期和multithreading

我想出于某种原因使用后退按钮

我真的很难理解你的function需求( 某些原因部分)。 但至少,既然你想让后退按钮正常工作,那么你想在这里使用幂等请求。 因此,在适用的情况下,用GET替换POST。

无论何时您希望在服务器上重新发送真实的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. 

你可以在你的控制器或一些Filter覆盖感兴趣的url-pattern

也可以看看:

  • 确保未在所有浏览器中缓存网页
  • Webbrowser缓存教程