programing

JVM에서 사용하도록 프록시를 설정하려면 어떻게 해야 합니까?

prostudy 2022. 8. 28. 11:53
반응형

JVM에서 사용하도록 프록시를 설정하려면 어떻게 해야 합니까?

Java 앱은 인터넷에 연결해야 하는 경우가 많습니다.가장 일반적인 예는 XML 파일을 읽고 있고 스키마를 다운로드해야 할 때 발생합니다.

프록시 서버의 배후에 있습니다.프록시를 사용하도록 JVM을 설정하려면 어떻게 해야 합니까?

Java 매뉴얼(javadoc API가 아님)에서 다음 절차를 수행합니다.

http://download.oracle.com/javase/6/docs/technotes/guides/net/proxies.html

플래그를 합니다.JVM 플래그를 설정합니다.http.proxyHost ★★★★★★★★★★★★★★★★★」http.proxyPortJVM을 이용하다windowswindows))))windowswindowswindowswindowswindowswindowswindowswindowswindowswindowswindowswindowswindowswindowswindowswindowswindowswindowswindowswindowswindowswindowswindowswindowswindowswindowswindows 。유닉스

JAVA_FLAGS=-Dhttp.proxyHost=10.0.0.100 -Dhttp.proxyPort=8800
java ${JAVA_FLAGS} ...

JBoss나 WebLogic 등의 컨테이너를 사용하는 경우 벤더가 제공하는 시작 스크립트를 편집하는 것이 해결책입니다.

많은 개발자들이 Java API(javadocs)에 익숙하지만 대부분의 경우 문서의 나머지 부분은 간과됩니다.여기에는 많은 흥미로운 정보가 포함되어 있습니다.http://download.oracle.com/javase/6/docs/technotes/guides/


업데이트 : 프록시를 사용하여 일부 로컬/인트라넷호스트를 해결하지 않을 경우 @Tomalak에서 코멘트를 확인하십시오.

http.nonProxyHosts 속성도 잊지 마십시오.

-Dhttp.nonProxyHosts="localhost|127.0.0.1|10.*.*.*|*.foo.com‌​|etc"

시스템 프록시 설정을 사용하려면:

java -Djava.net.useSystemProxies=true ...

또는 프로그램적으로:

System.setProperty("java.net.useSystemProxies", "true");

출처 : http://docs.oracle.com/javase/7/docs/api/java/net/doc-files/net-properties.html

HTTP/HTTPS 또는 SOCKS 프록시를 프로그래밍 방식으로 설정하려면 다음 절차를 수행합니다.

...

public void setProxy() {
    if (isUseHTTPProxy()) {
        // HTTP/HTTPS Proxy
        System.setProperty("http.proxyHost", getHTTPHost());
        System.setProperty("http.proxyPort", getHTTPPort());
        System.setProperty("https.proxyHost", getHTTPHost());
        System.setProperty("https.proxyPort", getHTTPPort());
        if (isUseHTTPAuth()) {
            String encoded = new String(Base64.encodeBase64((getHTTPUsername() + ":" + getHTTPPassword()).getBytes()));
            con.setRequestProperty("Proxy-Authorization", "Basic " + encoded);
            Authenticator.setDefault(new ProxyAuth(getHTTPUsername(), getHTTPPassword()));
        }
    }
    if (isUseSOCKSProxy()) {
        // SOCKS Proxy
        System.setProperty("socksProxyHost", getSOCKSHost());
        System.setProperty("socksProxyPort", getSOCKSPort());
        if (isUseSOCKSAuth()) {
            System.setProperty("java.net.socks.username", getSOCKSUsername());
            System.setProperty("java.net.socks.password", getSOCKSPassword());
            Authenticator.setDefault(new ProxyAuth(getSOCKSUsername(), getSOCKSPassword()));
        }
    }
}

...

public class ProxyAuth extends Authenticator {
    private PasswordAuthentication auth;

    private ProxyAuth(String user, String password) {
        auth = new PasswordAuthentication(user, password == null ? new char[]{} : password.toCharArray());
    }

    protected PasswordAuthentication getPasswordAuthentication() {
        return auth;
    }
}

...

HTTP 프록시와 SOCKS 프록시는 네트워크 스택 내에서 서로 다른 레벨로 동작하므로 어느 한쪽 또는 양쪽을 사용할 수 있습니다.

