会话范围的托管bean在过滤器中不可用作会话属性

时间:2015-02-13 13:03:24

标签: jsf servlet-filters managed-bean session-scope

在关注JSF HTTP Session Login教程之后,我尝试点击页面,它总是将我重定向到登录页面(没有css)。我尝试使用以下代码进行调试:

Enumeration<String> attributeNames = wrappedRequest.getSession().getAttributeNames();
    while(attributeNames.hasMoreElements()) {
                System.out.println(attributeNames.nextElement());
    }

并发现我希望在

返回的班级
ConnectionManager manager = (ConnectionManager) wrappedRequest.getSession()
            .getAttribute("connectionManager");

没有退回。如服务器日志中所示,返回了一些其他类而不是ConnectionManager类。

Info:   employeeManager
Info:   org.jboss.weld.context.beanstore.http.LockStore
Info:   com.sun.faces.renderkit.ServerSideStateHelper.LogicalViewMap
Info:   org.jboss.weld.context.conversation.ConversationIdGenerator
Info:   org.jboss.weld.context.ConversationContext.conversations
Info:   javax.faces.request.charset

EmployeeManager是另一个托管bean。我能知道为什么这会回来吗?

1 个答案:

答案 0 :(得分:1)

答案基于ConnectionManager是一个JSF托管bean。但是,基于会话中CDI特定对象的存在,看起来您正在使用CDI @Named而不是JSF @ManagedBean来管理bean(虽然它本身就是一件好事) 。

您只需@Inject进入过滤器,而不是从HTTP会话中手动抓取它。

@Inject
private ConnectionManager connectionManager;

另见: