【问题标题】:J2SE Proxy AuthenticationJ2SE 代理身份验证
【发布时间】:2009-08-12 20:57:18
【问题描述】:

我们使用 2 SIMILAR Microsoft ISA Proxy Server 2003 连接到互联网。 每个代理都有不同的登录方式,如下:

Server-1 : nt-domain\alan 服务器2:alan@love-u.com

通过 Wifi 登录 IE、Firefox 和我的 Phonecell 都很好。 但是,当我们运行 Java 应用程序 J2SE Ver 4、5 和 6 时,会出现问题, 需要互联网身份验证的地方。 登录到 Server-2 正常,但登录到 Server-2 失败(样式:alan@domain.com)。

注意:两个代理都使用 Windows 身份验证,输入:negotiate NTLM

如果您可以提供帮助或有任何建议,请欣赏。

谢谢,

艾伦·L

【问题讨论】:

标签: java proxy


【解决方案1】:

java documentation 描述了如何在 java 中启用 NTLM 身份验证。如果您有权访问源代码,则可以按照"proxy" 文章中所述以编程方式添加系统属性,添加如下内容(另请参见axis2 的discussion):

System.setProperty("http.auth.ntlm.domain", mydomain);

如果您无法访问源代码,您可以在启动 java 二进制文件的命令行上设置属性,添加如下内容:

java -DproxyHost=host  -DproxyPort=8080  -Dhttp.auth.ntlm.domain=mydomain  ...

【讨论】:

    【解决方案2】:

    有一些很好的库可以帮助您解决这个问题。 Proxy Vole(Java 的网络代理自动检测)可以帮助您使用与 Internet Explorer 相同的代理设置来通过代理进行身份验证。

    要为您的 Java 应用程序提供开箱即用的网络连接,您可以使用 Proxy - Vole 库。它提供了一些自动检测当前代理设置的策略。有许多可配置的策略可供选择。目前 Proxy - Vole 支持以下代理检测策略。

    • 读取平台设置(支持:Windows、KDE、Gnome)
    • 读取浏览器设置(支持:Firefox 3.x、Internet Explorer)
    • 读取环境变量(Linux/Unix服务器系统上常用的变量)
    • 使用 WPAD/PAC 自动检测脚本(仅支持部分功能)

    【讨论】:

    • 谢谢凯西,我已经更新了你提到的地址的链接
    【解决方案3】:

    您正在运行应用程序还是小程序?小程序可以搭载浏览器的代理身份验证机制。

    我建议先使用cURL 通过您的代理连接,然后查看发生的握手。代理服务器将为客户端提供一个身份验证方法列表。

    如果用户和密码是固定的,您有时只需将标题从浏览器会话中取出,然后在您的代码中使用它。例如,我可以将此标头添加到请求中,代理会将我视为已通过身份验证:

    Proxy-Authorization: Basic AbCdEfGhOjk==
    

    【讨论】:

      【解决方案4】:

      使用 apache-commons httpClient(版本 3),我有以下代码。它没有经过很好的测试(如果有的话),但我认为它曾经工作过.. :) 这是为了以防您可以修改程序。如果它们是一些 3rd 方包,您无能为力。

      
      String proxyHost = System.getProperty("https.proxyHost");
                      int proxyPort = 0;
                      try {
                          proxyPort = Integer.parseInt(System
                                  .getProperty("https.proxyPort"));
                      } catch (Exception ex) {
                          //
                      }
      
      
                  System.setProperty("java.net.useSystemProxies", "true");
      
                  ProxySelector ps = ProxySelector.getDefault();
                  List<Proxy> proxyList = ps.select(new URI(targetUrl));
                  Proxy proxy = proxyList.get(0);
                  if (proxy != null) {
                      InetSocketAddress addr = ((InetSocketAddress) proxy
                              .address());
                      if (addr != null) {
                          proxyHost = addr.getHostName();
                          proxyPort = addr.getPort();
                      }
                  }
      
                  boolean useProxy = proxyHost != null && proxyHost.length() > 0;
      
                  if (useProxy) {
                      httpClient.getHostConfiguration().setProxy(proxyHost,
                              proxyPort);
                  }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-28
        • 2023-03-25
        • 2020-12-07
        • 2013-07-31
        • 1970-01-01
        • 1970-01-01
        • 2021-10-10
        • 1970-01-01
        相关资源
        最近更新 更多