我的头衔可能令人困惑所以请继续阅读。如果可能的话,我正在使用以下技术。 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的浏览器后退按钮时,该页面显示“网页已过期”。这是什么以及如何避免这种情况?
答案 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
方法中执行搜索作业。已提交的查询已收集为托管属性或来自请求参数映射。