JSF 2.0 View Scope 后退按钮安全吗?
Posted
技术标签:
【中文标题】JSF 2.0 View Scope 后退按钮安全吗?【英文标题】:Is JSF 2.0 View Scope back-button safe? 【发布时间】:2012-04-13 10:13:18 【问题描述】:JSF 2.0 视图范围“后退按钮”安全吗?例如如果我将模型存储在 View Scope 中并从第 1 页、第 2 页、第 3 页到第 4 页,沿途修改模型对象(通过输入字段),然后按两次后退按钮返回第 2 页并进行更改(再次将我带到第 3 页),视图范围内的模型是否仅具有最初呈现第 2 页时所做的更改,还是会有以后页面的更改?
Oracle ADF 有/有一个称为“进程范围”的东西,它通过标记放入会话中的内容来处理这个问题,因此每个页面都有自己的模型副本。
【问题讨论】:
【参考方案1】:首先,视图范围绑定到特定页面/视图。多个视图不会共享同一个视图范围 bean。视图范围从初始 GET 请求开始,并在 POST 操作以非null
返回值导航时停止。
根据是否指示浏览器缓存页面和JSF状态保存配置,一般有以下几种情况。我假设这些页面之间的导航是通过 POST 请求进行的(因为这听起来很像“向导”场景)。
按下后退按钮时:
如果指示浏览器将页面保存在缓存中,则浏览器将从缓存中加载页面。所有先前输入的输入值都将从浏览器缓存中重新出现(因此不会出现在服务器端的视图范围 bean 中!)。在此页面上执行 POST 请求时的行为进一步取决于javax.faces.STATE_SAVING_METHOD
配置设置:
如果设置为server
(默认),则将出现ViewExpiredException
,因为从一个页面到另一个页面的 POST 导航后视图状态在服务器端被丢弃。
如果设置为client
,那么它将正常工作,因为整个视图状态都包含在表单的隐藏输入字段中。
或者,如果指示浏览器不将页面保存在缓存中,则浏览器将显示浏览器默认的“页面已过期”错误页面。只有当 POST-redirect-GET 模式应用于导航时,浏览器才会在与重定向 URL 相同的 URL 上发送全新的 GET 请求。默认情况下,所有先前输入的输入值都将被清除(因为重新创建了视图范围 bean),但如果浏览器打开了“自动完成”(可在浏览器级别配置),那么它可能会自动填充输入。这可以通过将autocomplete="off"
属性添加到输入组件来禁用。当您在此页面上执行 POST 请求时,无论 JSF 状态保存方法如何,它都会正常工作。
在包含有条件呈现的步骤并在向导部分本身提供后退按钮的单个视图上执行“向导”场景更容易。
另见:
javax.faces.application.ViewExpiredException: View could not be restored What scope to use in JSF 2.0 for Wizard pattern?【讨论】:
我处于打开客户端 STATE_SAVING_METHOD 并指示浏览器缓存页面的场景中。我还通过 POST 请求在这些页面之间导航。听起来我会得到我想要的行为......(即确实支持后退按钮,如果用户点击返回旧页面并重新提交表单,那么模型的状态将不包括任何从我重新提交的页面之后的页面更改...) 在需要身份验证/授权的 URL 上通常不希望将页面放在浏览器缓存中。当最终用户在注销后按下后退按钮时,不知情的最终用户会从浏览器缓存中看到受限页面,这会让人感到困惑。 假设我有带有 ViewScoped 的页面 X。然后我单击浏览器上的后退按钮,然后单击前进按钮返回页面 X。现在,当我在页面 X 时,我没有看到以前拥有的任何数据,但是 bean 没有被破坏(@PostConstruct再也没有被调用),事实上,如果我发出一个 POST,在我的调试器中,我可以看到我的所有数据仍然存在,但由于某种原因,我的前端没有显示任何这些数据。我的 state-saving_method 是服务器。 ***.com/questions/15944020/… 不错的答案。只是出于好奇,在会话范围的 bean 中,您是否可以没有视图集合并且能够按需返回/呈现值(即:按下键盘或浏览器中的后退按钮时)?跨度>以上是关于JSF 2.0 View Scope 后退按钮安全吗?的主要内容,如果未能解决你的问题,请参考以下文章
当用户在 JSF 中注销后单击后退按钮时重定向到登录页面 [重复]
弹簧安全 3.1 +JSF 2.0 。 ManagedBeans 中注释方法的问题?
如果包含 endDrawer,Flutter 2.0 appbar 后退按钮会消失