10

इस धागे के लिए धन्यवाद How to download and save a file from Internet using Java? मुझे पता है कि फ़ाइल कैसे डाउनलोड करें, अब मेरी समस्या यह है कि मुझे उस सेवर पर प्रमाणित करने की आवश्यकता है जिससे मैं डॉउलोडिंग कर रहा हूं। यह एक उपवर्तन सर्वर के लिए एक HTTP इंटरफ़ेस है। मुझे किस क्षेत्र में देखने की ज़रूरत है?जावा का उपयोग कर इंटरनेट से एक फ़ाइल डाउनलोड करें: प्रमाणीकरण कैसे करें?

java.io.IOException: Server returned HTTP response code: 401 for URL: http://myserver/systemc-2.0.1.tgz 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1305) 
    at java.net.URL.openStream(URL.java:1009) 
    at mypackage.Installer.installSystemc201(Installer.java:29) 
    at mypackage.Installer.main(Installer.java:38) 

धन्यवाद,

+0

क्या अपवाद करना यदि आप प्रयोक्ता आईडी और पासवर्ड यूआरएल से छोड़ देते हैं आप मिल सकता है? – cmsjr

+0

यह वही अपवाद है यदि मैं लॉगिन/पास छोड़ देता हूं या यदि मैं इसे डालता हूं (कोड 401) – user105413

उत्तर

11

आप Authenticator वर्ग का विस्तार करने और इसे पंजीकृत सुझाव है। लिंक पर जावाडॉक्स कैसे समझाते हैं।

मुझे नहीं पता कि यह एनओओ विधि के साथ काम करता है जिसे प्रश्न के स्वीकृत उत्तर मिलते हैं, लेकिन यह निश्चित रूप से पुरानी शैली के तरीके के लिए काम करता है जो उस के तहत उत्तर था।

प्रमाणीकरण वर्ग कार्यान्वयन के भीतर, आप शायद PasswordAuthentication का उपयोग करने जा रहे हैं और इसे वापस करने के लिए अपने प्रमाणीकरण कार्यान्वयन के getPasswordAuthentication() विधि को ओवरराइड कर रहे हैं। यह वह कक्षा होगी जो आपको आवश्यक उपयोगकर्ता नाम और पासवर्ड से गुजरती है।

आपके अनुरोध पर, यहां कुछ नमूना कोड है:

Authenticator.setDefault(new MyAuthenticator(properties)); 

:

public static final String USERNAME_KEY = "username"; 
public static final String PASSWORD_KEY = "password"; 
private final PasswordAuthentication authentication; 

public MyAuthenticator(Properties properties) { 
    String userName = properties.getProperty(USERNAME_KEY); 
    String password = properties.getProperty(PASSWORD_KEY); 
    if (userName == null || password == null) { 
     authentication = null; 
    } else { 
     authentication = new PasswordAuthentication(userName, password.toCharArray()); 
    } 
} 

protected PasswordAuthentication getPasswordAuthentication() { 
    return authentication; 
} 

और आप मुख्य विधि में यह रजिस्टर (या कहीं लाइन इससे पहले कि आप URL को कॉल साथ) उपयोग सरल है, लेकिन मुझे लगता है कि आप इन चीजों के बारे में आम तौर पर कैसे सोचते हैं, इसके लिए एपीआई को समेकित और पीछे की ओर मिलता है। सिंगलटन डिजाइन की सुंदर विशिष्ट।

+0

क्या आप कुछ नमूना कोड पोस्ट कर सकते हैं? जावाडोक कोई उदाहरण नहीं देता है, और यह जानना असंभव है कि वास्तव में इस वर्ग का उपयोग कैसे करें! – poundifdef

+3

ठीक है, तुम सिर्फ SetDefault कॉल करने के लिए है और यह thats '\t \t Authenticator.setDefault (नया प्रमाणक() { \t \t \t संरक्षित PasswordAuthentication getPasswordAuthentication() { \t \t \t \t वापसी नई PasswordAuthentication (" के लिए लॉग इन "" पारित ".toCharArray()); \t \t \t} \t \t});' मैं बहुत प्रभावित हूँ – user105413

+0

अच्छा सामान! एक आम तौर पर मुड़वाया जावा समाधान। ध्यान दें कि यह कहने के लिए और अधिक सही हो सकता है कि आपको प्रमाणीकरण वर्ग को लागू करने के बजाय विस्तार करने की आवश्यकता है; यह एक इंटरफ़ेस नहीं है ... – jsh

1

आप प्रपत्र http://user:[email protected]/path में अपने URL का निर्माण करने की कोशिश की है:

कोड आखिरी टिप्पणी में तैनात का उपयोग करना, मैं इस अपवाद मिल सकता है?

+0

यह मेरे ब्राउज़र में काम करता है लेकिन मेरे जावा प्रोग्राम – user105413

+0

में नहीं है क्षमा करें कि काम नहीं कर रहा है। ऐसा लगता है कि @Yishai wraps द्वारा निर्दिष्ट प्रमाणीकरणकर्ता की तरह तकनीक http://www.javaworld.com/javaworld/javatips/jw-javatip47.html – cmsjr

