zoukankan      html  css  js  c++  java
  • cxf的使用及安全校验-02创建简单的客户端接口

    上一篇文章中,我们已经讲了如果简单的创建一个webservice接口

    http://www.cnblogs.com/snowstar123/p/3395568.html

    现在我们创建一个简单客户端接口的调用方式,这里我们介绍一种比较特别的方法,

    首先,我们我们通过接口地址来生成服务端的相关代码

    下载cxf的源码,解压进入到bin目录下,然后执行

    wsdl2java -p service.webservice.client.demo -d D: emp(这个是生成的文件存放的路径)  -verbose http://localhost/*****?wsdl(这里是接口地址)

    如果执行此命令时报错,可以尝试配置一下系统的环境变量CXF_HOME为E:apache-cxf-2.7.0,PATH中添加E:apache-cxf-2.7.0in,CLASSPATH中添加E:apache-cxf-2.7.0lib,然后在执行

    执行完成后,到存放的路径下查看,会看到多个java文件,将这些生成的java文件添加到项目中,直接加到项目中会有编译错误,修改一下java的package,如果还有其他错误,直接按照eclipse提示修改即可,如super(wsdlLocation, SERVICE, features);报错按照提示直接改成super(wsdlLocation, SERVICE);

    再修改除了ObjectFactory以外的类中@XmlType的name属性值,可修改成任意不重复字符,如

    @XmlType(name = "greetingResponse", propOrder = {
    "_return"
    })

    我直接改成了

    @XmlType(name = "greetingResponse1", propOrder = {
    "_return"
    })

    接下来,我要介绍的是一个稍微和常见的写法不一样的步骤,主要的目的是为了让此接口变的可配置化

    首先,我们创建一个javaBean对象,

    @Entity
    @Table(name="T_WEBSERVICE_ENDPOINT")
    public class EndPointEO{

    @Column(name="endPointName")

    private String endPointName;

    @Column(name="endpointUrl")
    private String endpointUrl;

    @Column(name="clientClass")
    private String clientClass;

    此javaBean中包含以下属性,endPointName(接口的短名,随便取一个具有唯一性的名字即可,主要是通过此字段来获取其他属性的),endpointUrl(接口地址),clientClass(这个是上面我们通过wsdl2java命令生成的接口类,如我这边配置的是com.cpic.caf.demo.webservice.client.greet.GreetingService)

    然后我创建一个类来查询EndPointEO,

    @Repository
    public interface EndPointRepository extends Repository<EndPointEO, Long> {


    @Query("select e from EndPointEO e where e.endPointName = :endPointName ")
    EndPointEO findByEndPointName(@Param("endPointName")String endPointName);
    }

    现在我们创建一个另外一个类用于将EndPointEO转成我们需要调用的类

    import java.lang.reflect.Constructor;
    import java.lang.reflect.Method;
    import java.net.URL;
    import java.util.HashMap;

    import org.apache.cxf.frontend.ClientProxy;
    import org.springframework.stereotype.Service;

    @Service
    public class EndPointWebService {
    @Autowired
    private EndPointRepository endPointRepository;

    public Object getClient(String endPointName) throws Exception{
    EndPointEO endPointEO = endPointRepository.findByEndPointName(endPointName);

    String url = endPointEO.getEndpointUrl(); 
    String className = endPointEO.getClientClass();
    String methodPart = className.substring(className.lastIndexOf(".")+1);
    String methodName = "get" +methodPart + "ImplPort";
    className = className +"ImplService";
    Class<?> classN = Class.forName(className);
    Constructor<?> cons = classN.getConstructor(java.net.URL.class);
    Object object = cons.newInstance(new URL(url));
    Method method = object.getClass().getMethod(methodName);
    object = method.invoke(object);
    //org.apache.cxf.endpoint.Client client = ClientProxy.getClient(object);
    //client.getInInterceptors().add(new org.apache.cxf.interceptor.LoggingInInterceptor());
    //client.getOutInterceptors().add(new com.cpic.caf.tech.webService.interceptor.MyCxfOutInterceptor());
    //client.getOutInterceptors().add(new org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor());

    //HashMap<String, Object> map = new HashMap<String, Object>();
    //map.put("action", "UsernameToken");
    //map.put("user", "ws-client");
    //map.put("passwordType", "PasswordText");
    //map.put("passwordCallbackClass", "com.cpic.caf.demo.webservice.client.ClientPasswordCallback");
    //client.getOutInterceptors().add(new org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor(map) );
    return object;
    }

    }
    }

    现在我们可以来使用这个类啦

    如下,调用时,直接注入

    @Autowired

    private EndPointWebService endPointWebService;

    然后调用

    GreetingService greetingService = (GreetingService)endPointWebService.getClient("greetingService");//greetingService为EndPointEO中的短名

    大致的功能就是这样啦;

    这样处理之后,以后有调用接口的地方,直接在数据库中配置一下,即可使用此接口,如果接口地址有变换,只要在数据库中修改一下接口地址即可!

    下一篇,我们再在此基础上增加一些密码校验的功能!现在项目中发布到公网上的接口地址,如果不加用户名,密码校验,很容易就会被人利用!

  • 相关阅读:
    通过mixins方法处理调取服务器时间
    记录个人对vuex的简单理解
    利用弹性布局实现垂直居中
    vue.set的适用方法
    深拷贝和浅拷贝的实现方法
    Maven安装步骤
    build tools
    Git
    Url和Uri的区别
    函数式编程语言
  • 原文地址:https://www.cnblogs.com/snowstar123/p/3395645.html
Copyright © 2011-2022 走看看