135

認証が必要な Java のリモート URL に接続するにはどうすればよいですか。次のコードを変更して、プログラムでユーザー名/パスワードを提供できるようにして、401 がスローされないようにする方法を見つけようとしています。

URL url = new URL(String.format("http://%s/manager/list", _host + ":8080"));
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
4

12 に答える 12

141

次のように、http リクエストのデフォルトのオーセンティケーターを設定できます。

Authenticator.setDefault (new Authenticator() {
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication ("username", "password".toCharArray());
    }
});

また、より柔軟性が必要な場合は、より多くの認証オプション (およびセッション サポートなど) を提供するApache HttpClientを確認できます。

于 2009-01-30T18:51:15.743 に答える
139

あなたの呼び出しに対してのみ機能する、ネイティブで邪魔にならない代替手段があります。

URL url = new URL(“location address”);
URLConnection uc = url.openConnection();
String userpass = username + ":" + password;
String basicAuth = "Basic " + new String(Base64.getEncoder().encode(userpass.getBytes()));
uc.setRequestProperty ("Authorization", basicAuth);
InputStream in = uc.getInputStream();
于 2011-02-28T01:42:29.887 に答える
81

また、外部パッケージを使用する必要のない次のものを使用することもできます。

URL url = new URL(“location address”);
URLConnection uc = url.openConnection();

String userpass = username + ":" + password;
String basicAuth = "Basic " + javax.xml.bind.DatatypeConverter.printBase64Binary(userpass.getBytes());

uc.setRequestProperty ("Authorization", basicAuth);
InputStream in = uc.getInputStream();
于 2012-09-26T14:08:25.557 に答える
46

プロトコルとドメインの間でユーザー名とパスワードを入力する際に​​通常のログインを使用している場合、これはより簡単です。また、ログインの有無にかかわらず機能します。

サンプル URL: http://user:pass@domain.com/url

URL url = new URL("http://user:pass@domain.com/url");
URLConnection urlConnection = url.openConnection();

if (url.getUserInfo() != null) {
    String basicAuth = "Basic " + new String(new Base64().encode(url.getUserInfo().getBytes()));
    urlConnection.setRequestProperty("Authorization", basicAuth);
}

InputStream inputStream = urlConnection.getInputStream();

以下の valerybodak からのコメントに、Android 開発環境での実行方法を記載してください。

于 2012-10-29T13:00:12.447 に答える
7

HttpsURLConnection を使用して認証を設定できました

           URL myUrl = new URL(httpsURL);
            HttpsURLConnection conn = (HttpsURLConnection)myUrl.openConnection();
            String userpass = username + ":" + password;
            String basicAuth = "Basic " + new String(Base64.getEncoder().encode(userpass.getBytes()));
            //httpsurlconnection
            conn.setRequestProperty("Authorization", basicAuth);

この投稿から取得したいくつかの変更。Base64 は java.util パッケージからのものです。

于 2019-03-26T18:53:20.113 に答える
4

「Base64().encode()」アプローチには十分注意してください。生成された文字列の末尾に \r\n が追加されるため、私のチームと私は 400 件の Apache の不正なリクエストの問題を抱えています。

Wireshark のおかげでパケットを盗聴していることがわかりました。

これが私たちの解決策です:

import org.apache.commons.codec.binary.Base64;

HttpGet getRequest = new HttpGet(endpoint);
getRequest.addHeader("Authorization", "Basic " + getBasicAuthenticationEncoding());

private String getBasicAuthenticationEncoding() {

        String userPassword = username + ":" + password;
        return new String(Base64.encodeBase64(userPassword.getBytes()));
    }

それが役に立てば幸い!

于 2014-06-05T22:23:34.403 に答える
3

このコードを基本認証に使用します。

URL url = new URL(path);
String userPass = "username:password";
String basicAuth = "Basic " + Base64.encodeToString(userPass.getBytes(), Base64.DEFAULT);//or
//String basicAuth = "Basic " + new String(Base64.encode(userPass.getBytes(), Base64.No_WRAP));
HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
urlConnection.setRequestProperty("Authorization", basicAuth);
urlConnection.connect();

于 2017-05-29T07:58:00.860 に答える
0

ANDRODの実装 ユーザー名とパスワードによる承認を要求する Web サービスからデータ/文字列応答を要求する完全な方法

public static String getData(String uri, String userName, String userPassword) {
        BufferedReader reader = null;
        byte[] loginBytes = (userName + ":" + userPassword).getBytes();

        StringBuilder loginBuilder = new StringBuilder()
                .append("Basic ")
                .append(Base64.encodeToString(loginBytes, Base64.DEFAULT));

        try {
            URL url = new URL(uri);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.addRequestProperty("Authorization", loginBuilder.toString());

            StringBuilder sb = new StringBuilder();
            reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String line;
            while ((line = reader.readLine())!= null){
                sb.append(line);
                sb.append("\n");
            }

            return  sb.toString();

        } catch (Exception e) {
            e.printStackTrace();
            return null;
        } finally {
            if (null != reader){
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
于 2016-12-15T23:04:18.030 に答える