2010-07-05 80 views
0

我的标题可能令人困惑,请继续阅读。如果可以的话,我正在使用以下技术。 Spring,Hibernate,JSF(RichFaces),MySQL,Internet Explorer。当JSF(Richfaces)按下后退按钮时,网页过期提交

我有显示在RichFaces的项目列表数据表像这样:

 
item a 
item b 
item c 
item d 
item e 

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

当用户输入搜索字符串,例如“项目C”,按搜索按钮,然后显示匹配的项目清单,例如:

 
item c 

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

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

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

回答

3

网页过期

你会得到当你试图获得从浏览器历史上的一个非缓存POST请求此错误。这种行为是完全预期的。要解决这个“问题”,你需要打开缓存或者用GET替换POST。

启用浏览器的缓存实际上是很容易:刚刚从有问题的POST请求的HTTP响应删除Cache-Control: no-cache和相关的头。然后,最终用户将只会得到一个警告对话框,表明POST数据将重新发送到服务器,这对于完全非幂等请求(如下订单或删除项目)来说实在是不可取的。用GET代替POST是更好的解决方案。获取searchresults(就像Google一样)应该由GET完成。

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

相关问题