What Java properties to pass to a Java app to authenticate with a http proxy

后端 未结 3 1269
我在风中等你
我在风中等你 2021-01-19 18:53

I have a Java application that is trying to access a web service via http proxy. The Java app is 3rd party app for which we don\'t have access to source code.

Its la

相关标签:
3条回答
  • 2021-01-19 19:32

    Finally I figured out by trial and error. Passing java.net.useSystemProxies=true along with https.proxyPort, https.proxyHost resolved this.

    Basically the java vm command line got

    -Djava.net.useSystemProxies=true -Dhttps.proxyPort=80 -Dhttps.proxyHost=proxyserver.mycompany.com

    I didn't have to pass https.proxyUser, https.proxyPassword. I believe proxy authentication used the same credentials as my login NTLM credentials.

    0 讨论(0)
  • 2021-01-19 19:51

    One also needs to specify NT domain for NTLM authnetication to work.

    -Dhttp.proxyUser=MyDomain/username
    

    or by setting

    -Dhttp.auth.ntlm.domain=MyDomain
    

    And you also MUST explicitly instruct HttpClient to take system properties into account, which it does not do by default

     CloseableHttpClient client = HttpClients.createSystem();
    

    or

     CloseableHttpClient client = HttpClients.custom()
         .useSystemProperties()
         .build();
    
    0 讨论(0)
  • 2021-01-19 19:57

    A working example with Apache HttpClient 4.5.*

    Note: It does not work unless you use HttpClients.custom().useSystemProperties().build();

    System.setProperty("http.proxyHost" , "myhost");
    System.setProperty("http.proxyPort" , "myport");
    System.setProperty("http.proxyUser" , "myuser");
    System.setProperty("http.proxyPassword" , "mypassword");
    
    CloseableHttpClient httpclient = HttpClients.custom().useSystemProperties().build();
    
    try {
    
    HttpGet httpGet = new HttpGet("http://www.google.com");
    
    CloseableHttpResponse httpResponse = httpclient.execute(httpGet);
    
        try {
            System.out.println(httpResponse.getStatusLine());
            for (Header header : response.getAllHeaders()) {
                System.out.println("header " + header.getName() + " - " + header.getValue());
            }
    
            String responseString = EntityUtils.toString(httpResponse.getEntity());
            System.out.println("responseString :" + responseString);
    
        } finally {
            response.close();
        }
    } catch (Exception exception) {
        exception.printStackTrace();
    } finally {
        httpclient.close();
    }
    

    Instead of using System.setProperty you can set the properties with

    -Dhttp.proxyHost="myhost" -Dhttp.proxyPort="myport" -Dhttp.proxyUser=myuser -Dhttp.proxyPassword="mypassword"
    

    Important: If you try to access a HTTPS service you have to change the properties to https It also does not work if you use https.* properties and you access a http URL

    System.setProperty("https.proxyHost" , "myhost");
    System.setProperty("https.proxyPort" , "myport");
    System.setProperty("https.proxyUser" , "myuser");
    System.setProperty("https.proxyPassword" , "mypassword");
    
    CloseableHttpClient httpclient = HttpClients.custom().useSystemProperties().build();
    
    try {
        HttpGet httpGet = new HttpGet("https://www.google.com");
    

    API: https://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/

    Pure Java - without Apache HttpClient

    You can set the same https.proxyHost etc properties if you use the java.net.HttpURLConnection class

    Always respect using https.proxyHost etc for https://... connections and http.proxyHost etc for http://... connections!

    String uri = "https://www.google.com/";
    HttpURLConnection connection = (HttpURLConnection) new URL(uri).openConnection();
    
    InputStream response = connection.getInputStream();
    
    BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
    
    String inputLine; int x = 0;
    
    while ((inputLine = in.readLine()) != null) {
        System.out.println(inputLine);
        x++; if (x > 4) { break;}
    }
    in.close();
    response.close();
    
    0 讨论(0)
提交回复
热议问题