winder

          DB&JAVA
          posts - 2, comments - 6, trackbacks - 0, articles - 11
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          Axis1.4 在weblogic9.2中報 (401)Unauthorized 的處理

          Posted on 2010-02-09 18:01 winderain 閱讀(1663) 評論(0)  編輯  收藏 所屬分類: JAVA
          WebService server 在tomcat上部署,client在Weblogic9.2中部署,在使用安全方式調(diào)用的時候,報錯:
          (401)Unauthorized at org.apache.axis.transport.http.HTTPSender.readFromSocket(HTTPSender.java:744)

          如果server 和client 都在 tomcat,則不存在問題。

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

          經(jīng)過多方跟蹤,發(fā)現(xiàn)在client構(gòu)造的java.net.URL 實例的 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

          多方查找,也找不到原因。后來通過手工創(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的源代碼,對源代碼做中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中找不到用戶信息的時候,通過userInfo中獲取用戶信息。

          主站蜘蛛池模板: 常州市| 托里县| 卓资县| 易门县| 仁布县| 永安市| 泾阳县| 阳信县| 共和县| 定兴县| 奉新县| 芦山县| 昂仁县| 永德县| 乌鲁木齐市| 万年县| 色达县| 定边县| 旺苍县| 湛江市| 景德镇市| 泗洪县| 海兴县| 根河市| 台安县| 沧州市| 巴中市| 天镇县| 岚皋县| 桦甸市| 于田县| 青川县| 滦平县| 平原县| 盐山县| 鸡东县| 工布江达县| 建德市| 天台县| 郑州市| 松江区|