【问题标题】:webpage expired when back button pressed on JSF(Richfaces) submit在 JSF(Richfaces)提交上按下后退按钮时网页过期
【发布时间】:2010-07-05 12:20:53
【问题描述】:

我的标题可能令人困惑,所以请继续阅读。如果可以的话,我正在使用以下技术。 Spring、Hibernate、JSF (RichFaces)、MySQL、Internet Explorer。

我有一个显示在 RichFaces 数据表中的项目列表,如下所示:

项目a b项 c项 项目d 项目 e

在同一页面上,我有以下按钮:搜索、编辑、添加、删除新建

当用户输入搜索字符串时,例如“item c”,然后按搜索按钮,然后它会显示匹配项目的列表,例如:

c项

当用户按下 new 按钮时,请求将被重定向到另一个页面:

FacesContext facesContext = FacesContext.getCurrentInstance();
facesContext.getExternalContext().redirect(page + ".jsf" );

当在该页面上按下IE浏览器的返回按钮时,页面显示“网页已过期”。这是什么情况?如何避免?

【问题讨论】:

    标签: java jsf button richfaces


    【解决方案1】:

    网页已过期

    当您尝试从浏览器历史记录中获取非缓存 POST 请求时,您将收到此错误。这种行为是完全可以预料的。要解决此“问题”,您需要打开缓存或将 POST 替换为 GET。

    启用浏览器缓存实际上很简单:只需从相关 POST 请求的 HTTP 响应中删除 Cache-Control: no-cache 和相关标头即可。然后,最终用户只会收到一个警告对话框,表明 POST 数据将被重新发送到服务器,这在完全非幂等请求的情况下(例如下订单或删除项目)确实是不可取的。用 GET 替换 POST 是一个更好的解决方案。获取搜索结果(就像 Google 所做的那样)实际上应该由 GET 完成。

    在 2.0 版之前的 JSF 中,用 GET 替换 POST 并不容易。您可以做的最好的事情是在 POST 之后触发重定向并将感兴趣的数据作为请求参数传递,您从 #{param} 保留作为托管属性(更推荐)或将感兴趣的数据存储在会话范围内(不推荐)。一个完全不同的替代方法是用简单的 HTML <form action="searchresults.jsf"> 替换 JSF <h:form> 并在与 searchresults.jsf 关联的支持 bean 中的 @PostConstruct 方法中执行搜索作业,在提交的查询已收集为托管属性之后或来自请求参数映射。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-07
      • 2019-06-02
      • 1970-01-01
      • 1970-01-01
      • 2019-03-28
      • 2014-08-29
      • 2021-05-16
      相关资源
      最近更新 更多