18

Java を使用して、表示を XML 形式で返す HTTPS サイトにアクセスしています。URL 自体でログイン資格情報を渡します。コード スニペットは次のとおりです。

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
requestURL = "https://Administrator:Password@localhost: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 for URL: https://Administrator:Password@localhost:8443/abcdというエラーが表示されます。

ブラウザで同じ URL を使用すると、xml が正しく表示されます。Javaプログラム内でこれを機能させる方法を教えてください。

4

2 に答える 2

34

401 は「無許可」を意味するため、資格情報に何かがあるはずです。

URLJavaはあなたが示している構文をサポートしていないと思います。代わりにオーセンティケータを使用できます。

Authenticator.setDefault(new Authenticator() {

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

次に、資格情報なしで通常の URL を呼び出すだけです。

もう 1 つのオプションは、ヘッダーで資格情報を提供することです。

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

PS: その Base64Encoder を使用することはお勧めしませんが、これは簡単な解決策を示すためだけのものです。その解決策を維持したい場合は、そうするライブラリを探してください。たくさんあります。

于 2012-05-07T10:16:15.007 に答える