如何在Java中设置Azure(版本1.1.2)上的代理开发?

问题描述:

我使用如下代码,但总是有错误:如何在Java中设置Azure(版本1.1.2)上的代理开发?

public static void connect(CloudCredentials credentials, final CloudProxy proxy) throws Exception { 
    ApplicationTokenCredentials azCredential = new ApplicationTokenCredentials(credentials.getClientID(), 
      credentials.getTenantID(), credentials.getClientKey(), AzureEnvironment.AZURE); 
    try { 
     Configurable config = Azure.configure() 
       .withConnectionTimeout(30, TimeUnit.SECONDS) 
       .withReadTimeout(60, TimeUnit.SECONDS); 
     if (proxy != null) { 
      config.withProxy(new Proxy(Type.HTTP, new InetSocketAddress(proxy.getProxyHost(), proxy 
        .getProxyPort()))); 
      if (proxy.getProxyUsername() != null && proxy.getProxyUsername().trim().length() > 0) { 
       Authenticator.setDefault(new Authenticator() { 
        @Override 
        protected PasswordAuthentication getPasswordAuthentication() { 
         return new PasswordAuthentication(proxy.getProxyUsername(), proxy.getProxyPassword() 
           .toCharArray()); 
        } 
       }); 
       config.withProxyAuthenticator(new JavaNetAuthenticator()); 
      } 
     } 
     Authenticated authenticate = config.authenticate(azCredential); 
     authenticate.withSubscription(credentials.getSubscription()).getCurrentSubscription().displayName(); 
     System.out.println(authenticate); 
    } catch (Exception e) { 
     System.out.println(e); 
    } 
} 
 
[pool-1-thread-1] ERROR com.microsoft.aad.adal4j.AuthenticationContext - [Correlation ID: ] Request to acquire token failed. 
java.io.IOException: Unable to tunnel through proxy. Proxy returns "HTTP/1.1 407 Proxy Authentication Required" 
    at sun.net.www.protocol.http.HttpURLConnection.doTunneling(HttpURLConnection.java:2124) 
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:183) 
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream0(HttpURLConnection.java:1316) 
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1291) 
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:250) 
    at com.microsoft.aad.adal4j.AdalOAuthRequest.configureHeaderAndExecuteOAuthCall(AdalOAuthRequest.java:140) 
    at com.microsoft.aad.adal4j.AdalOAuthRequest.send(AdalOAuthRequest.java:83) 
    at com.microsoft.aad.adal4j.AdalTokenRequest.executeOAuthRequestAndProcessResponse(AdalTokenRequest.java:80) 
    at com.microsoft.aad.adal4j.AuthenticationContext.acquireTokenCommon(AuthenticationContext.java:818) 
    at com.microsoft.aad.adal4j.AuthenticationContext.access$100(AuthenticationContext.java:66) 
    at com.microsoft.aad.adal4j.AuthenticationContext$1.call(AuthenticationContext.java:174) 
    at com.microsoft.aad.adal4j.AuthenticationContext$1.call(AuthenticationContext.java:163) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
java.lang.RuntimeException: java.io.IOException: java.io.IOException: Unable to tunnel through proxy. Proxy returns "HTTP/1.1 407 Proxy Authentication Required" 

,但我相信代理它的确定。我有另一个测试代码。它工作得很好:

String a = "111"; 
    System.out.print(a.toCharArray()); 

    Authenticator.setDefault(new Authenticator() { 
     public PasswordAuthentication getPasswordAuthentication() { 
      return new PasswordAuthentication("test", "111".toCharArray()); 
     } 
    }); 
    URLConnection connection; 
    try { 
     connection = new URL(
       "http://devio.us/~ricky/stackoverflow-protected/nothingtosee.html") 
       .openConnection(new Proxy(Type.HTTP, new InetSocketAddress("192.168.1.59", 808))); 

     System.out.println(new BufferedReader(new InputStreamReader(
       connection.getInputStream(), "UTF-8")).readLine()); 

    } catch (MalformedURLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 

我不想使用System.setProperty设置代理,因为所有的Java连接将通过代理。 和Azure文档中我没有找到任何代理信息。 谁能帮帮我?非常感谢你。

+0

任何进展?我的答案可以帮助你吗? –

现在,默认情况下,为HTTPS设置隧道 时需要基本身份验证的代理将不再成功。如果需要,可以通过从 jdk.http.auth.tunneling.disabledSchemes网络属性中删除基本,或者通过 在 命令行上将相同名称的系统属性设置为“”(空)来重新激活此 认证方案。

你可以从Disable Basic authentication for HTTPS tunneling找到它。

所以,你可以在你的jdk/jre/lib directory找到你的net.properties文件。 (对我来说,它是C:\Program Files\Java\jdk1.8.0_144\jre\lib)。

然后改变变量

jdk.http.auth.tunneling.disabledSchemes 
jdk.http.auth.proxying.disabledSchemes 

空,如:

jdk.http.auth.tunneling.disabledSchemes= 
jdk.http.auth.proxying.disabledSchemes= 

,请重试你的代码。任何关注,请随时让我知道。