JSF 2.0 视图作用域是否支持后退按钮安全?

13
JSF 2.0视图范围(View Scope)是否“后退按钮”安全?例如,如果我在View Scope中存储一个模型,并从页面1、页面2、页面3到页面4,沿途通过输入字段修改模型对象,然后点击两次后退按钮回到页面2并进行更改(再次带我到页面3),那么View Scope中的模型将只具有在页面2最初呈现时所做的更改还是会具有后面页面的更改?
Oracle ADF有/曾经有一种称为“流程范围(process scope)”的东西,它通过对放入会话的内容进行标记处理来处理此问题,因此每个页面都有自己的模型副本。
1个回答

19

首先,视图作用域(view scope)绑定到特定的页面/视图。多个视图不会共享相同的视图作用域(bean)。视图作用域从初始GET请求开始,并在POST操作导航时停止,如果返回值为非null,则停止。

通常有以下情况,取决于浏览器是否被指示缓存页面以及JSF状态保存配置。我将假设这些页面之间的导航是通过POST请求进行的(因为听起来很像"向导(Wizard)"场景)。

当单击后退按钮时:

  • 如果浏览器被指示将页面保存在缓存中,则浏览器将从缓存中加载页面。所有先前输入的值将重新出现在浏览器缓存中(因此不是从服务器端的视图作用域bean中获得!)。当您在此页面上执行POST请求时,取决于javax.faces.STATE_SAVING_METHOD配置设置的行为:
    • 如果设置为server(默认值),则会发生,因为在从一个页面导航到另一个页面后,视图状态会在服务器端被丢弃。
    • 如果设置为client,则它将正常工作,因为整个视图状态包含在表单的隐藏输入字段中。
  • 或者,如果浏览器被指示将页面保存在缓存中,则浏览器将显示一个浏览器默认的“页面过期”错误页面。仅当为导航应用了POST-redirect-GET模式时,浏览器才会在与重定向URL相同的URL上发送全新的GET请求。所有先前输入的值默认情况下将被清除(因为视图作用域bean被重新创建),但是如果浏览器已经打开了“自动完成”(可在浏览器级别配置),它可能会自动填充输入。这可以通过在输入组件中添加autocomplete="off"属性来禁用。当您在此页面上执行POST请求时,无论JSF状态保存方法如何,它都将正常工作。

在单个视图中执行“向导”方案更容易,该视图包含有条件呈现的步骤,并在向导部分本身提供后退按钮。

另请参阅:


我处于这样一种情况:客户端的STATE_SAVING_METHOD已经打开,并且浏览器被指示缓存页面。我还通过POST请求在这些页面之间导航。听起来我将得到我想要的行为...(即,后退按钮确实受支持,如果用户点击返回到旧页面并重新提交表单,则模型的状态不会包括来自我重新提交的页面之后的任何更改...) - BestPractices
在需要身份验证/授权的URL上,将页面保存在浏览器缓存中通常是不可取的。当用户注销后按下返回按钮时,从浏览器缓存中显示受限制的页面会让不知情的最终用户感到困惑。 - BalusC
假设我有一个视图作用域为ViewScoped的页面X。然后我点击浏览器上的返回按钮,再次点击前进按钮回到页面X。现在当我在页面X时,我看不到以前拥有的任何数据,但是bean没有被销毁(@PostConstruct从未再次被调用),事实上如果我发出一个POST,在我的调试器中,我可以看到所有的数据仍然存在,但由于某种原因,我的前端没有显示任何这些数据。我的状态保存方法是服务器。http://stackoverflow.com/questions/15944020/need-to-retain-front-end-data-when-click-browser-back-button-then-immediately - Thang Pham
不错的回答。只是出于好奇,在会话作用域的Bean中,您不能拥有视图集合并能够按需返回/呈现值吗(即:当键盘或浏览器上的后退按钮被按下时)? - user2880020

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接