Как мне получить bean-компонент CDI SessionScoped изнутри фильтра?

Этот вопрос связан с предыдущим вопросом о написании обработчика тайм-аута сеанса .

Ответ в этом потоке заключался в доступе к различным управляемым bean-компонентам с привязкой к сеансу из сервлета. Рекомендация (как показано здесь ) заключается в том, чтобы сделать это в фильтре:

HttpSession session = request.getSession(false);
User user = (session != null) ? (User) session.getAttribute("user") : null;

Предположительно это выбирает сессионный компонент класса User .Проблема в том, что это не работает.

Что идет не так, это то, что bean-компоненты присутствуют в атрибутах сеанса, но они обернуты средствами Weld. Я написал метод doFilter () следующим образом:

public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain)
        throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse res = (HttpServletResponse) response;

    String sp = req.getServletPath();
    System.out.println("------------------------");
    System.out.println("doFilter(): " + sp);

    if (!sp.startsWith("/javax")) {  // eliminates many requests
        HttpSession session = req.getSession();
        Enumeration en = session.getAttributeNames();
        int count = 0;            
        while (en.hasMoreElements()) {
            String e = en.nextElement();
            System.out.println("Attribute " + ++count + ": " + e);
        }
    }
    chain.doFilter(request, response);
}

Когда он выгружает атрибуты сеанса, я обычно получаю что-то вроде этого:

INFO: ------------------------
INFO: doFilter(): /Display.xhtml
INFO: Attribute 1: org.jboss.weld.context.http.HttpSessionContext#org.jboss.weld.bean-WEB-INF/lib/myfaces-extcdi-bundle-jsf20-1.0.1-ManagedBean-class org.apache.myfaces.extensions.cdi.jsf.impl.scope.conversation.EditableWindowContextManagerProxy
INFO: Attribute 2: org.jboss.weld.context.http.HttpSessionContext#org.jboss.weld.bean-MyApp5-ManagedBean-class com.app.Login
INFO: Attribute 3: org.jboss.weld.context.conversation.ConversationIdGenerator
INFO: Attribute 4: com.sun.faces.renderkit.ServerSideStateHelper.LogicalViewMap
INFO: Attribute 5: org.jboss.weld.context.ConversationContext.conversations
INFO: Attribute 6: facelets.ui.DebugOutput
INFO: Attribute 7: javax.faces.request.charset
INFO: Attribute 8: org.apache.myfaces.extensions.cdi.core.api.scope.conversation.WindowContext:EXISTING_WINDOW_ID_LIST

Атрибут # 2, кажется, представляет компонент, который я хочу. Само собой разумеется, что вызов session.getAttribute ("login") не работает.

Кто-нибудь может сказать, как получить доступ к базовому управляемому компоненту? Я бы предпочел сделать это способом, который не был бы привязан к Weld, но это может оказаться невозможным.

8
задан Community 23 May 2017 в 12:17
поделиться