2013-02-13 8 views
24

मेरे पास जावा एप्लिकेशन (जेडीके 1.7.0_13) है और मैं java.net.HttpURLConnection का उपयोग कर रहा हूं जो कुछ प्रबंधन आधारित सेवाओं से कनेक्ट करने के लिए सत्र प्रबंधन करता है। मैं सत्र कुकीज़ को ट्रैक करने के लिए java.net.CookieManager का उपयोग करने का तरीका जानने का प्रयास कर रहा हूं। दस्तावेज़ों को पढ़ना मुझे यह धारणा मिलती है कि कुकी मैनेजर को कुकी हैन्डलर.सेटडिफॉल्ट (नया कुकी मैनेजर()) के साथ स्थापित करना कुकी प्रबंधन को स्वचालित रूप से होने का कारण बनना चाहिए। हालांकि, एक ही यूआरएल के लिए कई अनुरोध कुकीज़ को संरक्षित नहीं करते हैं। क्या मुझे प्रतिक्रियाओं से कुकीज़ को मैन्युअल रूप से निकालना है और उन्हें अपने अनुरोधों में भेजना है या कुकी मैनेजर स्वचालित रूप से मेरे लिए ऐसा करने जा रहा है? यदि कुकी मैनेजर नहीं करता है, तो इसमें क्या मूल्य शामिल है?कुकी मैनेजर के साथ HttpURLConnection स्वचालित रूप से सत्र कुकीज़ को संभालना चाहिए?

चीजों का परीक्षण करने के लिए, मेरे पास एक सर्वलेट है जो हर बार जब मेरा ब्राउज़र यूआरएल पर जाता है तो काउंटर सफलतापूर्वक बढ़ता है। यह सफारी, फ़ायरफ़ॉक्स और क्रोम से ठीक काम करता है ... हालांकि, मैं इसे स्टैंडअलोन जावा एप्लिकेशन से काम नहीं कर सकता।

यहां एक बहुत ही सरल परीक्षण कार्यक्रम है जो यह स्पष्ट करने के लिए है कि मैं क्या उम्मीद कर रहा था सरल काम करेगा। यह शुरुआत में कुकी मैनेजर स्थापित करता है और फिर कंसोल पर यूआरएल टाइप किए जाने के बाद बार-बार एक fetch (स्ट्रिंग urlString) विधि को कॉल करता है।

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); 
     } 
    } 

} 

इस ऐप से मेरे सर्वलेट को आमंत्रित करने से सर्वर से सत्र कुकी वापस मिल जाती है। हालांकि, फिर से आविष्कार एक नई सत्र कुकी हो जाता है।

> 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----- 

तो, संक्षेप में प्रस्तुत करने, मैं CookieManager मेरे लिए स्वचालित रूप से काम करने के लिए कुछ और करने की क्या ज़रूरत है, या मैं मैन्युअल रूप से प्रतिक्रियाओं से कुकीज़ निकालने और उन्हें अनुरोध के साथ फिर से भेजने का सहारा लेना पड़ता है?

+0

कृपया http://stackoverflow.com/questions/12349266/how-do-i-persist-cookies-when-using-httpurlconnection/32001630#32001630 पर जाएं। सबसे अच्छा समाधान आया है। – hgg

उत्तर

55

मैं अपने कोड चलाने के लिए और की जगह इस

CookieHandler.setDefault(new CookieManager()); 

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

से यह काम करते हैं!

+1

धन्यवाद। शानदार ढंग से काम करता है। बेशक, अब मुझे जवाब पता है, दस्तावेज ढूंढना आसान है। ;-) – Chuck

+1

यह आमतौर पर आपको जो मिल सकता है उससे बेहतर और अधिक कॉम्पैक्ट उत्तर है। धन्यवाद! – Panayotis

संबंधित मुद्दे