이러한 플래그는 다음과 같이 프로그래밍 방식으로 설정할 수 있습니다.

if (needsProxy()) {
    System.setProperty("http.proxyHost",getProxyHost());
    System.setProperty("http.proxyPort",getProxyPort());
} else {
    System.setProperty("http.proxyHost","");
    System.setProperty("http.proxyPort","");
}

만 하면 됩니다.needsProxy(),getProxyHost() ★★★★★★★★★★★★★★★★★」getProxyPort()이 코드 스니펫은 언제든지 호출할 수 있습니다.

JVM은 프록시를 사용하여 HTTP 콜을 발신합니다.

System.getProperties().put("http.proxyHost", "someProxyURL");
System.getProperties().put("http.proxyPort", "someProxyPort");

사용자 설정 프록시를 사용할 수 있습니다.

System.setProperty("java.net.useSystemProxies", "true");

Sorter의 답변과 javabrett/Leonel의 답변을 조합하면 다음과 같습니다.

java -Dhttp.proxyHost=10.10.10.10 -Dhttp.proxyPort=8080 -Dhttp.proxyUser=username -Dhttp.proxyPassword=password -jar myJar.jar

프록시 서버에 대한 일부 속성을 jvm 매개 변수로 설정할 수 있습니다.

- Dhttp.proxyPort=8080, proxyHost 등

다만, 인증 프록시를 통과할 필요가 있는 경우는, 다음과 같은 오센티케이터가 필요합니다.

ProxyAuthenticator.java

import java.net.*;
import java.io.*;

public class ProxyAuthenticator extends Authenticator {

    private String userName, password;

    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(userName, password.toCharArray());
    }

    public ProxyAuthenticator(String userName, String password) {
        this.userName = userName;
        this.password = password;
    }
}

Example.java

    import java.net.Authenticator;
    import ProxyAuthenticator;

public class Example {

    public static void main(String[] args) {
        String username = System.getProperty("proxy.authentication.username");
        String password = System.getProperty("proxy.authentication.password");

                if (username != null && !username.equals("")) {
            Authenticator.setDefault(new ProxyAuthenticator(username, password));
        }

                // here your JVM will be authenticated

    }
}

이 답변에 따르면 http://mail-archives.apache.org/mod_mbox/jakarta-jmeter-user/200208.mbox/%3C494FD350388AD511A9DD00025530F33102F1DC2C@MMSX006%3E

속성을 다음으로 설정합니다.true예를 들어 JAVA_를 사용하여 설정할 수 있습니다.TOOL_OPTIONS 환경 변수.예를 들어 Ubuntu에서는 다음 행을 에 추가할 수 있습니다..bashrc:

내보내기 JAVA_TOOL_OPTIONS+=" -Djava.net.useSystemProxies=true"

다음은 Java에서 명령줄에서 프록시 사용자프록시 암호를 사용하여 프록시를 설정하는 방법을 보여 줍니다. 이는 매우 일반적인 경우입니다.우선, 패스워드나 호스트는 코드에 보존하지 말아 주세요.

-D를 사용하여 명령줄에 시스템 속성을 전달하고 시스템을 사용하여 코드로 설정합니다.setProperty("name", "value")는 동일합니다.

단, 이것만은 주의해 주세요.

유효한 예:

C:\temp>java -Dhttps.proxyHost=host -Dhttps.proxyPort=port -Dhttps.proxyUser=user -Dhttps.proxyPassword="password" -Djavax.net.ssl.trustStore=c:/cacerts -Djavax.net.ssl.trustStorePassword=changeit com.andreas.JavaNetHttpConnection

그러나 다음 기능은 작동하지 않습니다.

C:\temp>java com.andreas.JavaNetHttpConnection -Dhttps.proxyHost=host -Dhttps.proxyPort=port -Dhttps=proxyUser=user -Dhttps.proxyPassword="password" -Djavax.net.ssl.trustStore=c:/cacerts -Djavax.net.ssl.trustStorePassword=changeit

유일한 차이점은 시스템 속성의 위치입니다! (수업 전과 후)

비밀번호에 특수문자가 있는 경우 위의 예시와 같이 "@MyPass123%" 따옴표로 묶을 수 있습니다.

