2012-07-01 115 views
5

Iam嘗試通過https url驗證,但iam得到異常。以下是代碼。獲取錯誤java.io.IOException:服務器返回的HTTP響應代碼:401 for

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.io.StringWriter; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.net.URLConnection; 
import java.net.URLEncoder; 

import javax.net.ssl.HostnameVerifier; 
import javax.net.ssl.HttpsURLConnection; 
import javax.net.ssl.SSLSession; 

public class Authenticate { 

    /** 
    * @param args 
    */ 
    public void authenticateUrl() { 

     HostnameVerifier hv = new HostnameVerifier() { 

      @Override 
      public boolean verify(String urlHostName, SSLSession session) { 
       System.out.println("Warning: URL Host: " + urlHostName 
         + " vs. " + session.getPeerHost()); 
       return true; 
      } 
     }; 
     // Now you are telling the JRE to trust any https server. 
     // If you know the URL that you are connecting to then this should 
     // not be a problem 
     try { 
      trustAllHttpsCertificates(); 
     } catch (Exception e) { 
      System.out.println("Trustall" + e.getStackTrace()); 
     } 
     HttpsURLConnection.setDefaultHostnameVerifier(hv); 
     StringWriter sw = new StringWriter(); 
     PrintWriter pw = new PrintWriter(sw); 
     try { 
      URL url = new URL(
        "www.stackoverflow.com"); 

      // Popup Window to request username/password password 
      // MyAuthenticator ma = new MyAuthenticator(); 
      String userPassword = "user" + ":" + "pass"; 

      // Encode String 
      String encoding = URLEncoder.encode(userPassword, "UTF-8"); 

      // or 
      // String encoding = Base64Converter.encode 
      // (userPassword.getBytes()); 

      // Need to work with URLConnection to set request property 
      URLConnection uc = url.openConnection(); 

      uc.setRequestProperty("Authorization", "UTF-8" + encoding); 
      InputStream content = (InputStream) uc.getInputStream(); 
      BufferedReader in = new BufferedReader(new InputStreamReader(
        content)); 
      String line; 
      while ((line = in.readLine()) != null) { 
       pw.println(line); 
      } 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
      pw.println("Invalid URL"); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      pw.println("Error reading URL"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     sw.toString(); 
    } 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     Authenticate au = new Authenticate(); 
     au.authenticateUrl(); 
    } 

    // Just add these two functions in your program 

    public static class TempTrustedManager implements 
      javax.net.ssl.TrustManager, javax.net.ssl.X509TrustManager { 
     public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
      return null; 
     } 

     public boolean isServerTrusted(
       java.security.cert.X509Certificate[] certs) { 
      return true; 
     } 

     public boolean isClientTrusted(
       java.security.cert.X509Certificate[] certs) { 
      return true; 
     } 

     public void checkServerTrusted(
       java.security.cert.X509Certificate[] certs, String authType) 
       throws java.security.cert.CertificateException { 
      return; 
     } 

     public void checkClientTrusted(
       java.security.cert.X509Certificate[] certs, String authType) 
       throws java.security.cert.CertificateException { 
      return; 
     } 
    } 

    private static void trustAllHttpsCertificates() throws Exception { 

     // Create a trust manager that does not validate certificate chains: 

     javax.net.ssl.TrustManager[] trustAllCerts = 

     new javax.net.ssl.TrustManager[1]; 

     javax.net.ssl.TrustManager tm = new TempTrustedManager(); 

     trustAllCerts[0] = tm; 

     javax.net.ssl.SSLContext sc = 

     javax.net.ssl.SSLContext.getInstance("SSL"); 

     sc.init(null, trustAllCerts, null); 

     javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(

     sc.getSocketFactory()); 

    } 
} 

例外:

java.io.IOException: Server returned HTTP response code: 401 for URL: 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source) 
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unknown Source) 
    at Authenticate.authenticateUrl(Authenticate.java:62) 
    at Authenticate.main(Authenticate.java:84) 

請任何人都可以提出如何解決這個問題。

+0

我希望這不是你真正的用戶ID和密碼......如果是這樣,*** CHANGE立刻*** –

回答

13

401錯誤代碼表示「未經授權」。我相信你的代碼沒有正確編碼Authentication標頭。假設服務器需要一個基本接入認證的代碼應該是這樣的:

String credentials = "ptt" + ":" + "ptt123"; 
String encoding = Base64Converter.encode(credentials.getBytes("UTF-8")); 
URLConnection uc = url.openConnection(); 
uc.setRequestProperty("Authorization", String.format("Basic %s", encoding)); 

的HTTP基本的全面描述和摘要認證方案中RFC 2617

+1

優秀意想不到非常感謝,它爲我工作。 – developer

+1

+1它爲我工作...但我寧願使用'字符串編碼= org.apache.catalina.util.Base64.encode(credentials.getBytes(「UTF-8」));'感謝百萬 –

+0

+1我正在努力與正確的編碼器。這幫助了我。我使用的'org.apache.commons.codec.binary.Base64'對於基本授權*是錯誤的。 **正確的一個**是你的'org.apache.tools.ant.util.Base64Converter' – mattymanme

0

在這裏,您可以處理錯誤代碼401是可用。 使用HttpURLConnection的 這裏是我的代碼,請檢查是否可以幫助這個

URL Url = new URL(<your url string>); 
HttpURLConnection connection = (HttpURLConnection) Url.openConnection(); 
connection.setRequestProperty(<your request header); 
connection.setRequestMethod("GET"); 
connection.setDoInput(true); 
connection.connect(); 

int responseCode = connection.getResponseCode(); 

if (responseCode == 200) 
    { InputStream is = connection.getInputStream(); 
     if (is != null) 
     { BufferedReader rd = new BufferedReader(new InputStreamReader(is)); 
         response = rd.readLine(); 
        } 
} else { InputStream is = connection.getErrorStream(); 

      BufferedReader rd = new BufferedReader(new InputStreamReader(is)); 

     response = rd.readLine(); 

} if (response != null) 
     AppLog.e("Response-->", response); 
2

另一種簡單的方法是使用認證器

從文檔

身份驗證表示懂得如何獲取認證進行網絡連接的對象。通常,它會通過提示用戶提供信息來做到這一點。

URL url = null; 
try { 
    url = new URL("YOUR_URL"); 
    Authenticator.setDefault(new Authenticator() { 
     protected PasswordAuthentication getPasswordAuthentication() { 
      return new PasswordAuthentication("YOUR_USERNAME","YOUR_PASSWORD".toCharArray()); 
     } 
    }); 
}catch (MalformedURLException ex) { 
     e = new WebServiceException(ex); 
} 
相關問題