JSF中的无状态有什么用处?

根据这个博客 JSF是无国界的。 是不是使用JSF的全部重点是,它使保存和恢复状态一件杂事。 JSF变成无国籍的意义何在? 你可以请提供一个例子,这可以是有用的。

首先,我想澄清一下,JSF并不完全是“无状态”。 JSF只是添加了一个新function,使开发人员能够按需创build无状态视图/表单。

状态保存对于dynamic操作的表单尤其有用,例如有条件地显示ajax的部分。 它记住了基于ajax的回传的表单状态。 换句话说,就是你绝对需要一个视图范围的托pipebean而不是一个请求范围的托pipebean的forms。 如果静态表单绑定到请求范围的bean,则可以根据视图文件轻松地根据每个请求重新创build状态,因此不一定需要保存。

状态保存在服务器端状态保存pipe理的情况下,但是在服务器内存和会话创build方面是成本的。 此外,它还有一个缺点,即在会话过期的回发期间会发生ViewExpiredException 。 所有这些都可以通过将状态保存pipe理设置到客户端来解决。 但是,由于串行化,这又成为networking带宽和性能较低的代价。

例如,如果大型网站覆盖“public”和“restricted”部分,则希望推迟会话创build,直到用户实际login。但是,如果公共部分有JSFlogin表单,则会话仍然会通过访问该页面来创build。 如果表单基本上没有dynamic状态,并且绑定到请求范围的bean,这是一个不必要的成本。

诚然,如果您拥有最先进的硬件,这个成本是微不足道的,但是如果您有相对较多的访问者和/或相对较差的硬件,这个成本是不可忽略的。 在这种情况下,测量就是知道的。 而且,并不总是可能完全无状态,你会失去dynamic操纵视图/表单的好处和经验。 但是,理论上可以通过隐藏input字段和/或自定义请求参数来按照每个请求来维护状态。

值得注意的是无状态有一个额外的缺点,即如果存在一个开放的XSS漏洞,理论上更容易执行CSRF攻击。 幸运的是,在JSF2 / Facelets中,XSS漏洞已经非常困难。 唯一的方法是使用<h:outputText escape="false">重新显示用户控制的数据。

也可以看看:

  • 为什么JSF在服务器上保存UI组件的状态?
  • 在POST表单中,我是否面临CSRF攻击风险,而不需要用户login?
  • JSF中的CSRF,XSS和SQL注入攻击防护
  • JSF生命周期的不同阶段如何在包含表单的无状态视图中运行

只有维持真实状态时才维持状态。

JSF的一个大问题就是扩展。

基本上,JSF有两个select:

  • 在服务器上存储状态 – 优点:更快的响应时间; 缺点:你需要启动大量的内存来处理超过2-300个用户“只是浏览”,例如在他们login或添加任何东西之前,购物车

  • 在客户端存储状态 – 优点:删除内存限制; 缺点:随着组件树必须每次发送到客户端,增加服务器带宽

无状态应该确保JSF可以用来有效地提供内容,而用户没有需要维护的状态。

还有其他的改进,例如允许组件树在有意义的地方被重用,但是想法是让应用程序更好地扩展。