To pytanie jest powiązane z poprzednim na writing a session timeout handler.Jak uzyskać fasoli CDI SessionScoped z wnętrza filtru?
Odpowiedź w tym wątku dotyczyła dostępu do różnych zarządzanych ziaren zarządzanych na podstawie sesji z serwletu. Zalecenie (jak widać here) jest zrobić to w filtrze:
HttpSession session = request.getSession(false);
User user = (session != null) ? (User) session.getAttribute("user") : null;
Przypuszczalnie ten pobiera fasoli sesji klasy Użytkownika. Problem polega na tym, że to nie działa.
To, co jest nie tak, to fakt, że ziarna występują w atrybutach sesji, ale są zawijane przez urządzenia Weld. Napisałem doFilter() metodę następująco:
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<String> en = session.getAttributeNames();
int count = 0;
while (en.hasMoreElements()) {
String e = en.nextElement();
System.out.println("Attribute " + ++count + ": " + e);
}
}
chain.doFilter(request, response);
}
Kiedy to zrzuca się atrybuty sesji, ja zazwyczaj coś takiego:
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
Atrybut nr 2 wydaje się reprezentować fasoli że Chcę. Nie trzeba dodawać, że wywołanie session.getAttribute ("login") nie działa.
Czy ktoś może powiedzieć, jak uzyskać dostęp do podstawowej zarządzanej fasoli? Wolałbym robić to w sposób, który nie był związany z Weld, ale to może nie być możliwe.
BalusC czy kiedykolwiek spać? Po prostu próbowałam adnotować mój filtr za pomocą ** '@Named' ** i robiąc **' @ Inject' ** mojego ** bean ** logowania. Zadziałało! Nie miałem pojęcia, że usługa CDI zadziała w ** Filtrze **. Przypuszczam, że oznacza to, że obiekt ** Filter ** jest tworzony dla każdego cyklu żądania, a nie tylko raz dla całego życia Serwletu. – AlanObject
Teraz jest tylko 21:02 :) Powinno to po prostu zadziałać, jeśli dodasz adnotację do filtru za pomocą '@ WebFilter'. Wolałbym tego nie robić '@ Named' (podobnie,' @ Inject' powinien również działać w serwletach '@ WebServlet'). CDI jest bardziej proxy. Obiekty są wstrzykiwane na zasadzie threadlocal, instancja, która ma zostać wstrzyknięta, nie musi być tego samego lub szerszego zakresu. – BalusC