2010-08-17 31 views
17

Có vẻ như HttpServletResponse không hiển thị bất kỳ phương pháp nào để thực hiện việc này.Có cách nào để đọc cookie từ đối tượng phản hồi trong Java không?

Ngay bây giờ, tôi đang thêm một loạt mã đăng nhập vào một servlet crufty và không hiểu rõ, trong một nỗ lực để tìm ra chính xác nó làm gì. Tôi biết rằng nó thiết lập một loạt các cookie, nhưng tôi không biết khi nào, tại sao, hoặc những gì. Nó sẽ là tốt đẹp để chỉ cần đăng nhập tất cả các cookie trong đối tượng HttpServletResponse ở phần cuối của việc thực thi servlet.

Tôi biết rằng cookie thường là trách nhiệm của trình duyệt và tôi nhớ rằng không có cách nào để thực hiện việc này trong .NET. Chỉ hy vọng rằng Java có thể khác ...

Nhưng nếu điều này là không thể - bất kỳ ý tưởng nào khác về cách hoàn thành những gì tôi đang cố gắng làm?

Xin cảm ơn, như mọi khi.

Trả lời

5

Cách tiếp cận duy nhất của bạn là bọc đối tượng HttpServletResponse để các phương thức addCookie có thể chặn và ghi lại khi cookie được đặt. Bạn có thể thực hiện điều này bằng cách thêm một ServletFilter bao bọc HttpServletResponse hiện có trước khi nó được truyền vào Servlet của bạn.

14

Nếu ghi nhật ký là tất cả những gì bạn đang làm sau đó, tôi khuyên bạn nên viết một mã số javax.servlet.Filter để bao bọc mã được cung cấp HttpServletResponse trong trình bao bọc. Một cái gì đó như thế này:

public class CookieLoggingFilter implements Filter { 

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException ,ServletException { 
     ResponseWrapper wrappedResponse = new ResponseWrapper((HttpServletResponse) response); 

     filterChain.doFilter(request, wrappedResponse); 

     // use a real logger here, naturally :) 
     System.out.println("Cookies: " + wrappedResponse.cookies); 
    } 

    private class ResponseWrapper extends HttpServletResponseWrapper { 

     private Collection<Cookie> cookies = new ArrayList<Cookie>(); 

     public ResponseWrapper(HttpServletResponse response) { 
      super(response); 
     } 

     @Override 
     public void addCookie(Cookie cookie) { 
      super.addCookie(cookie); 
      cookies.add(cookie); 
     } 
    } 

     // other methods here 
} 

Một caveat lớn: Đây sẽ không bạn thấy những gì các tập tin cookie được gửi lại cho trình duyệt, nó sẽ chỉ cho bạn thấy những cookie của mã ứng dụng thêm vào các phản ứng. Nếu vùng chứa chọn thay đổi, thêm hoặc bỏ qua các cookie đó (ví dụ: cookie phiên được xử lý bởi vùng chứa chứ không phải ứng dụng), bạn sẽ không biết sử dụng phương pháp này. Nhưng điều đó có thể không quan trọng cho tình huống của bạn.

Cách duy nhất để đảm bảo là sử dụng plugin trình duyệt như Live Http Headers for Firefox hoặc proxy đăng nhập HTTP ở mức trung bình.

+0

Có lẽ tôi là thiếu cái gì ... Tại sao bạn không thể mở rộng đăng nhập tiêu chuẩn của container của bạn (ví dụ như 'AccessLogValve' của Tomcat) và lọc các tiêu đề phản hồi tìm kiếm' Set-Cookie 'để đăng nhập? Điều đó sẽ cho phép bạn đăng nhập các cookie xác định được đặt trong trình duyệt. –

8

Tôi đã gặp vấn đề tương tự khi tôi đang sử dụng thư viện của bên thứ ba chấp nhận HttpServletResponse và tôi cần đọc lại các cookie được đặt trên đối tượng phản hồi của tôi. Để giải quyết mà tôi tạo ra một phần mở rộng HttpServletResponseWrapper đó cho thấy những cookie cho tôi sau khi tôi thực hiện cuộc gọi:

public class CookieAwareHttpServletResponse extends HttpServletResponseWrapper { 

    private List<Cookie> cookies = new ArrayList<Cookie>(); 

    public CookieAwareHttpServletResponse (HttpServletResponse aResponse) { 
     super (aResponse); 
    } 

    @Override 
    public void addCookie (Cookie aCookie) { 
     cookies.add (aCookie); 
     super.addCookie(aCookie); 
    } 

    public List<Cookie> getCookies() { 
     return Collections.unmodifiableList (cookies); 
    } 

} 

Và cách tôi sử dụng nó:

// wrap the response object 
CookieAwareHttpServletResponse response = new CookieAwareHttpServletResponse(aResponse); 

// make the call to the 3rd party library 
String order = orderService.getOrder (aRequest, response, String.class); 

// get the list of cookies set 
List<Cookie> cookies = response.getCookies(); 
Các vấn đề liên quan