ofbiz的服务(service)export成web service的方法(8)

本文介绍了一个使用AXIS处理包含多种数据类型返回参数的服务示例。通过OFBiz平台定义的服务findPersonByPartyId,该服务接收一个输入参数并返回包括姓名及薪资等在内的多个输出参数。客户端通过SOAP调用此服务,并成功解析了返回的多种数据类型。
返回参数为多种数据类型的AXIS处理

假设写如下一个ofbiz的服务:
  1.      <service name="findPersonByPartyId" engine="java"
  2.             location="org.ofbiz.party.party.TestParty" invoke="findPersonByPartyId" auth="false" export="true">
  3.         <description>test</description>
  4.         <attribute name="partyId" type="String" mode="INOUT" optional="false"/>
  5.         <attribute name="firstName" type="String" mode="OUT" optional="false"/>
  6.         <attribute name="lastName" type="String" mode="OUT" optional="false"/>
  7.         <attribute name="salary" type="Double" mode="OUT" optional="false"/>
  8.     </service>

这个服务中的返回参数有string和double两种数据类型,实现的代码如下:
  1. public static Map findPersonByPartyId(DispatchContext dctx, Map context) {
  2.         GenericDelegator delegator = dctx.getDelegator();
  3.         String partyId = (String)context.get("partyId");
  4.         Map result = new HashMap();
  5.                         
  6.         try{
  7.             GenericValue person = delegator.findByPrimaryKey("Person", UtilMisc.toMap("partyId", partyId));
  8.             String firstName = (String)person.get("firstName");
  9.             String lastName = (String)person.get("lastName");
  10.             
  11.             result.put("partyId",partyId);
  12.             result.put("firstName", firstName);
  13.             result.put("lastName",lastName);
  14.             result.put("salary"new Double(1.12));
  15.             
  16.         }catch(GenericEntityException e){
  17.             return ServiceUtil.returnError("partyId #" + partyId + "not found!");
  18.         }                
  19.         return result;
  20.     }