서비스에 하는 는, HTTPS 를 사용할 .https.proxyHost,https.proxyPort★★★★★★★★★★★★★★★.

서비스에 하는 는, 를 사용할 가 있습니다.http.proxyHost,http.proxyPort★★★★★★★★★★★★★★★.

XML 파일 읽기 및 스키마 다운로드 필요

인터넷을 통해 스키마 또는 DTD를 검색할 경우 느리고 수다스럽고 취약한 응용 프로그램을 구축하고 있습니다.파일을 호스트하고 있는 리모트서버에 계획 또는 계획 외의 다운타임이 발생하면 어떻게 됩니까?앱이 고장났습니다.괜찮겠어?

http://xml.apache.org/commons/components/resolver/resolver-article.html#s.catalog.files 를 참조해 주세요.

스키마 등의 URL은 고유 식별자로 가장 적합합니다.실제로 해당 파일에 원격으로 액세스하기 위한 요청이 아닙니다."XML 카탈로그"에서 Google 검색을 수행합니다.XML 카탈로그를 사용하면 이러한 리소스를 로컬로 호스트할 수 있으므로 저속, 처짐 및 취약성을 해결할 수 있습니다.

기본적으로 원격 콘텐츠의 영구 캐시 복사본입니다.리모트 컨텐츠는 변경되지 않기 때문에 괜찮습니다.업데이트가 있다면 다른 URL에 있을 것입니다. 인터넷을 통해 리소스를 실제로 검색하는 것은 특히 바보같습니다.

나도 방화벽 뒤에 있어, 이건 나한테 효과가 있었어!!

System.setProperty("http.proxyHost", "proxy host addr");
System.setProperty("http.proxyPort", "808");
Authenticator.setDefault(new Authenticator() {
    protected PasswordAuthentication getPasswordAuthentication() {

        return new PasswordAuthentication("domain\\user","password".toCharArray());
    }
});

URL url = new URL("http://www.google.com/");
URLConnection con = url.openConnection();

BufferedReader in = new BufferedReader(new InputStreamReader(
                    con.getInputStream()));

// Read it ...
String inputLine;
while ((inputLine = in.readLine()) != null)
    System.out.println(inputLine);

in.close();

"Socks Proxy"를 원하는 경우 "socks Proxy Host" 및 "socks Proxy Port" VM 인수를 알립니다.

예.

java -DsocksProxyHost=127.0.0.1 -DsocksProxyPort=8080 org.example.Main

프록시 뒤에 있는 URL에 연결하기 전에 이 항목을 추가하십시오.

System.getProperties().put("http.proxyHost", "someProxyURL");
System.getProperties().put("http.proxyPort", "someProxyPort");
System.getProperties().put("http.proxyUser", "someUserName");
System.getProperties().put("http.proxyPassword", "somePassword");

이는 마이너 업데이트이지만 Java 7 이후 프록시 연결을 시스템 속성이 아닌 프로그래밍 방식으로 생성할 수 있게 되었습니다.이것은, 다음의 경우에 도움이 됩니다.

  1. 프로그램 실행 중에 프록시를 동적으로 순환해야 합니다.
  2. 다중 병렬 프록시를 사용해야 합니다.
  3. 또는 코드를 더 깔끔하게 만들 수도 있습니다. : )

다음은 groovy의 의도된 예입니다.

// proxy configuration read from file resource under "proxyFileName"
String proxyFileName = "proxy.txt"
String proxyPort = "1234"
String url = "http://www.promised.land"
File testProxyFile = new File(proxyFileName)
URLConnection connection

if (!testProxyFile.exists()) {

    logger.debug "proxyFileName doesn't exist.  Bypassing connection via proxy."
    connection = url.toURL().openConnection()

} else {
    String proxyAddress = testProxyFile.text
    connection = url.toURL().openConnection(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyAddress, proxyPort)))
}

try {
    connection.connect()
}
catch (Exception e) {
    logger.error e.printStackTrace()
}

풀 레퍼런스 : http://docs.oracle.com/javase/7/docs/technotes/guides/net/proxies.html

최근에 JVM에서 브라우저 프록시 설정을 사용하도록 허용하는 방법을 발견했습니다.당신이 해야 할 일은,${java.home}/lib/deploy.jar다음과 같이 라이브러리를 초기화합니다.

