基于每个连接的Java身份验证器?

时间:2009-03-01 14:52:30

标签: java httpurlconnection authenticator

我正在构建一个与使用基本身份验证的REST接口对话的Eclipse插件。当身份验证失败时,我想弹出我的插件的设置对话框并重试。通常我可以使用静态Authenticator.setDefault()为此设置所有HttpURLConnection的身份验证器,但由于我正在编写插件,因此我不想覆盖Eclipse的默认Authenticator({ {1}});

我想在加载之前设置我的自定义org.eclipse.ui.internal.net.auth并在之后重新放置Eclipse的默认值,但我想这会导致多线程的种类问题,所以我很快就失去了这个概念。

谷歌搜索会产生各种结果,基本上告诉我这是不可能的:

  

Java URLConnection API应该有一个setAuthenticator(Authenticator)方法,以便在需要身份验证的多线程上下文中更容易使用此类。

Source

  

如果应用程序包含很少的第三方插件,并且每个插件都使用自己的身份验证器我们应该做什么?每次调用“Authenticator.setDefault()”方法都会重写先前定义的Authenticator ...

Source

是否有任何不同的方法可以帮助我克服这个问题?

2 个答案:

答案 0 :(得分:9)

如果无法使用HttpURLConnection,我建议使用Apache的httpclient库。

一个简单的例子:

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

答案 1 :(得分:1)

另一种方法是在连接上自己执行基本身份验证。

    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-client中利用类似的行为。