JSF 2.0 View Scope“后退按钮”安全吗?例如如果我将模型存储在 View Scope 中,并从第 1 页、第 2 页、第 3 页到第 4 页,一路修改模型对象(通过输入字段),然后按两次后退按钮返回第 2 页并进行更改(再次将我带到第 3 页),视图范围中的模型是否仅具有最初呈现第 2 页时所做的更改,还是会具有后续页面的更改?
Oracle ADF 有一个称为“进程范围”的东西,它通过标记放入会话中的内容来处理此问题,因此每个页面都有自己的模型副本。
首先,视图范围绑定到特定的页面/视图。多个视图不会共享同一个视图作用域 bean。视图范围以初始 GET 请求开始,并在 POST 操作使用非null
返回值。
一般有以下几种场景,具体取决于浏览器是否被指示缓存页面以及JSF状态保存配置。我假设这些页面之间的导航是通过 POST 请求进行的(因为它听起来很像“向导”场景)。
当按下后退按钮时:
- If browser is instructed to save the page in cache, then browser will load the page from the cache. All previously entered input values will reappear from the browser cache (thus not from the view scoped bean in the server side!). The behavior when you perform a POST request on this page depends further on the
javax.faces.STATE_SAVING_METHOD
configuration setting:
- 如果设置为
server
(默认),然后ViewExpiredException
会发生这种情况,因为从一个页面到另一页面的 POST 导航后,视图状态立即在服务器端被销毁。
- 如果设置为
client
,那么它将正常工作,因为整个视图状态包含在表单的隐藏输入字段中。
- 或者,如果浏览器被指示not将页面保存在缓存中,然后浏览器将显示浏览器默认的“页面已过期”错误页面。仅当应用 POST-redirect-GET 模式进行导航时,浏览器才会在与重定向 URL 相同的 URL 上发送全新的 GET 请求。默认情况下,所有先前输入的输入值都将被清除(因为视图作用域 bean 被重新创建),但如果浏览器打开了“自动完成”(可在浏览器级别配置),则它可能会自动填充输入。这可以通过添加来禁用
autocomplete="off"
属性到输入组件。当您在此页面上执行 POST 请求时,无论 JSF 状态保存方法如何,它都会正常工作。
在单个视图上执行“向导”场景会更容易,该视图包含有条件呈现的步骤,并在向导部分本身提供后退按钮。
也可以看看:
- javax.faces.application.ViewExpiredException:视图无法恢复 https://stackoverflow.com/questions/3642919/javax-faces-application-viewexpiredexception-view-could-not-be-restored/3642969#3642969
- JSF 2.0 中向导模式的使用范围是什么? https://stackoverflow.com/questions/9896813/what-scope-to-use-in-jsf-2-0-for-wizard-pattern
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)