将Java XML Transformer与网络代理一起使用

时间:2012-02-23 10:18:29

标签: java xml networking transform

我想用javax.xml.transform.Transformer转换XML文件,但我的网络访问权限通过代理。

我尝试在转换器中使用新的URIResolver,但这不起作用。如何指示变压器使用代理?

2 个答案:

答案 0 :(得分:3)

对于来自JDK的常规网络访问,一个选项是在启动时传递JDK args。

类似的东西:

java -Dhttp.proxyHost=myproxy.com -Dhttp.proxyPort=8080 ... MyTransformerClass

通常,更好的解决方案是使用您从配置文件中读取的值,以编程方式在应用程序中设置选项。

类似的东西:

System.setProperty("http.proxyHost", myConfig.getProxyHost());
System.setProperty("http.proxyPort", myConfig.getProxyPort());

有关所有选项,请参阅http://docs.oracle.com/javase/6/docs/technotes/guides/net/proxies.html

但是,在需要解析XSD,DTD等的XML处理的特定示例中。在尝试使用资源的本地副本时,几乎总是更好,并指定javax.xml.stream.XMLResolver为你的解析器加载本地副本而不是远程。

答案 1 :(得分:1)

您需要在应用程序中设置代理。

首先,您需要创建一个扩展java.net.Authenticator的类,如下所示:

import java.net.Authenticator;
import java.net.PasswordAuthentication;

public class SimpleAuthenticator extends Authenticator {

    private String username, password;

    public SimpleAuthenticator(String username, String password) {

        this.username = username;
        this.password = password;
    }

    protected PasswordAuthentication getPasswordAuthentication() {

        return new PasswordAuthentication(username, password.toCharArray());
    }
}

其次,在代码中初始化Authenticator:

SimpleAuthenticator sm = new simpleAuthenticator("user", "pass")
Authenticator.setDefault(sm);

第三,将端口,代理作为系统属性传递给您的应用程序。有了码头和maven,它看起来像:

mvn jetty:run -DproxySet=true -DproxyHost=proxy.company.com -DproxyPort=8080