2013-06-04 39 views
15

HttpServletRequest có một phương pháp:Extract yêu cầu các thuộc tính từ yêu cầu container của Jersey

setAttribute 

Làm thế nào tôi có thể trích xuất thuộc tính này từ ContainterRequest?

Tôi không tìm thấy: getAttribute phương pháp!

public class AuthenticationFilter implements Filter{ 

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException { 
     HttpServletRequest httpReq = (HttpServletRequest) servletRequest; 
     .... .... 
     httpReq.setAttribute("businessId", businessId); 
    } 
} 

Trong Jersey Lọc:

private class Filter implements ResourceFilter, ContainerRequestFilter{ 
    public ContainerRequest filter(ContainerRequest request) { 
     ..extract the attribute from the httpReq 
    } 
} 
+0

Bạn vui lòng bao gồm một số mã chứng minh những gì bạn muốn làm? –

+0

Tôi đã chỉnh sửa câu hỏi của mình. Cảm ơn! – Dejell

Trả lời

33

Bạn không thể. Chúng không được hiển thị thông qua API Jersey theo bất kỳ cách nào. Nếu bạn tìm kiếm codebase Jersey, bạn sẽ thấy rằng không có sử dụng nào của HttpServletRequest.getAttributeNames(), mà bạn mong muốn được sử dụng nếu chúng được sao chép một cách rộng rãi. Bạn cũng sẽ thấy rằng chỉ có một số ít sử dụng của HttpServletRequest.getAttribute(), và nó hoàn toàn cho kế toán nội bộ.

Lưu ý, tuy nhiên, khi được triển khai trong ngữ cảnh Servlet, JAX-RS cho phép bạn tiêm HttpServletRequest gốc bằng chú thích @Context. Tôi không chắc chắn liệu bạn có thể làm điều này trong một bộ lọc Jersey, nhưng nó hoạt động trong MessageBodyReaders/Writers và trong các lớp tài nguyên.

Cập nhật: Tôi đã kiểm tra, và bạn có thể, trên thực tế, tiêm HttpServletRequest thành một Jersey ContainerRequestFilter bằng cách đơn giản bao gồm:

@Context private HttpServletRequest httpRequest; 
+0

Tôi có thể tiêm nó vào Bộ lọc Jersey không? – Dejell

+0

Có. Xem cập nhật của tôi. –

+0

Vậy tại sao Jersey không đơn giản mở rộng HttpServletRequest? – Dejell

3

tôi có @Context làm việc, nhưng có vấn đề là ContainerRequestFilter của tôi là singleton.

Tôi phải triển khai javax.servlet.Filter tùy chỉnh và sử dụng ThreadLocal để lưu trữ HttpServletRequest.

0

tôi muốn thêm vào trước câu trả lời giải pháp của tôi, ngoài bối cảnh thêm:

@Context 
private HttpServletRequest httpRequest; 

Bạn nên setget thuộc tính từ phiên, Nhận:

httpRequest.getSession().setAttribute("businessId", "yourId"); 

Set:

Object attribute = httpRequest.getSession().getAttribute("businessId"); 
Các vấn đề liên quan