繁体   English   中英

在jsf中会话超时后,a4j无法正常工作,并且受管bean的视域范围

[英]a4j not working after session timeout in jsf and managed bean viewscoped

我已经为托管bean开发了一个具有ViewScopedSessionScoped的应用程序。 所有需要用户登录的模块,托管Bean将在SessionScoped ,非登录页面将在ViewScoped 当前的问题是,当会话超时(默认情况下是30分钟后)时,非登录页面的行为很奇怪,其中commandButton没有将请求发送到服务器,并且所有按钮都具有ajax行为,页。

我也想知道为什么页面没有这样的行为,因为没有会话。 是因为ViewScoped创建了一个临时会话来保存页面,只要用户没有导航到其他页面?

我已经尝试了那里给出的大多数建议。

摘录自JSF 2.0中BalusC的交流

•@ ViewScoped:只要您正在浏览器窗口/选项卡中与同一JSF视图进行交互,此范围内的bean就可以存在。 它是根据HTTP请求创建的,一旦回发到另一个视图,它就会被销毁。 当您通过GET请求离开/关闭视图时,它不会立即被销毁,但是现在无法以通常的方式访问它。 JSF使用托管的bean名称作为键将bean存储在UIViewRoot#getViewMap()中,然后将其存储在会话中。 您需要从操作(侦听器)方法返回null或void以使Bean保持活动状态。 将此范围用于使用ajax,数据表和/或几个呈现/禁用的属性的更复杂的表单,这些表单的状态需要保留在同一浏览器窗口/选项卡(视图)中的后续请求中。

•@ SessionScoped:只要HTTP会话存在,此作用域中的bean都会存在。 它在会话中涉及此bean的第一个HTTP请求时创建,并在HTTP会话无效(或从会话映射中手动删除bean)时销毁。 JSF将bean作为托管的bean名称作为键的HttpSession属性存储。 也可以通过ExternalContext#getSessionMap()获得。 将此范围用于纯会话范围的数据,这些数据可以安全地在同一会话内的所有浏览器窗口/选项卡(视图)之间共享。 例如,登录用户,用户首选项(例如用户特定的设置)和所选的语言/区域设置等。

ViewScoped bean存储在UIViewRoot中,UIViewRoot又存储在用户会话中,因此ViewScoped bean也间接存储在会话中。 在会话到期并被销毁之后, ViewScoped bean也将被销毁,并且如果您在代码中引用期望状态的LoginBean,或者正在使用需要状态的第三方组件(例如a4j),那就可以解释这种奇怪了。

我建议您为LoginBean切换到RequestScoped 我从来没有遇到过需要ViewScoped支持bean才能登录到应用程序的情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM