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

Session scoped managed bean not available as session attribute in filter

遵循 教程后,我尝试点击页面,它总是将我重定向到登录页面(没有 css)。我尝试使用以下代码进行调试:

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

发现 class 我预计 return 在

ConnectionManager manager = (ConnectionManager) wrappedRequest.getSession()
            .getAttribute("connectionManager");

未 return 编辑。如服务器日志中所示,class 编辑了其他一些 class 而不是 ConnectionManager class。

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。我能知道为什么这是 return 吗?

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

您可以 @Inject 将它放入过滤器中,而不是手动从 HTTP 会话中获取它。

@Inject
private ConnectionManager connectionManager;

另请参阅:

  • Get JSF managed bean by name in any Servlet related class
  • Backing beans (@ManagedBean) or CDI Beans (@Named)?