2013-02-13 24 views
24

Tôi có một ứng dụng Java (JDK 1.7.0_13) và đang sử dụng java.net.HttpURLConnection để kết nối với một số dịch vụ dựa trên servlet quản lý phiên làm việc. Tôi đang cố gắng tìm ra cách sử dụng java.net.CookieManager để theo dõi các cookie phiên. Đọc tài liệu tôi nhận được ấn tượng rằng cài đặt CookieManager với CookieHandler.setDefault (new CookieManager()) sẽ khiến việc quản lý cookie diễn ra tự động. Tuy nhiên, nhiều yêu cầu cho cùng một URL dường như không giữ lại cookie. Tôi có phải tự mình trích xuất cookie từ các phản hồi và gửi lại chúng theo yêu cầu của riêng tôi hoặc CookieManager sẽ tự động thực hiện việc này cho tôi không? Nếu CookieManager không, thì giá trị của nó là gì?Nên HttpURLConnection với CookieManager tự động xử lý các cookie phiên?

Để kiểm tra mọi thứ, tôi có một servlet thành công tăng bộ đếm mỗi khi trình duyệt của tôi truy cập URL. Điều này hoạt động tốt từ Safari, FireFox và Chrome ... Tuy nhiên, tôi không thể làm cho nó hoạt động từ một ứng dụng Java độc lập.

Đây là một chương trình thử nghiệm rất đơn giản để minh họa những gì tôi đã hy vọng sẽ làm việc đơn giản. Nó cài đặt CookieManager lúc bắt đầu và sau đó gọi phương thức tìm nạp (String urlString) nhiều lần khi các URL được nhập vào trong giao diện điều khiển.

package com.brilliant.experimental; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.CookieHandler; 
import java.net.CookieManager; 
import java.net.HttpURLConnection; 
import java.net.URL; 

public class HttpFetcher { 
    public static void fetch(String urlString) { 
     try { 
      URL url = new URL(urlString); 
      HttpURLConnection conn = (HttpURLConnection)url.openConnection(); 
      InputStream in = conn.getInputStream(); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
      int status = conn.getResponseCode(); 
      System.out.println("Status = " + status); 
      String key; 
      System.out.println("Headers-------start-----"); 
      for (int i = 1; (key = conn.getHeaderFieldKey(i)) != null; i++) { 
       System.out.println(key + ":" + conn.getHeaderField(i)); 
      } 
      System.out.println("Headers-------end-----"); 
      System.out.println("Content-------start-----"); 
      String inputLine; 
      while ((inputLine = reader.readLine()) != null) { 
       System.out.println(inputLine); 
      } 
      System.out.println("Content-------end-----"); 
      in.close(); 
     } catch (Exception e) { 
      System.out.println(e); 
     } 
    } 

    public static void main(String[] args) { 
     CookieHandler.setDefault(new CookieManager()); 

     for (int i = 0; i < args.length; i++) { 
      fetch(args[i]); 
     } 

     InputStreamReader isr = new InputStreamReader(System.in); 
     BufferedReader reader = new BufferedReader(isr); 
     String prompt = "> "; 
     String urlString; 
     try { 
      for (System.out.print(prompt); 
        (urlString = reader.readLine()) != null; 
        System.out.print(prompt)) 
      { 
       fetch(urlString); 
      } 
     } catch (IOException ioe) { 
      System.out.println(ioe); 
     } 
    } 

} 

Gọi servlet của tôi từ ứng dụng này sẽ nhận được cookie phiên trở lại từ máy chủ. Tuy nhiên, việc gọi lại một lần nữa nhận được một cookie phiên mới.

> http://localhost:8080/brilliant/TestServlet 
Status = 200 
Headers-------start----- 
Server:Resin/4.0.34 
Cache-Control:private 
Set-Cookie:JSESSIONID=aaaMp0uKke4gp9_-nUuZt; path=/ 
Content-Length:19 
Date:Wed, 13 Feb 2013 18:02:31 GMT 
Headers-------end----- 
Content-------start----- 
Session count is 0 
Content-------end----- 
> http://localhost:8080/brilliant/TestServlet 
Status = 200 
Headers-------start----- 
Server:Resin/4.0.34 
Cache-Control:private 
Set-Cookie:JSESSIONID=aaaZ-oPaC1I9WdEDoUuZt; path=/ 
Content-Length:19 
Date:Wed, 13 Feb 2013 18:02:33 GMT 
Headers-------end----- 
Content-------start----- 
Session count is 0 
Content-------end----- 

Vì vậy, để tóm tắt, làm tôi phải làm cái gì khác để làm cho CookieManager làm việc tự động đối với tôi, hay tôi phải nghỉ mát để tự giải nén các tập tin cookie từ câu trả lời và gửi lại chúng với yêu cầu?

+0

vui lòng chuyển đến http://stackoverflow.com/questions/12349266/how-do-i-persist-cookies-when-using-httpurlconnection/32001630#32001630。 giải pháp tốt nhất đã xuất hiện。 – hgg

Trả lời

55

tôi chạy mã của bạn và thay thế

này
CookieHandler.setDefault(new CookieManager()); 

bởi

CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ALL)); 

Nó hoạt động!

+1

Cảm ơn bạn. Hoạt động rực rỡ. Tất nhiên, bây giờ tôi biết câu trả lời, tài liệu này rất dễ tìm. ;-) – Chuck

+1

Đó là một câu trả lời tốt đẹp và nhỏ gọn hơn so với những gì bạn thường có thể tìm thấy. Cảm ơn! – Panayotis

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