分享

cxf设置代理访问webservice接口

 瀚海璨夜 2019-01-30

  由于业务上的需要,需要访问第三方提供的webservice接口,但由于公司做了对外访问的限制,不设置代理是不能外网的,如果使用http设置代理访问外网还是比较容易的,但使用cxf有点不知道从哪里入手。网上也有一些零散的信息,现在我整理一下提供参考。

1、JaxWsProxyFactoryBean设置代理

复制代码
import org.apache.cxf.configuration.security.ProxyAuthorizationPolicy;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.apache.cxf.transport.http.HTTPConduit;
import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;

public class TeacherService {
    
    public String getStudents(StudentCard card){
        JaxWsProxyFactoryBean factoryBean = new JaxWsProxyFactoryBean();  
        factoryBean.setServiceClass(TeacherWebService.class);  
        factoryBean.setAddress("http://./webservice?wsdl");  
        TeacherWebService tService = (TeacherWebService )factoryBean.create();  
            
       Client client = ClientProxy.getClient(tService);
        HTTPConduit http = (HTTPConduit) client.getConduit();
        HTTPClientPolicy hcp = new HTTPClientPolicy();
        hcp.setProxyServer(proxyHost);
        hcp.setProxyServerPort(proxyport);
        http.setClient(hcp);

        ProxyAuthorizationPolicy proxyAuthorization = new ProxyAuthorizationPolicy();
        proxyAuthorization.setUserName(proxyUsername);
        proxyAuthorization.setPassword(proxyPassword);
        http.setProxyAuthorization(proxyAuthorization);
        
        String res = tService.getStudents(card);
        
        return res;
    }
}
复制代码

2、使用JaxWsDynamicClientFactory设置代理

复制代码
import java.net.Authenticator;
import java.net.PasswordAuthentication;
import javax.xml.namespace.QName;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
import com.thoughtworks.xstream.XStream;

public class TeacherService {
    
    public String getStudents(StudentCard card)throws Exception{
      System.setProperty("http.proxyHost","http.proxy.host");
        System.setProperty("http.proxyPort", "http.proxy.port");
        Authenticator.setDefault(new MyAuthenticator("username", "password")));
        
        JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();  
        
         //url为调用webService的wsdl地址  
        Client client = dcf.createClient("http://x.:8080/webservice?wsdl");  
        //namespace是命名空间,methodName是方法名 
        QName name=new QName("http://www.","getStudents");  
     XStream xstream = new XStream(new XppDriver(new XmlFriendlyNameCoder("_-", "_")));
        Object[] objects = client.invoke(name,xstream.toXML(card)); 
        
        String res = "";
        if(objects != null && objects.length != 0){
            res = objects[0].toString();
        }
        
        return res;
  }

  static class MyAuthenticator extends Authenticator {
    private String username, password;

    public MyAuthenticator(String username, String password) {
      this.username = username;
      this.password = password;
    }

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

}
复制代码

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多