JSF 2.0 View Scope后退按钮安全吗?

时间:2012-03-29 18:05:24

标签: jsf-2

是JSF 2.0 View Scope"后退按钮"安全?例如如果我在View Scope中存储模型并从第1页,第2页,第3页到第4页,沿途修改模型对象(通过输入字段),然后按两次后退按钮返回第2页并进行更改(再次转到第3页),视图范围中的模型是否只有在最初呈现第2页时所做的更改,或者它是否具有后续页面?变化?

Oracle ADF已经/有一些名为"进程范围"通过标记放入会话的内容来处理此问题,因此每个页面都有自己的模型副本。

1 个答案:

答案 0 :(得分:17)

首先,视图范围绑定到特定页面/视图。多个视图不会共享相同的视图范围bean。视图范围以初始GET请求开始,并在POST操作使用非null返回值导航时停止。

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

按下后退按钮时:

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

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

另见: