现在有一个webservice接口,但是访问的时候需要输入账号和密码。我想用axis2或者CXF来生成客户端的代码,但是生成的时候,总是报401:未授权,我想多半是生成的时候没有输入账号和密码。不知道怎么加上账号和密码。

解决方案 »

  1.   

    我们用的是SOAP,没碰到这个问题。建议到博客区搜搜看,应该有很多大牛的文献可以参考的
      

  2.   

    也是SOAP,加QQ谈论一下ok吗?
    I'm sorry,公司不能上qq的,限制几个可以上的外网,csdn就是其中一个。
      

  3.   

    我们一般都是用wsdl生成接口源码和wsdd文件的,LZ是想通过java生成wsdl么?
      

  4.   

    cxf的话 看看 HTTPConduit 这个类的 setAuthorization 方法。
      

  5.   

    不是的,现在是厂商已经提供了接口,要我去调用,所有我这边要的是客户端的代码,但是厂商提供的接口必须要输入账号和密码才可以访问,所有CXF和axis2直接通过url地址来生成代码无法完成,我就用eclipse中的web service Client来做的,我把url地址给填写上去后,确实叫我输入了账号和密码,但是生成出来的代码还是无法连接,我就自己在生成的代码中加了一段代码,但是还是不可以;
      

  6.   

    CXF生成的客户端代码里没有你说的这个类,也没有setAuthorization方法
      

  7.   

    嗯,这种对接的调试挺闹心的。
    我们这边的登录名和登录密码是在请求的Header域加的:
    <SOAP-ENV:Header><m:Security xmlns:m="http://....">
    <m:UsernameToken> 
    <m:Username>liming</m:Username> 
    <m:Password>123456</m:Password> 
    </m:UsernameToken> 
    </m:Security></SOAP-ENV:Header>
    处理:
    Message msg = mc.getRequestMessage();//mc为MessageContex
    SOAPHeader header = (SOAPHeader) msg.getSOAPHeader();
    List<?> list = header.getChildren();
    MessageElement token = (MessageElement) list.get(0);
    list = token.getChildren();
    MessageElement authenNode = (MessageElement) list.get(0);
    list = authenNode.getChildren();
    MessageElement nameNode = (MessageElement) list.get(0);
    String userName = nameNode.getValue();
    MessageElement pwdNode = (MessageElement) list.get(1);
    String password = pwdNode.getValue();
    ...
    知道怎么解析,怎么封装也就简单了。也有的是放在一条指令的Body区的,处理方式不一样。在Header域还是在Body域中,处理方式不一样的。建议和厂商要一些可执行的请求报文样例,然后对比下你发的请求与他们提供的有啥区别,看看是不是存在什么登录名和登录密码项。
      

  8.   


    他们的例子是用.net做的,.net函数库里有一个方法直接设置用户名和密码的,所有可以直接访问。
      

  9.   

    肯定有报文格式的请求指令的。
    或者说,你们发送的服务器地址错了?
    http://IP:port/MyWebApp/services/XXXService?wsdl
    上面是我们发送的地址。这个Url如果在浏览器输入的话,会显示一个指令接口的页面。
      

  10.   

    CXF生成的客户端代码里没有你说的这个类,也没有setAuthorization方法CXF生成的客户端代码里没有你说的这个类,也没有setAuthorization方法当然不是生成的,完整类名是 org.apache.cxf.transport.http.HTTPConduit我看你还是看看cxf的开发手册吧。
      

  11.   

    CXF生成的客户端代码里没有你说的这个类,也没有setAuthorization方法CXF生成的客户端代码里没有你说的这个类,也没有setAuthorization方法当然不是生成的,完整类名是 org.apache.cxf.transport.http.HTTPConduit我看你还是看看cxf的开发手册吧。我们用的是 cxf-2.4.6的jar包
      

  12.   

    CXF生成的客户端代码里没有你说的这个类,也没有setAuthorization方法CXF生成的客户端代码里没有你说的这个类,也没有setAuthorization方法当然不是生成的,完整类名是 org.apache.cxf.transport.http.HTTPConduit我看你还是看看cxf的开发手册吧。我们用的是 cxf-2.4.6的jar包我是直接下载的生成工具,用他的wsdl2java命令生成的客户端代码;也没有要求导包
      

  13.   

    地址肯定是对的,我这个地址在游览器输入的话,先会弹出一个登陆对话框,输入成功后就可以正常访问。正常访问是这样的。
    好吧,可能我这边使用SOAP的方式比较单一(用户提供wsdl文件,我们使用axis1.4生成代码,做服务端逻辑),听听彩虹六号的吧,看样子你俩用的类似。wsdl2java生成的代码,包含服务端(ImsServiceSoapBindingImpl.java)和客户端代码(ImsServiceSoapBindingStub.java),lz别用错代码哦。另外,工程中的jar包还是必不可少的(我们这边用的是axis-1.4.jar和axis.jar)。
      

  14.   

    地址肯定是对的,我这个地址在游览器输入的话,先会弹出一个登陆对话框,输入成功后就可以正常访问。正常访问是这样的。
    好吧,可能我这边使用SOAP的方式比较单一(用户提供wsdl文件,我们使用axis1.4生成代码,做服务端逻辑),听听彩虹六号的吧,看样子你俩用的类似。wsdl2java生成的代码,包含服务端(ImsServiceSoapBindingImpl.java)和客户端代码(ImsServiceSoapBindingStub.java),lz别用错代码哦。另外,工程中的jar包还是必不可少的(我们这边用的是axis-1.4.jar和axis.jar)。
    恩,这个我知道,axis2生成的代码要jar包支持,CXF的可以不用。现在最主要的问题就是生成的代码连不上服务器接口,应该就是代码里面没有加上账号和密码,所以连接未授权。
      

  15.   

    我们这边可以通过SOAPUI工具,发送xml格式的SOAP消息请求给服务器的,要不LZ试试这个工具直接发的方式,看看登录名和密码要放在什么部位比较合适?期待LZ解决此问题哈~
      

  16.   

    这个错误跟webService没有关系。产生的原因是对方在服务器(tomcat,was,weblogic)上配置了身份认证。因此需要通过身份认证才能调用webService。我们这边
    Service service = new Service();
    Call _call = (Call) service.createCall();
    _call.setUsername(USERNAME);
    _call.setPassword(USERPASS);
      

  17.   


    我们这边是用axis2,没有生成客户端,直接调接口连接。
      

  18.   


    我们这边是用axis2,没有生成客户端,直接调接口连接。
    可以加个QQ详谈一下吗?
      

  19.   

    恩,我去下来试试看,但是没有用过,等下有不懂的还是问你哈
    要是解决了,也发出来给大家分享下哈~
    OK了  搞定了我用axis2生成的客户端代码中加入了以下代码:
    /******************************加入账号密码验证start***************************************/
           HttpTransportProperties.Authenticator basicauth = new HttpTransportProperties.Authenticator();     
           basicauth.setUsername("username");   
           basicauth.setPassword("password");   
           _serviceClient.getOptions().setProperty(HTTPConstants.AUTHENTICATE, basicauth);  
        /********************************加入账号密码验证end*************************************/
      

  20.   

    恩,我去下来试试看,但是没有用过,等下有不懂的还是问你哈
    要是解决了,也发出来给大家分享下哈~
    OK了  搞定了我用axis2生成的客户端代码中加入了以下代码:
    /******************************加入账号密码验证start***************************************/
           HttpTransportProperties.Authenticator basicauth = new HttpTransportProperties.Authenticator();     
           basicauth.setUsername("username");   
           basicauth.setPassword("password");   
           _serviceClient.getOptions().setProperty(HTTPConstants.AUTHENTICATE, basicauth);  
        /********************************加入账号密码验证end*************************************/
    厉害啊!看你们的代码,注释很详细,不错不错!