2011-11-23 66 views
3

看看這些代碼:何時使用Java在HttpURLConnection中設置cookie?

public static String get(String url, Properties parameters) throws MalformedURLException, IOException{ 
     url = buldGetUrl(url, parameters); 
     if(DEBUG) System.out.println("[HTTP GET REQUEST]"); 
     if(DEBUG) System.out.println(" URL: " + url); 
     HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection(); 
     conn.setRequestProperty("Cookie","JSESSIONID=" + J_SESSION_ID); 
     conn.connect(); 

     if(DEBUG) System.out.println("\n[HTTP GET RESPONSE]"); 
     if(DEBUG) System.out.println("==== Response Headers ====="); 
     String serverCookies = conn.getHeaderField("Set-Cookie"); 
     if(serverCookies != null){ 
      String[] cookies = serverCookies.split(";"); 
      for(String s : cookies){ 
       s = s.trim(); 
       if(s.split("=")[0].equals("JSESSIONID")){ 
        J_SESSION_ID = s.split("=")[1]; 
        if(DEBUG) System.out.println(" Session ID Found: " + J_SESSION_ID); 
        break; 
       } 
      } 
     } 
     if(DEBUG){ 
      for(String s : conn.getHeaderFields().keySet()){ 
       if(s == null) 
        System.out.println(" " + conn.getHeaderField(s)); 
       else 
        System.out.println(" " + s + "=" + conn.getHeaderField(s)); 
      } 
     } 

     if(DEBUG) System.out.println("==== Response Content ====="); 
     BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
     String str = null; 
     StringBuilder sb = new StringBuilder(); 
     while ((str = br.readLine()) != null) { 
      sb.append(str + System.getProperty("line.separator")); 
      if(DEBUG) System.out.println(str); 

     } 
     br.close(); 
     return sb.toString(); 
    } 

請注意以下三行:

HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();  
conn.setRequestProperty("Cookie","JSESSIONID=" + J_SESSION_ID); 
conn.connect(); 

URL#的openConnectionURL#連接,該方法將請求發送到服務器? 如果答案是openConnection方法,請求已被髮送後如何設置cookie?如果答案是連接方法,你猜是什麼?下面這些代碼工作過,我可以從服務器響應:

url = buldGetUrl(url, parameters); 
     if(DEBUG) System.out.println("[HTTP GET REQUEST]"); 
     if(DEBUG) System.out.println(" URL: " + url); 
     HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection(); 

     if(DEBUG) System.out.println("\n[HTTP GET RESPONSE]"); 
     if(DEBUG) System.out.println("==== Response Headers ====="); 
     String serverCookies = conn.getHeaderField("Set-Cookie"); 
     if(serverCookies != null){ 
      String[] cookies = serverCookies.split(";"); 
      for(String s : cookies){ 
       s = s.trim(); 
       if(s.split("=")[0].equals("JSESSIONID")){ 
        J_SESSION_ID = s.split("=")[1]; 
        if(DEBUG) System.out.println(" Session ID Found: " + J_SESSION_ID); 
        break; 
       } 
      } 
     } 
     if(DEBUG){ 
      for(String s : conn.getHeaderFields().keySet()){ 
       if(s == null) 
        System.out.println(" " + conn.getHeaderField(s)); 
       else 
        System.out.println(" " + s + "=" + conn.getHeaderField(s)); 
      } 
     } 

     if(DEBUG) System.out.println("==== Response Content ====="); 
     BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
     String str = null; 
     StringBuilder sb = new StringBuilder(); 
     while ((str = br.readLine()) != null) { 
      sb.append(str + System.getProperty("line.separator")); 
      if(DEBUG) System.out.println(str); 

     } 
     br.close(); 
     return sb.toString(); 

回答

3

的方法連接()將打開一個通信鏈接此URL引用的資源,如果這樣的連接尚未建立。 getInputStream(),getResponseCode()或getResponseMessage()方法將創建與服務器的通信鏈接

+0

但你怎麼解釋這一點。在我的第二個例子中,我根本沒有調用open()方法,但我也可以從服務器獲得響應。 – CaiNiaoCoder

+0

@CaiNiaoCoder看看這個答案http://stackoverflow.com/questions/2151359/java-httpurlconnection-doesnt-connect-when-i-call-connect。感謝您的問題 – vinoth

1

因此,一般來說,#connect()實際上是多餘的,只要此HttpURLConnection類的方法即檢索響應信息(例如#getInputStream()/ getResponseCode()/ getHeaderFields()/ etc)被調用,隱式連接實際上會被完成。我對嗎?

我的理解是基於下面的討論: Using java.net.URLConnection to fire and handle HTTP requests