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

Java 当按下JSF(Richfaces)提交上的后退按钮时,网页过期,java,jsf,button,richfaces,Java,Jsf,Button,Richfaces,我的标题可能会让人困惑,所以请继续读下去。如果可以的话,我正在使用以下技术。Spring、Hibernate、JSF(RichFaces)、MySQL、Internet Explorer 我有一个显示在RichFaces数据表中的项目列表,如下所示: item a item b item c item d item e 当在该页面上按下IE的浏览器后退按钮时,该页面显示“网页已过期”。这是什么?我如何避免 网页过期 当您试图从浏览器历史记录中获取未缓存的POST请求时,将出现此错误。这种行为完全

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

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

item a item b item c item d item e 当在该页面上按下IE的浏览器后退按钮时,该页面显示“网页已过期”。这是什么?我如何避免

网页过期

当您试图从浏览器历史记录中获取未缓存的POST请求时,将出现此错误。这种行为完全是意料之中的。要解决这个“问题”,您需要打开缓存或用GET替换POST

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

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

网页过期

当您试图从浏览器历史记录中获取未缓存的POST请求时,将出现此错误。这种行为完全是意料之中的。要解决这个“问题”,您需要打开缓存或用GET替换POST

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

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

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