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

2022-09-03 07:27:21

我正在构建一个Eclipse插件,它与使用基本身份验证的REST接口进行通信。当身份验证失败时,我想弹出插件的设置对话框并重试。通常,我可以使用静态来为此设置一个身份验证器,但是由于我正在编写一个插件,我不想覆盖Eclipse的默认值。Authenticator.setDefault()HttpURLConnectionAuthenticator (org.eclipse.ui.internal.net.auth);

我想过在加载之前设置我的自定义,然后在之后将Eclipse的默认设置回去,但我想这会导致多线程的各种竞争问题,所以我很快就失去了这个想法。Authenticator

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

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

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

是否有任何不同的方法可以帮助我解决此问题?


答案 1

如果使用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());

答案 2

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

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


推荐