import com.sun.deploy.net.proxy.DeployProxySelector;
import com.sun.deploy.services.PlatformType;
import com.sun.deploy.services.ServiceManager;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public abstract class ExtendedProxyManager {

    private static final Log logger = LogFactory.getLog(ExtendedProxyManager.class);

    /**
     * After calling this method, proxy settings can be magically retrieved from default browser settings.
     */
    public static boolean init() {
        logger.debug("Init started");

        // Initialization code was taken from com.sun.deploy.ClientContainer:
        ServiceManager
                .setService(System.getProperty("os.name").toLowerCase().indexOf("windows") != -1 ? PlatformType.STANDALONE_TIGER_WIN32
                        : PlatformType.STANDALONE_TIGER_UNIX);

        try {
            // This will call ProxySelector.setDefault():
            DeployProxySelector.reset();
        } catch (Throwable throwable) {
            logger.error("Unable to initialize extended dynamic browser proxy settings support.", throwable);

            return false;
        }

        return true;
    }
}

그 후 프록시 설정은 를 통해 Java API에서 사용할 수 있습니다.java.net.ProxySelector.

이 접근방식의 유일한 문제는 JVM을 다음 방법으로 시작해야 한다는 것입니다.deploy.jar예를 들어, bootclasspath에 있습니다.java -Xbootclasspath/a:"%JAVA_HOME%\jre\lib\deploy.jar" -jar my.jar이 한계를 극복하는 방법을 아는 사람이 있으면 알려주세요.

저는 괜찮습니다.

public void setHttpProxy(boolean isNeedProxy) {
    if (isNeedProxy) {
        System.setProperty("http.proxyHost", getProxyHost());
        System.setProperty("http.proxyPort", getProxyPort());
    } else {
        System.clearProperty("http.proxyHost");
        System.clearProperty("http.proxyPort");
    }
}

P/S: 저는 GHAD의 답변을 바탕으로 합니다.

다른 답변에서 지적한 바와 같이 인증된 프록시를 사용해야 하는 경우 명령줄 변수만으로 이 작업을 수행할 수 있는 신뢰할 수 있는 방법은 없습니다. 다른 사용자의 응용 프로그램을 사용하고 있고 소스 코드를 조작하고 싶지 않은 경우 번거롭습니다.

Will Iverson은 "Using HttpProxy"에서 Proxy(Mac OS X 및 Windows의 경우 http://www.proxifier.com/)와 같은 프록시 관리 도구를 사용하여 이를 처리하기 위한 유용한 제안을 합니다.

예를 들어 Proxifier를 사용하면 관리 및 리다이렉트되는 Java 명령만 대행 수신하도록 설정할 수 있습니다(인증된).이 경우 proxyHost 및 proxyPort 값을 공백으로 설정합니다(예: 전달).-Dhttp.proxyHost= -Dhttp.proxyPort=java 명령으로 이동합니다.

스탠드아론 JVM 내에 있지만 기동 스크립트를 변경하거나 어플리케이션서버(jboss 또는 Tomcat 제외) 내에서 이 처리를 하지 않는 경우 http.proxy* JVM 변수를 사용할 수 있습니다.대신 JAVA Proxy API(시스템이 아닌)를 사용해야 합니다.setProperty) 또는 벤더 고유의 구성 옵션을 사용합니다.WebSphere와 WebLogic 모두 J2SE보다 훨씬 강력한 프록시를 설정하는 매우 정의된 방법을 가지고 있습니다.또한 WebSphere 및 WebLogic의 경우 시작 스크립트(특히 프록시를 사용하도록 지시하는 서버의 상호 운영 프로세스...)를 재정의하여 애플리케이션 서버를 거의 손상시키지 않을 수 있습니다.

WINHTTP 의 설정도 유효하다고 생각합니다.

Windows Update를 포함한 많은 프로그램에서 프록시의 배후에 문제가 발생하고 있습니다.WINHTTP 를 셋업 하면, 항상 이러한 문제를 해결할 수 있습니다.

언급URL : https://stackoverflow.com/questions/120797/how-do-i-set-the-proxy-to-be-used-by-the-jvm

반응형