Java的认证者在每个连接的基础?
-
11-09-2019 - |
题
我建设,讨论到使用基本身份验证REST接口的Eclipse插件。如果验证失败,我想弹出我插件的设置对话框,然后重试。通常情况下,我可以使用静态Authenticator.setDefault()
设置一个认证为所有HttpURLConnection
的这一点,但因为我写一个插件,我不希望覆盖Eclipse的默认Authenticator
(org.eclipse.ui.internal.net.auth
);
我想在装货前设置我的自定义Authenticator
并把Eclipse的默认回来之后的,但我想这会导致各种种族问题与多线程,所以我很快就失去了这种说法。
谷歌搜索产生的结果的种种基本上是告诉我,这是不可能的:
在爪哇的URLConnection API应该有一个setAuthenticator(认证器),用于更容易地在需要认证的多线程环境中使用此类方法。
如果应用程序包含几个第三方插件和插件的每一个使用它自己的身份验证我们应该做些什么? “Authenticator.setDefault()” 方法的每一次调用的rewrite先前定义的身份验证...
有没有可能帮我解决这个问题有什么不同的办法?
解决方案
如果这是不可能用HttpURLConnection的我建议使用 HttpClient的库从Apache的。
一个简单的例子:
HttpClient client = new HttpClient();
client.getState().setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("test","test"));
GetMethod getMethod = new GetMethod("http://www.example.com/mylogin");
client.executeMethod(getMethod);
System.out.println(getMethod.getResponseBodyAsString());
其他提示
另一种方法是给自己的连接上执行基本认证。
final byte[] encodedBytes = Base64.encodeData((username + ':' + new String(password)).getBytes("iso-8859-1"));
final String encoded = new String(encodedBytes, "iso-8859-1");
connection.setRequestProperty("Authorization", "Basic " + encoded);
此也具有不需要的未认证请求上的后续请求提供凭证之前接收到401的优点。类似的行为可以在的Apache HTTP客户端通过请求抢先认证加以利用。
不隶属于 StackOverflow