【问题标题】:How to add HTTP proxy to JAX-WS?如何将 HTTP 代理添加到 JAX-WS?
【发布时间】:2020-06-16 13:35:42
【问题描述】:

我有一个 WSDL 文件,我通过在 SoapUI 中使用 WSDL2Java 将它转换为 Java 代码,它工作正常,但现在我需要向它添加我公司的代理,所以每个 SOAP http 请求都会通过它(但不是其他 http 请求)。

我查看了有关同一问题的多个线程并找到了以下选项:

  1. 通过添加系统范围的代理

    System.getProperties().put("proxySet", "true");
    System.getProperties().put("https.proxyHost", "10.10.10.10");
    System.getProperties().put("https.proxyPort", "8080"); 
    

    这对我不起作用,因为它会影响整个 jvm。

  2. 添加以下代码

    HelloService hello = new HelloService();
    HelloPortType helloPort = cliente.getHelloPort();
    org.apache.cxf.endpoint.Client client = ClientProxy.getClient(helloPort);
    HTTPConduit http = (HTTPConduit) client.getConduit();
    http.getClient().setProxyServer("proxy");
    http.getClient().setProxyServerPort(8080);
    http.getProxyAuthorization().setUserName("user proxy");
    http.getProxyAuthorization().setPassword("password proxy");
    

    我不知道如何使用。我生成的代码没有任何org.apache.cxf的痕迹,只有javax.xml.ws

  3. 将此添加到我的端口配置中:

    ((BindingProvider) port).getRequestContext().put("http.proxyHost", "proxy@example.com");
    ((BindingProvider) port).getRequestContext().put("http.proxyPort", "80");
    

    在这里,我使用了一个随机的不存在的代理,并期望得到任何类型的错误(超时、无效的代理等),但它却没有任何错误地通过。

【问题讨论】:

    标签: java http proxy cxf jax-ws


    【解决方案1】:

    这是一个不使用 3rd 方库的示例。

    https://github.com/schuch/jaxws-proxy-example/blob/master/jaxws-client-with-proxy/src/main/java/ch/schu/example/helloworld/Client.java

    package ch.schu.example.helloworld;
    
    import java.net.ProxySelector;
    
    import ch.schu.example.hello.HelloImpl;
    import ch.schu.example.hello.HelloImplService;
    
    public class Client {
    
        public static void main(String[] args) {
    
            ProxySelector.setDefault(new MyProxySelector());
    
            HelloImplService service = new HelloImplService();
            HelloImpl hello = service.getHelloImplPort();
            System.out.println(hello.sayHello("Howard Wollowitz"));
        }
    
    }
    

    https://github.com/schuch/jaxws-proxy-example/blob/master/jaxws-client-with-proxy/src/main/java/ch/schu/example/helloworld/MyProxySelector.java

    package ch.schu.example.helloworld;
    
    import java.io.IOException;
    import java.net.InetSocketAddress;
    import java.net.*;
    import java.util.*;
    
    public class MyProxySelector extends ProxySelector {
    
        @Override
        public List<Proxy> select(URI uri) 
        {
            System.out.println("select for " + uri.toString());
            Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("localhost", 9999));
            ArrayList<Proxy> list = new ArrayList<Proxy>();
            list.add(proxy);
            return list;   
        }
    
        @Override
        public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {
            System.err.println("Connection to " + uri + " failed.");
        }
    }
    

    【讨论】:

    • 如果我错了,请纠正我,但这不会改变整个 JVM 的代理吗?
    • @aleksandrs public List&lt;Proxy&gt; select(URI uri) 接受 uri 参数。所以我认为你可以返回空的代理列表,除了你想要代理的目标 url。可能是您在该方法中进行了一些 url 模式匹配
    猜你喜欢
    • 2015-07-19
    • 2016-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    相关资源
    最近更新 更多