java - 在jsp中处理浏览器 'Back'按钮

标签 java jsp search servlets

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

目前,我使用 servletContext 来记住处理后的查询字符串,如果用户使用 Result.jsp 选择搜索条件,Controller.java 会将此类条件附加到现有查询字符串中。如果我使用 Result.jsp 进行一些搜索。例如,查询字符串将显示 ((Query1) AND Query2) AND Query3在 Result.jsp 页面上。然后使用浏览器的后退按钮返回到上一个显示页面。对于同一示例,查询字符串显示 (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> 的方法是错的。我想听听你的建议。提前致谢。

最佳答案

Currently I use servletContext to remember the processed query string

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

另请参阅:


I want to use back button for some reason

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

每当您想要在服务器上重新触发真正的 HTTP 请求而不是从浏览器缓存加载页面时,您都需要通过向响应添加以下 header 来指示浏览器不缓存页面:

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.

您可以在 Controller 或某些覆盖感兴趣的url-patternFilter中执行此操作。

另请参阅:

关于java - 在jsp中处理浏览器 'Back'按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3341824/

相关文章:

使用 command-T 搜索

java - 测试网络应用程序

php - Sphider 搜索引擎出现 "URLs must include"问题

search - Google 或其他搜索引擎(机器人)可以扫描 SSL/HTTPS 页面/网站吗?

java - 组件的定位(如何将几个按钮放置在屏幕中央相同大小)

javascript - 在 keypressup 事件中按下单个键时,textarea 打印两个字符

javascript - 从 Javascript 写入 HTML 文件

Java 通过 Socket 传输属性

java - 我如何表达同时应该是两个不同类的对象

java - ElasticSearch GetApi NoNodeAvailableException