1

मैं अपाचे http://hc.apache.org/httpclient-3.x/ से HttpClient बाहर की जाँच इसे डाउनलोड करता है/के सत्यापन बहुत आसान

7

यह कुछ कोड है जो मैंने लिखा है जो एक वेबसाइट लाता है और System.out पर सामग्री प्रदर्शित करता है। इसके बाद के संस्करण कोड के साथ

import java.net.*; 
import java.io.*; 

public class foo { 
    public static void main(String[] args) throws Exception { 

    URL yahoo = new URL("http://www.MY_URL.com"); 

    String passwdstring = "USERNAME:PASSWORD"; 
    String encoding = new 
      sun.misc.BASE64Encoder().encode(passwdstring.getBytes()); 

    URLConnection uc = yahoo.openConnection(); 
    uc.setRequestProperty("Authorization", "Basic " + encoding); 

    InputStream content = (InputStream)uc.getInputStream(); 
    BufferedReader in = 
      new BufferedReader (new InputStreamReader (content)); 

    String line; 
    while ((line = in.readLine()) != null) { 
     System.out.println (line); 
    } 

    in.close(); 
} 

समस्याएं::

  1. इस कोड है नहीं उत्पादन के लिए तैयार (। लेकिन यह बात भर में हो जाता है)

  2. कोड पैदावार यह मूल प्रमाणीकरण का उपयोग करता है इस संकलक चेतावनी:

 
foo.java:11: warning: sun.misc.BASE64Encoder is Sun proprietary API and may be removed in a future release 
     sun.misc.BASE64Encoder().encode(passwdstring.getBytes()); 
      ^1 warning 

एक को वास्तव में प्रमाणीकरण वर्ग का उपयोग करना चाहिए, लेकिन मेरे जीवन के लिए, मैं यह नहीं समझ पाया कि मुझे और कैसे कोई उदाहरण नहीं मिला, जो सिर्फ यह दिखाने के लिए चला जाता है कि जावा लोग वास्तव में इसे पसंद नहीं करते हैं शांत चीजें करने के लिए अपनी भाषा का प्रयोग करें। :- पी

तो उपरोक्त अच्छा समाधान नहीं है, लेकिन यह काम करता है और बाद में आसानी से संशोधित किया जा सकता है।

+1

यदि आप बेस 64 एन्कोडर चाहते हैं, तो मैं iharder.net के कार्यान्वयन की अनुशंसा करता हूं। सार्वजनिक डोमेन, उससे अधिक स्वतंत्र नहीं हो सकता है। http://iharder.sourceforge.net/current/java/base64/ – Yishai

+0

यह वही है जो मुझे चाहिए, धन्यवाद। – Amalgovinus

+0

ग्रोवी के पास पहले से ही बेस 64 समर्थन है! बस passwd.getBytes()। EncodeBase64()। ToString() करें। Http://mrhaki.blogspot.com/2009/11/groovy-goodness-base64-encoding.html देखें –

0

यह ओपन सोर्स लाइब्रेरी, http://spnego.sourceforge.net, इसमें कुछ स्पष्टीकरण हैं जो इसका SpnegoHttpURLConnection क्लास का उपयोग कैसे करें।

कक्षा में रचनाकारों में से एक आपको उपयोगकर्ता नाम और पासवर्ड पास करने की अनुमति देता है।

उदाहरण के लिए कक्षा के जावा दस्तावेज़ पर नज़र डालें।

6

प्रमाणक के लिए अपने अधिभावी वर्ग लिखें:

import java.net.Authenticator; 
import java.net.PasswordAuthentication; 

public class MyAuthenticator extends Authenticator { 
    private static String username = ""; 
    private static String password = ""; 

    protected PasswordAuthentication getPasswordAuthentication() { 
     return new PasswordAuthentication (MyAuthenticator.username, 
       MyAuthenticator.password.toCharArray()); 
    } 

    public static void setPasswordAuthentication(String username, String password) { 
     MyAuthenticator.username = username; 
     MyAuthenticator.password = password; 
    } 
} 

अपने मुख्य वर्ग लिखें:

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.Authenticator; 
import java.net.MalformedURLException; 
import java.net.URL; 

public class MyMain{ 


    public static void main(String[] args) { 
     URL url; 
     InputStream is = null; 
     BufferedReader br; 
     String line; 

     // Install Authenticator 
     MyAuthenticator.setPasswordAuthentication("Username", "Password"); 
     Authenticator.setDefault (new MyAuthenticator()); 

     try { 
      url = new URL("Your_URL_Here"); 
      is = url.openStream(); // throws an IOException 
      br = new BufferedReader(new InputStreamReader(is)); 
      while ((line = br.readLine()) != null) { 
       System.out.println(line); 
      } 
     } catch (MalformedURLException mue) { 
      mue.printStackTrace(); 
     } catch (IOException ioe) { 
      ioe.printStackTrace(); 
     } finally { 
      try { 
       if (is != null) is.close(); 
      } catch (IOException ioe) { 
       // nothing to see here 
      } 
     } 

    } 

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