代码之家  ›  专栏  ›  技术社区  ›  Martijn Laarman

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

  •  14
  • Martijn Laarman  · 技术社区  · 17 年前

    我正在构建一个Eclipse插件,它与使用基本身份验证的REST接口通信。当认证失败时,我想弹出插件的设置对话框并重试。通常我可以用静电传感器 Authenticator.setDefault() 为所有用户设置身份验证程序 HttpURLConnection 是为了这个,但是因为我正在写一个插件,所以我不想覆盖Eclipse的默认值 Authenticator ( org.eclipse.ui.internal.net.auth );

    我想定下我的习惯 在加载Eclipse的默认值并将其放回之前,但我认为这会导致多线程的各种争用问题,所以我很快就失去了这种想法。

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

    Source

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

    Source

    有没有什么不同的方法可以帮助我克服这个问题?

    2 回复  |  直到 15 年前
        1
  •  11
  •   Rich    17 年前

    如果无法使用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());
    
        2
  •  2
  •   Brett Okken    13 年前

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

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