当前位置:  开发笔记 > 编程语言 > 正文

连接到需要使用Java进行身份验证的远程URL

如何解决《连接到需要使用Java进行身份验证的远程URL》经验,为你挑选了5个好方法。

如何连接到需要身份验证的Java远程URL.我试图找到一种方法来修改以下代码,以便能够以编程方式提供用户名/密码,因此它不会抛出401.

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

James Van Hu.. 127

您可以为http请求设置默认验证器,如下所示:

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

此外,如果您需要更多灵活性,可以查看Apache HttpClient,它将为您提供更多身份验证选项(以及会话支持等)



1> James Van Hu..:

您可以为http请求设置默认验证器,如下所示:

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

此外,如果您需要更多灵活性,可以查看Apache HttpClient,它将为您提供更多身份验证选项(以及会话支持等)


是否可以为每个特定的`URL.openConnection()调用设置特定的`Authenticator`而不是全局设置?
你如何处理错误的身份验证事件?[例如,如果用户提供与任何内容不匹配的用户名和密码身份验证凭据]?
响应@YuriyNakonechnyy ...如果您使用的是Java 9或更高版本,则可以调用`HttpURLConnection.setAuthenticator()`。不幸的是,在Java 8和更早版本中,Authenticator实例是JVM范围的全局变量。参见:https://docs.oracle.com/javase/9​​/docs/api/java/net/HttpURLConnection.html#setAuthenticator-java.net.Authenticator-
上面的代码可以工作,但是对于最新的内容是非常隐含的.那里有子类化和方法覆盖,如果你想知道发生了什么,请深入研究这些类的文档.这里的代码更明确[javacodegeeks](http://examples.javacodegeeks.com/core-java/net/authenticator/access-password-protected-url-with-authenticator/)

2> Wanderson Sa..:

这是一种原生的,不那么具有侵入性的选择,仅适用于您的通话.

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();


Base64类可以由Apache Commons Codec提供.

3> 小智..:

您还可以使用以下内容,不需要使用外部包:

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();


我一直在寻找Java标准包内的Base64编码器这么久!谢谢
感谢指向"原生"Base64编码器的指针!

4> javabeangrin..:

If you are using the normal login whilst entering the username and password between the protocol and the domain this is simpler. It also works with and without login.

Sample 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();



5> DaniEll..:

当我来到这里寻找Android-Java-Answer时,我将做一个简短的总结:

    使用James van Huis所示的java.net.Authenticator

    使用Apache Commons HTTP Client,如本答案中所述

    使用基本java.net.URLConnection中并手动设置认证报头所示一样在这里

如果你想在Android中使用带有基本身份验证的java.net.URLConnection,请尝试以下代码:

URL url = new URL("http://www.mywebsite.com/resource");
URLConnection urlConnection = url.openConnection();
String header = "Basic " + new String(android.util.Base64.encode("user:pass".getBytes(), android.util.Base64.NO_WRAP));
urlConnection.addRequestProperty("Authorization", header);
// go on setting more request headers, reading the response, etc

推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有