2012-02-10 66 views
0

我开发了一个应用程序,其中托管的bean有ViewScopedSessionScoped。所有需要用户登录的模块,托管的豆将在SessionScoped,非登录页面将在ViewScoped。目前,问题在于,当会话超时时间超过30分钟后默认情况下,非登录页面的表现异常,其中commandButton不向服务器发送请求,而且它也发生在所有具有ajax行为的按钮上页。a4j在jsf和管理bean会话超时后无法工作viewscoped

我也想知道为什么页面表现得像那样没有会话。是否因为ViewScoped创建临时会话来保存页面,只要用户没有导航到其他页面?

我已经尝试了大部分给出的建议。

+0

当您说“a4j”是指RichFaces的“”组件? – BalusC 2012-02-10 13:26:53

+0

@BalusC >>是的。 – user1201055 2012-02-13 03:28:01

回答

1

摘自BalusC's Communication in JSF 2.0

•@ ViewScoped:在这个范围豆住,只要你在浏览器窗口/标签相同的JSF视图交互。它会在HTTP请求中创建,并在您回发到其他视图后被破坏。当您通过GET请求离开/关闭视图时,它不会立即被破坏,但它不再以通常的方式访问。 JSF将bean以受管bean名称作为关键字存储在UIViewRoot#getViewMap()中,该关键字又存储在会话中。您需要从操作(侦听器)方法返回null或void以保持bean活着。使用此作用域可以使用更复杂的表单,这些表单使用ajax,数据表和/或多个呈现/禁用属性,其状态需要在同一浏览器窗口/选项卡(视图)内的后续请求中保留。

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

ViewScoped豆被存储在其又被存储在用户会话中的UIViewRoot,因此ViewScoped bean也间接存储在会话中。会话过期并被销毁后,ViewScoped bean也会被销毁,如果您在该代码中引用期望状态的代码中的某些内容,或者您​​正在使用需要状态(如.a4j)的第三方组件,那么这可以解释这个奇怪的问题。

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

+0

>> ViewScoped不适用于LoginBean。有一个用户不需要登录的页面。它就像一个搜索页面,里面有很多Ajax行为。这就是为什么我使用ViewScoped的原因。根据您的解释,'ViewScoped bean间接也存储在会话中。会话过期并被销毁后,ViewScoped bean也会被销毁。目前,我所做的是操纵JavaScript中的会话计数,我认为这不是强制用户在30分钟后重新加载页面的最佳解决方案。 – user1201055 2012-02-13 03:34:11