2012-03-07 45 views
6

Tôi đang cố gắng @Inject một bean @SessionScoped thành LọcSử dụng CDI Injection trong một Servlet

@WebFilter("/*") 
public class IdentityFilter implements Filter, Serializable { 

    @Inject 
    private LoginUser loginUser; 
... 

nơi LoginUser@SessionScoped

Mục đích là cho loginUser để đại diện cho người dùng đăng nhập cho phiên.

Vấn đề là dường như tôi không phải lúc nào cũng nhận được loginUser từ phiên hiện tại, tôi nhận được 'rò rỉ' giữa các phiên làm đối tượng LoginUser của một phiên đang được chia sẻ với một phiên khác. Rõ ràng điều này là không tốt.

Tôi tự hỏi nếu điều này là do đối tượng Filter là một đơn hoặc ít nhất được sử dụng lại giữa các yêu cầu và phiên của vùng chứa (glassfish). (Phải không?)

Có cách nào tốt hơn để lấy đối tượng LoginUser cho phiên hiện tại mà không sử dụng thuộc tính trên Bộ lọc không?

+0

Bạn có thể dán Mã người dùng đăng nhập không? Nếu bạn không có một hàm tạo riêng không có tham số hoặc lớp là cuối cùng hoặc có một phương thức cuối cùng thì nó sẽ không hoạt động. –

+0

Cảm ơn Fabricio. Tôi nghĩ rằng điều này là ok, nó tiêm như vậy phải được. Vấn đề là chia sẻ ... Tôi nghĩ rằng tôi đã tìm thấy những gì sai, sẽ đăng. – Jonathan

Trả lời

8

Vấn đề của tôi là chỉ có một thể hiện của Bộ lọc trong vùng chứa, một bản đơn có hiệu quả. Có vẻ như CDI đưa đối tượng cấp phiên đầu tiên vào Bộ lọc lúc đầu sử dụng và sau đó Bộ lọc lưu trữ tham chiếu mãi mãi, ngay cả đối với các phiên khác.

tôi đã tìm thấy giải pháp này, phải tiêm một đối tượng nhà máy (Instance) mà tôi có thể sử dụng để có được những ví dụ phiên mỗi lần lọc chạy, tức là

@WebFilter("/*") 
public class IdentityFilter implements Filter, Serializable { 

     @Inject 
     private Instance<LoginUser> loginUserSource; 

Và trong

@Override 
public void doFilter(...) 
     LoginUser login = loginUserSource.get(); 

Điều này dường như khắc phục được sự cố của tôi.

Cảm ơn

+4

Trên thực tế, CDI hoạt động bằng cách sử dụng proxy và đó không phải là cá thể LoginUser thực tế được tiêm miễn là nó không có phạm vi phụ thuộc và đáp ứng các yêu cầu từ nhận xét đầu tiên của tôi. –

+2

+1 cho câu trả lời của Fabricio Lemos. CDI cung cấp proxy. Điều này được bắt buộc bởi đặc tả CDI (cho tất cả các hạt đậu NormalScoped). Hãy đảm bảo rằng @SessionScoped bạn sử dụng thực sự là CDI (javax.enterprise.context.SessionScoped) và KHÔNG, ví dụ: một từ JSF (java.faces.bean.SessionScoped). Đây là một lỗi phổ biến và xảy ra nếu IDE của bạn chỉ tự động nhập chú thích từ gói sai. Những phạm vi JSF này được coi là di sản từ EE6 và thậm chí có thể bị phản đối trong các phiên bản JSF trong tương lai. – struberg

Các vấn đề liên quan