2012-05-07 176 views
13

我正在使用Java訪問以XML格式返回顯示的HTTPS站點。我在URL本身傳遞登錄憑證。這裏是代碼片段:服務器返回的HTTP響應代碼:401的URL:https

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
DocumentBuilder db = dbf.newDocumentBuilder(); 
requestURL = "https://Administrator:[email protected]:8443/abcd"; 

try { 
     InputStream is = null; 
     URL url = new URL(requestURL); 
     InputStream xmlInputStream =new URL(requestURL).openConnection().getInputStream(); 
     byte[] testByteArr = new byte[xmlInputStream.available()]; 
     xmlInputStream.read(testByteArr); 
     System.out.println(new String(testByteArr)); 
     Document doc = db.parse(xmlInputStream); 
     System.out.println("DOC="+doc); 
    } catch (MalformedURLException e) { 
    } 

我在程序中創建一個不驗證簽名/未簽名證書的信任管理器。但是,在運行上面的程序,我得到的錯誤 服務器返回的HTTP響應代碼:401網址:https://Administrator:[email protected]:8443/abcd

我可以使用相同的網址上我的瀏覽器並正確顯示XML。請讓我知道如何在Java程序中完成這項工作。

回答

24

401表示「未經授權」,所以必須有您的憑證。

我認爲java URL不支持您顯示的語法。您可以改用Authenticator。

Authenticator.setDefault(new Authenticator() { 

    @Override 
    protected PasswordAuthentication getPasswordAuthentication() {   
     return new PasswordAuthentication(login, password.toCharArray()); 
    } 
}); 

然後只需調用常規url,不需要憑據。

另一種選擇是提供一個頭的憑據:

String loginPassword = login+ ":" + password; 
String encoded = new sun.misc.BASE64Encoder().encode (loginPassword.getBytes()); 
URLConnection conn = url.openConnection(); 
conn.setRequestProperty ("Authorization", "Basic " + encoded); 

PS:不建議使用Base64Encoder但這只是表明一個快速的解決方案。如果你想保留這個解決方案,找一個能做的庫。有很多。

+1

感謝紀堯姆波萊。第二種選擇就像魅力一樣。我只需要它進行內部測試,所以我認爲這可能就夠了。 – Vish

+1

謝謝Polet。第二個選項幫助了我。 –

1

試試這個。您需要通過身份驗證,讓服務器知道其有效的用戶。您需要導入這兩個軟件包,並且必須包含一個jersy jar。如果你不想包括jersy罐子,然後導入這個包

import sun.misc.BASE64Encoder; 

import com.sun.jersey.core.util.Base64; 
import sun.net.www.protocol.http.HttpURLConnection; 

然後,

String encodedAuthorizedUser = getAuthantication("username", "password"); 
URL url = new URL("Your Valid Jira URL"); 
HttpURLConnection httpCon = (HttpURLConnection) url.openConnection(); 
httpCon.setRequestProperty ("Authorization", "Basic " + encodedAuthorizedUser); 

public String getAuthantication(String username, String password) { 
    String auth = new String(Base64.encode(username + ":" + password)); 
    return auth; 
} 
相關問題