编译发布后,客户端调用如下:
  1. package testClientSoap;
  2. import java.util.*;
  3. import java.net.*; 
  4. import java.rmi.*; 
  5. import javax.xml.namespace.*; 
  6. import javax.xml.rpc.*; 
  7. //import javax.wsdl.OperationType;
  8. import org.apache.axis.Message;
  9. import org.apache.axis.encoding.XMLType;
  10. import org.apache.axis.message.RPCElement;
  11. import org.apache.axis.message.RPCParam;
  12. import org.apache.axis.message.SOAPEnvelope;
  13. import org.apache.axis.client.Call; 
  14. import org.apache.axis.client.Service; 
  15. import org.apache.axis.utils.*;
  16. public class TestSOAP2 { 
  17.     
  18.     public static void main(String[] args) { 
  19.         
  20.         String message = ""
  21.         Map output;
  22.         ArrayList outputList;
  23.         String responseMessage,endpoint;
  24.     
  25.     try { 
  26.         endpoint = "http://127.0.0.1:18080/webtools/control/SOAPService/";
  27.         Call call = (Call) new Service().createCall(); 
  28.         call.setTargetEndpointAddress(new URL(endpoint));        
  29.         call.setOperationName(new QName("""findPersonByPartyId")); 
  30.                 
  31.         call.addParameter("partyId",
  32.                 org.apache.axis.Constants.XSD_STRING,
  33.                 javax.xml.rpc.ParameterMode.INOUT);
  34.         call.addParameter("firstName",
  35.                 org.apache.axis.Constants.XSD_STRING,
  36.                 javax.xml.rpc.ParameterMode.OUT);
  37.         call.addParameter("lastName",
  38.                 org.apache.axis.Constants.XSD_STRING,
  39.                 javax.xml.rpc.ParameterMode.OUT);
  40.         call.addParameter("salary",
  41.                 org.apache.axis.Constants.XSD_DOUBLE,
  42.                 javax.xml.rpc.ParameterMode.OUT);
  43.         call.setReturnType(org.apache.axis.encoding.XMLType.AXIS_VOID);
  44.         
  45.         Object responseWS = call.invoke(new Object[]{"10110"}); 
  46. //        System.out.println( "Receiving response: " +  (String) responseWS); 
  47.         output = call.getOutputParams();
  48.         String firstName = (String) output.get(new QName("""firstName"));
  49.         String lastName = (String) output.get(new QName("""lastName"));
  50.         Double salary = (Double) output.get(new QName("""salary"));
  51.         String partyId = (String) output.get(new QName("""partyId"));
  52.                 
  53.         System.out.println(partyId + ":" + firstName + " " + lastName + "'s salary is " + salary);
  54.     } catch (MalformedURLException ex) { 
  55.         message = "error: wrong url"
  56.     } catch (ServiceException ex) { 
  57.         message = "error: failed to create the call"
  58.     } catch (RemoteException ex) { 
  59.         message = "error: failed to invoke WS";
  60.     } finally { 
  61.       System.out.println(""); 
  62.       System.out.println(message); 
  63.     } 
  64.   } 
  65. }     

如此而已……
import nmap import socket import requests import paramiko import threading import argparse from datetime import datetime from bs4 import BeautifulSoup from urllib.parse import urljoin class VulnerabilityScanner: def __init__(self, target, ports=None, threads=10): """ 初始化漏洞扫描器 参数: target (str): 目标IP或域名 ports (str): 要扫描的端口范围,如 '1-1000' threads (int): 线程数 """ self.target = target self.ports = ports or '1-1000' self.threads = threads self.results = { 'target': target, 'start_time': datetime.now().isoformat(), 'open_ports': [], 'services': {}, 'vulnerabilities': [] } self.lock = threading.Lock() def validate_target(self): """验证目标地址是否有效""" try: socket.gethostbyname(self.target) return True except socket.gaierror: print(f"[!] 无法解析目标: {self.target}") return False def port_scan(self): """使用nmap进行端口扫描""" if not self.validate_target(): return False print(f"[*] 开始扫描 {self.target} 的端口 {self.ports}...") try: nm = nmap.PortScanner() nm.scan(hosts=self.target, ports=self.ports, arguments=f'-T4 --min-parallelism {self.threads}') for host in nm.all_hosts(): for proto in nm[host].all_protocols(): ports = nm[host][proto].keys() for port in sorted(ports): service = nm[host][proto][port]['name'] state = nm[host][proto][port]['state'] if state == 'open': with self.lock: self.results['open_ports'].append(port) self.results['services'][port] = { 'protocol': proto, 'service': service, 'product': nm[host][proto][port].get('product', ''), 'version': nm[host][proto][port].get('version', '') } print(f"[+] 发现开放端口: {port}/{proto} - {service}") return True except nmap.PortScannerError as e: print(f"[!] Nmap扫描错误: {e}") return False except Exception as e: print(f"[!] 扫描过程中发生错误: {e}") return False def check_weak_passwords(self, port, service): """检测常见服务的弱口令""" common_credentials = { 'ssh': [('root', 'root'), ('admin', 'admin'), ('root', 'password')], 'ftp': [('anonymous', ''), ('admin', 'admin')], 'telnet': [('root', 'root'), ('admin', 'admin')], 'mysql': [('root', ''), ('root', 'root')] } if service not in common_credentials: return print(f"[*] 正在检测 {service.upper()} 弱口令...") if service == 'ssh': ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) for username, password in common_credentials[service]: try: ssh.connect(self.target, port=port, username=username, password=password, timeout=5) ssh.close() with self.lock: self.results['vulnerabilities'].append({ 'type': 'weak_password', 'port': port, 'service': service, 'credentials': f"{username}:{password}", 'severity': 'high' }) print(f"[!] 发现弱口令: {service} - {username}:{password}") break except: continue # 可以添加其他服务的弱口令检测逻辑 def check_sql_injection(self, url): """检测SQL注入漏洞""" if not url.startswith(('http://', 'https://')): url = f"http://{url}" print(f"[*] 正在检测 {url} 的SQL注入漏洞...") test_payloads = [ "'", "\"", "' OR '1'='1", "\" OR \"1\"=\"1", "' OR 1=1--", ] 怎么使用
最新发布
06-18
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值