winder

          DB&JAVA
          posts - 2, comments - 6, trackbacks - 0, articles - 11
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
          WebService server 在tomcat上部署,client在Weblogic9.2中部署,在使用安全方式調(diào)用的時(shí)候,報(bào)錯(cuò):
          (401)Unauthorized at org.apache.axis.transport.http.HTTPSender.readFromSocket(HTTPSender.java:744)

          如果server 和client 都在 tomcat,則不存在問(wèn)題。

          webService 的 client 代碼是有 WDSL2JAVA 自動(dòng)產(chǎn)生的代碼。

          經(jīng)過(guò)多方跟蹤,發(fā)現(xiàn)在client構(gòu)造的java.net.URL 實(shí)例的 toString() 在tomcat下輸出如下:
          http://7564945504235898643:123@192.168.0.175:9080/tunnel-web/secure/axis/Plat_UserService

          在weblogic下輸出如下:
          http://192.168.0.175:9080/tunnel-web/secure/axis/Plat_UserService

          多方查找,也找不到原因。后來(lái)通過(guò)手工創(chuàng)建call,可以調(diào)用,代碼如下:
                String wsdlUrl = "http://192.168.0.175:9080/tunnel-web/secure/axis/BkPlat_UserService?wsdl";    
                String nameSpaceUri 
          = "urn:http.service.system.platform.xx.com";    
                
          try{
                  
                   Service service 
          = new Service();
                   Call call 
          = null;
                   
                   call 
          = (Call) service.createCall();
                   call.setUsername(
          "7564945504235898643");
                   call.setPassword(
          "123");
                   org.apache.axis.description.OperationDesc oper;
                   
                   org.apache.axis.description.ParameterDesc param;
                   
                   oper 
          = new org.apache.axis.description.OperationDesc();
                   oper.setName(
          "getUserById");
                   
                   param 
          = new org.apache.axis.description.ParameterDesc(new javax.xml.namespace.QName("""userId"), org.apache.axis.description.ParameterDesc.IN, new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema""long"), long.classfalsefalse);
                   oper.addParameter(param);
                   
                   oper.setReturnType(
          new javax.xml.namespace.QName("http://model.system.platform.xxx.com""UserSoap"));
                   oper.setReturnClass(com.xxx.platform.client.system.model.UserSoap.
          class);
                   oper.setReturnQName(
          new javax.xml.namespace.QName("""getUserByIdReturn"));
                   oper.setStyle(org.apache.axis.constants.Style.RPC);
                   oper.setUse(org.apache.axis.constants.Use.ENCODED);
                   
                   call.setOperation(oper);
                   call.setOperationName(
          new QName(nameSpaceUri, "getUserById"));
                   
                   call.setTargetEndpointAddress(
          new java.net.URL(wsdlUrl));
                   
                   try {        
                       java.lang.Object _resp 
          = call.invoke(new java.lang.Object[] {Long.valueOf("7564945504235898643")});

                       
          if (_resp instanceof java.rmi.RemoteException) {
                           
          throw (java.rmi.RemoteException)_resp;
                       }
                   
          else {
                       
                       
          try {
                           Object user
          =(com.xxx.platform.client.system.model.UserSoap) _resp;
                       } 
          catch (java.lang.Exception _exception) {
                           Object user
          =(com.xxx.platform.client.system.model.UserSoap) org.apache.axis.utils.JavaUtils.convert(_resp, com.xxx.platform.client.system.model.UserSoap.class);
                       }
                   }
                 } 
          catch (org.apache.axis.AxisFault axisFaultException) {
                     
          throw axisFaultException;
                 }

                }
          catch(Exception e){
                    log.warn(
          "test error:", e);
                }
              

          然后下載axis1.4的源代碼,對(duì)源代碼做中org.apache.axis.wsdl.toJava.JavaStubWriter 類的產(chǎn)生createCall的代碼做如下修正:
                  pw.println("    // add by winderain");
                  pw.println(
          "    protected org.apache.axis.client.Call setUserInfo(org.apache.axis.client.Call call) throws java.rmi.RemoteException {");
                  pw.println(
          "        if(super.cachedUsername == null){");
                  pw.println(
          "            if(super.cachedEndpoint != null){");
                  pw.println(
          "                String userInfo = super.cachedEndpoint.getUserInfo();");
                  pw.println(
          "                if(userInfo == null) return call;");
                  pw.println(
          "                String[] str = userInfo.split(\":\");");
                  pw.println(
          "                if(str != null && str.length == 2){");
                  pw.println(
          "                    String userName = str[0];");
                  pw.println(
          "                    String password = str[1];");
                  pw.println(
          "                    call.setUsername(userName);");
                  pw.println(
          "                    call.setPassword(password);");
                  pw.println(
          "                }");
                  pw.println(
          "            }");
                  pw.println(
          "        }else{");
                  pw.println(
          "            call.setUsername(super.cachedUsername);");
                  pw.println(
          "            if (super.cachedPassword != null) {");
                  pw.println(
          "                call.setPassword(super.cachedPassword);");
                  pw.println(
          "            }");
                  pw.println(
          "        }");
                  pw.println(
          "        return call;");
                  pw.println(
          "    }");
                  pw.println(
          "    // end by winderain");
                  pw.println(
          "");
                  
                  pw.println(
                          
          "    protected org.apache.axis.client.Call createCall() throws java.rmi.RemoteException {");
                  pw.println(
          "        try {");
                  pw.println(
          "            org.apache.axis.client.Call _call = super._createCall();");
                  pw.println(
          "            if (super.maintainSessionSet) {");
                  pw.println(
                          
          "                _call.setMaintainSession(super.maintainSession);");
                  pw.println(
          "            }");
                  pw.println(
          "            /*if (super.cachedUsername != null) {");
                  pw.println(
          "                _call.setUsername(super.cachedUsername);");
                  pw.println(
          "            }");
                  pw.println(
          "            if (super.cachedPassword != null) {");
                  pw.println(
          "                _call.setPassword(super.cachedPassword);");
                  pw.println(
          "            }");
                  pw.println(
          "            */");
                  pw.println(
          "            _call = setUserInfo(_call);");
                  pw.println(
          "            if (super.cachedEndpoint != null) {");
                  pw.println(
                          
          "                _call.setTargetEndpointAddress(super.cachedEndpoint);");
                  pw.println(
          "            }");
                  pw.println(
          "            if (super.cachedTimeout != null) {");
                  pw.println(
          "                _call.setTimeout(super.cachedTimeout);");
                  pw.println(
          "            }");
                  pw.println(
          "            if (super.cachedPortName != null) {");
                  pw.println(
          "                _call.setPortName(super.cachedPortName);");
                  pw.println(
          "            }");
                  pw.println(
                          
          "            java.util.Enumeration keys = super.cachedProperties.keys();");
                  pw.println(
          "            while (keys.hasMoreElements()) {");
                  pw.println(
                          
          "                java.lang.String key = (java.lang.String) keys.nextElement();");
                  pw.println(
                          
          "                _call.setProperty(key, super.cachedProperties.get(key));");
                  pw.println(
          "            }");

          使得在url中找不到用戶信息的時(shí)候,通過(guò)userInfo中獲取用戶信息。

          主站蜘蛛池模板: 凤庆县| 中西区| 合水县| 松溪县| 西宁市| 郎溪县| 惠州市| 南安市| 乾安县| 桃园县| 临颍县| 玛多县| 本溪| 河间市| 登封市| 佳木斯市| 句容市| 阳原县| 承德市| 甘德县| 仁寿县| 江山市| 沁源县| 阿坝| 巴塘县| 鹤壁市| 晋州市| 台前县| 寻乌县| 葵青区| 镇江市| 郁南县| 海林市| 旺苍县| 海伦市| 德兴市| 三亚市| 油尖旺区| 新绛县| 睢宁县| 普陀区|