根据这个博客, JSF 正在变得无状态。使用 JSF 的全部意义不在于它使保存和恢复状态成为一件苦差事。JSF 成为无状态的有什么意义?您能否提供一个有用的示例。
2 回答
首先,我想澄清 JSF 本身并不是完全“无状态”。JSF 只是添加了一项新功能,使开发人员能够按需创建无状态视图/表单。
状态保存在动态操作的表单中特别有用,例如有条件的 ajax 渲染部分。它在基于 ajax 的回发中记住表单的状态。换句话说,在这些表单中,您绝对需要一个视图范围的托管 bean,而不是请求范围的托管 bean。在静态表单绑定到请求范围 bean 的情况下,可以根据视图文件在每个请求的基础上轻松地重新创建状态,因此不一定需要保存。
在服务器端状态保存管理的情况下,状态保存具有服务器内存和会话创建方面的成本。此外,它还有一个额外的缺点,即ViewExpiredException
在会话过期时的回发期间会发生。所有这些都可以通过将状态保存管理设置为客户端来解决。但这反过来又会在网络带宽和由于序列化导致的性能下降方面付出代价。
例如,如果大型网站包含“公共”和“受限”部分,您希望将会话创建推迟到用户实际登录。但是,如果您在公共部分有一个 JSF 登录表单,那么会话仍将通过访问该页面来创建。如果表单本身基本上没有动态状态并且绑定到请求范围的 bean,那么这是不必要的成本。
诚然,如果您拥有最先进的硬件,这个成本可以忽略不计,但如果您有相对较多的访问者和/或相对较差的硬件,它就不可忽略。在这种情况下,测量就是知道。此外,完全无状态并不总是可能的,您将失去动态操作视图/表单的好处和体验。但是,理论上您可以通过摆弄隐藏的输入字段和/或自定义请求参数来维护每个请求的状态。
应该注意的是,无状态还有一个额外的缺点,即如果存在开放的 XSS 漏洞,理论上更容易执行 CSRF 攻击。幸运的是,使用 JSF2/Facelets 已经很难有 XSS 漏洞了。获得它的唯一方法是使用 a<h:outputText escape="false">
重新显示用户控制的数据。
也可以看看:
关键是只有在需要维护真实状态时才能维护状态。
JSF 的一大问题是向外扩展。
对于 JSF,您基本上有两种选择:
在服务器上存储状态 - 优点:更快的响应时间;缺点:您需要启动加载内存来处理超过 2-300 个“只是浏览”的用户,例如在他们登录或将任何内容添加到购物车之前
在客户端存储状态 - 优点:消除内存限制;缺点:增加了服务器带宽,因为每次都必须将组件树发送到客户端
无状态应该确保 JSF 可用于有效地提供内容,而用户无需维护状态。
还有其他改进,例如允许在有意义的地方重用组件树,但想法是让应用程序更好地扩展。