Câu hỏi này liên quan đến câu hỏi trước trên writing a session timeout handler.Làm thế nào để có được một hạt CDI SessionScoped từ bên trong một bộ lọc?
Câu trả lời trong chuỗi đó liên quan đến việc truy cập các bean được quản lý theo phiên khác nhau từ servlet. Các khuyến nghị (như đã thấy here) là để làm điều này trong các bộ lọc:
HttpSession session = request.getSession(false);
User user = (session != null) ? (User) session.getAttribute("user") : null;
lẽ này lấy một session bean của lớp tài. Vấn đề là điều này không hiệu quả.
Điều gì xảy ra là các hạt đậu có trong thuộc tính phiên, nhưng chúng được bao bọc bởi các cơ sở Weld. Tôi đã viết doFilter() phương pháp như sau:
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);
}
Khi điều này bãi ra các thuộc tính phiên, tôi thường nhận được một cái gì đó như thế này:
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
Thuộc tính # 2 dường như đại diện cho đậu mà Tôi muốn. Không cần phải nói một cuộc gọi đến session.getAttribute ("login") không hoạt động.
Có ai có thể nói cách truy cập bean được quản lý cơ bản không? Tôi thích làm theo cách không gắn với Weld, nhưng điều đó có thể không thực hiện được.
BalusC bạn đã bao giờ ngủ chưa? Tôi vừa thử chú thích bộ lọc của mình bằng ** '@ Named' ** và thực hiện ** ** @ @ Tiêm ** ** của ** ** Đăng nhập ** của tôi. Nó đã làm việc! Tôi không biết rằng dịch vụ CDI sẽ hoạt động trong ** Bộ lọc **. Tôi cho rằng điều này có nghĩa là đối tượng ** Filter ** được khởi tạo cho mỗi chu kỳ yêu cầu, không chỉ một lần cho toàn bộ vòng đời của Servlet. – AlanObject
Chỉ 21:02 ngay bây giờ :) Nó chỉ hoạt động nếu bạn chú thích bộ lọc bằng '@ WebFilter'. Tôi không muốn làm cho nó '@ Named' (tương tự,' @ Inject' cũng nên làm việc trong các servlet '@ WebServlet'). CDI là một proxy. Các đối tượng được tiêm trên cơ sở threadlocal, cá thể được tiêm không cần phải giống nhau hoặc phạm vi rộng hơn. – BalusC