当JSF(Richfaces)提交后按下后退按钮时,网页已过期

时间:2010-07-05 12:20:53

标签: java jsf button richfaces

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

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

item a
item b
item c
item d
item e

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

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

item c

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

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

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

1 个答案:

答案 0 :(得分:3)

  

网页已过期

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

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

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

相关问题