2011-10-19 22 views
8

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.

Trả lời

14

Cách tiếp cận này chỉ hoạt động cho phiên SCF JS23 @ManagedBean chỉ, không dành cho hạt CDI @Named.

Bạn cần @Inject làm tài sản của bộ lọc.

@Inject 
private User user; 
+2

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

+1

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

4
import org.jboss.weld.context.SerializableContextualInstanceImpl; 

    HttpSession httpSession = (HttpSession) facesContext.getExternalContext().getSession(false); 
    Enumeration<String> attribs = httpSession.getAttributeNames(); 
    String attrib = null; 
    while (attribs.hasMoreElements()) {   
     attrib = attribs.nextElement(); 
     Object obj = httpSession.getAttribute(attrib); 
     if(obj instanceof SerializableContextualInstanceImpl){ 
      SerializableContextualInstanceImpl impl = (SerializableContextualInstanceImpl)obj; 
      //here: MyObject myObj= (MyObject)impl.getInstance(); 
     }   
    } 
Các vấn đề liên quan