- 浏览: 1060037 次
- 性别:
- 来自: 南京
文章分类
- 全部博客 (501)
- dwr (6)
- javascript (84)
- oracle (66)
- jsp/servlet (18)
- ant (3)
- 基础知识 (12)
- EXT (10)
- My SQL (10)
- java (71)
- spring (37)
- 学习的对象 (2)
- Linux (24)
- 面试 (1)
- HTML/CSS (11)
- tomcat (11)
- 收藏夹 (2)
- Power Designer (2)
- struts.xml配置文件 (1)
- sturts2 (3)
- myeclipse (8)
- eclipse (7)
- Maven (34)
- SVN (3)
- SAP JCO (2)
- JBOSS (11)
- webservice (8)
- word (1)
- 敏捷开发 (1)
- sybase (4)
- Nexus (3)
- EhCache (3)
- log4j (3)
- Cookie (4)
- Session (4)
- CXF (7)
- AXIS (2)
- SSO (1)
- LDAP (1)
- velocity (2)
- Jquery (5)
- redis (2)
- http (4)
- dojo (1)
- Linux资源监控软件mnon的安装与运用 (1)
- notepad++ (1)
- EA (1)
- UML (1)
- JasperReports (1)
- 权限 (0)
- freemarker (4)
- Spring MVC (1)
- JMS (1)
- activeMQ (1)
- hession (3)
- 安全 (1)
- ibatis (2)
- log (1)
- nginx (1)
最新评论
-
winhbb:
我刚好遇到了一个问题(在可以依赖注入的场合有效):有两个模块A ...
解决Maven项目相互依赖/循环依赖/双向依赖的问题 -
nanjiwubing123:
long3ok 写道你好 XmlOutputFormatter ...
用XStream转换复杂XML -
zhoujianboy:
另外一个方法实现eclipse tomcat 热部署:http ...
eclipse下实现maven项目在tomcat容器热部署方法 -
long3ok:
你好 XmlOutputFormatter 请问这个类是在什么 ...
用XStream转换复杂XML -
ganbo:
总结的好,文章给力。
解决Maven项目相互依赖/循环依赖/双向依赖的问题
项目需要,发布webservice服务端,向客户端传递复杂对象。对象包含了list<>,反复研究了一下,发现webservice不能够直接传递list对象,必须转换成对象数组才能传递。javaBean:
这是一个复杂的自定义对象,该对象嵌套了基本类型、自定义对象以及自定义对象数组。其余的对象我就不细说了,来看一下,axis1.4用来发布服务的wsdd文件:
注意:<transport name="http">
<requestFlow>
<handler type="URLMapper"/>
</requestFlow>
</transport>
如果没有该配置,将无法在浏览器中显示wsdl详细信息。
<handler type="java:com.wensi.service.server.BSHeaderHandler" name="BSHeaderHandler"/>
和
<requestFlow>
<handler type="BSHeaderHandler"/>
</requestFlow>
是实现一个相当于拦截器的功能,客户端在调用服务端的接口之前,必须经过这个方法的处理。
在这里,我写了一个权限验证的拦截器,代码如下:
由于客户端是手持机,而这边的客户端是java ssh架构,所以存储用户信息,正能依靠内存来完成。
客户端调用的时候,需要向soapHeader放验证信息。
客户端代码如下:
【转载地址】
http://wufeng219219.iteye.com/blog/808807
1.package com.wensi.service.server; 2. 3.import java.io.Serializable; 4. 5.public class LoginResponse implements Serializable{ 6. private boolean flag;//操作员登录验证是否通过:true 验证通过 false 验证失败 7. private OperatorBean operator;//登录成功后返回的操作员信息,登录失败返回null 8. private AuthorityBean[] authorityArray;//登录成功后返回操作员的权限,登录失败返回null 9. private String checkNum;//校验码 10. 11. public boolean isFlag() { 12. return flag; 13. } 14. public void setFlag(boolean flag) { 15. this.flag = flag; 16. } 17. public OperatorBean getOperator() { 18. return operator; 19. } 20. public void setOperator(OperatorBean operator) { 21. this.operator = operator; 22. } 23. public AuthorityBean[] getAuthorityArray() { 24. return authorityArray; 25. } 26. public void setAuthorityArray(AuthorityBean[] authorityArray) { 27. this.authorityArray = authorityArray; 28. } 29. public String getCheckNum() { 30. return checkNum; 31. } 32. public void setCheckNum(String checkNum) { 33. this.checkNum = checkNum; 34. } 35.}
这是一个复杂的自定义对象,该对象嵌套了基本类型、自定义对象以及自定义对象数组。其余的对象我就不细说了,来看一下,axis1.4用来发布服务的wsdd文件:
1.<?xml version="1.0" encoding="UTF-8"?> 2.<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> 3. <handler type="java:org.apache.axis.handlers.http.URLMapper" name="URLMapper"/> 4. <handler type="java:com.wensi.service.server.BSHeaderHandler" name="BSHeaderHandler"/> 5. <service name="ZNWService" provider="java:RPC"> 6. 7. <requestFlow> 8. <handler type="BSHeaderHandler"/> 9. </requestFlow> 10. 11. <parameter name="className" value="com.wensi.service.server.ZNWService"/> 12. <parameter name="allowedMethods" value="*"/> 13. <parameter name="scope" value="session"/> 14. 15.<!-- 这里定义了方法的参数以及返回值 --> 16. <operation name="login" returnType="ns:LoginResponse"> 17. <parameter name="userName" type="tns:string"/> 18. <parameter name="password" type="tns:string"/> 19. </operation> 20. 21.<!-- 这里定义了自定义对象的映射 --> 22. <typeMapping 23. qname="ns:OperatorBean" 24. xmlns:ns="ZNWService" 25. type="java:com.wensi.service.server.OperatorBean" 26. deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory" 27. encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" 28. serializer="org.apache.axis.encoding.ser.BeanSerializerFactory" 29. /> 30. 31. <typeMapping 32. qname="ns:AuthorityBean" 33. xmlns:ns="ZNWService" 34. type="java:com.wensi.service.server.AuthorityBean" 35. deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory" 36. encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" 37. serializer="org.apache.axis.encoding.ser.BeanSerializerFactory" 38. /> 39. 40. <arrayMapping 41. qname="ns:ArrayOfAuthorityBean" 42. xmlns:ns="ZNWService" 43. type="java:com.wensi.service.server.AuthorityBean[]" 44. innerType="ns:AuthorityBean" 45. xmlns:ns2="ZNWService" 46. deserializer="org.apache.axis.encoding.ser.ArrayDeserializerFactory" 47. encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" 48. serializer="org.apache.axis.encoding.ser.ArraySerializerFactory" 49. 50. /> 51. 52. <typeMapping 53. qname="ns:LoginResponse" 54. xmlns:ns="ZNWService" 55. type="java:com.wensi.service.server.LoginResponse" 56. deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory" 57. encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" 58. serializer="org.apache.axis.encoding.ser.BeanSerializerFactory" 59. /> 60. 61. </service> 62. <transport name="http"> 63. <requestFlow> 64. <handler type="URLMapper"/> 65. </requestFlow> 66. </transport> 67.</deployment>
注意:<transport name="http">
<requestFlow>
<handler type="URLMapper"/>
</requestFlow>
</transport>
如果没有该配置,将无法在浏览器中显示wsdl详细信息。
<handler type="java:com.wensi.service.server.BSHeaderHandler" name="BSHeaderHandler"/>
和
<requestFlow>
<handler type="BSHeaderHandler"/>
</requestFlow>
是实现一个相当于拦截器的功能,客户端在调用服务端的接口之前,必须经过这个方法的处理。
在这里,我写了一个权限验证的拦截器,代码如下:
1.package com.wensi.service.server; 2. 3.import org.apache.axis.AxisFault; 4.import org.apache.axis.Message; 5.import org.apache.axis.MessageContext; 6.import org.apache.axis.handlers.BasicHandler; 7.import javax.xml.soap.SOAPException; 8.import javax.xml.soap.SOAPHeader; 9.import org.apache.axis.message.SOAPHeaderElement; 10.import org.apache.axis.message.SOAPEnvelope; 11.import org.apache.axis.message.MessageElement; 12. 13.import com.wensi.common.Util; 14. 15.import javax.xml.namespace.QName; 16. 17.import java.text.ParseException; 18.import java.text.SimpleDateFormat; 19.import java.util.Date; 20.import java.util.Iterator; 21.import java.util.Map; 22. 23.@SuppressWarnings("unchecked") 24.public class BSHeaderHandler extends BasicHandler { 25. private static final long serialVersionUID = 1L; 26. private String operNum;//操作员编号 27. private String checkNum;//校验码 28. private String time;//访问接口的时间 29. String endpoint = ServiceConstant.endpoint;//webservice的具体路径 30. Map map = ServiceConstant.checkMap;//包含校验码信息的map 31. 32. // 在执行service前先处理handler 33. // invoke()会被自动调用,而且 SOAP 信息可以由 msgContext 取得 34. public void invoke(MessageContext msgContext) throws AxisFault { 35. boolean processedHeader = false; 36. try { 37. // 取得 Request 的 SOAP 信息 38. Message msg = msgContext.getRequestMessage(); 39. SOAPEnvelope envelope = msg.getSOAPEnvelope(); 40. SOAPHeader header = envelope.getHeader(); 41. Iterator it = header.examineAllHeaderElements(); 42. SOAPHeaderElement hel; 43. while (it.hasNext()) { 44. hel = (SOAPHeaderElement) it.next(); 45. String headerName = hel.getNodeName(); 46. if (headerName.equals("cp:MessageHeader")) { 47. // 对于 mustUnderstand 设为 true 的 Header,必须 48. // 利用下列的方式把它设为"已经处理",否则 service 49. // 会回传 Did not understand "MustUnderstand" 50. hel.setProcessed(true); 51. checkUser(hel); 52. processedHeader = true; 53. } 54. } 55. } catch (SOAPException e) { 56. throw new AxisFault("无法处理 SOAP Header.", e); 57. } 58. if (!processedHeader) { 59. throw new AxisFault("接收 SOAP Header 失败"); 60. } 61. } 62. private void checkUser(SOAPHeaderElement hel) throws AxisFault { 63. String current = Util.dateToString(new Date(), "yyyy-MM-dd HH:mm:ss");//当前时间字符串 64. MessageElement element1 = hel.getChildElement(new QName( 65. endpoint, "isLogin")); 66. 67. MessageElement element2 = hel.getChildElement(new QName( 68. endpoint, "operNum")); 69. 70. MessageElement element3 = hel.getChildElement(new QName( 71. endpoint, "checkNum")); 72. 73. MessageElement element4 = hel.getChildElement(new QName( 74. endpoint, "time")); 75. 76. 77. //用户访问的不是登录接口,则进行校验码验证 78. if(null == element1 && null != element2 && null != element3 && null != element4){ 79. operNum = element2.getValue(); 80. checkNum = element3.getValue(); 81. time = element4.getValue(); 82. Boolean flag1 = false; 83. if(map.keySet().contains(operNum)){ 84. CheckNumBean check = (CheckNumBean) map.get(operNum); 85. System.out.println(check.getCheckNum()); 86. if(check.getCheckNum().equals(checkNum)){ 87. flag1 = true; 88. } 89. } 90. 91. Boolean flag2 = false; 92. if(flag1){ 93. //计算服务器时间与soapHeader时间戳之间的差值 94. Long between = countTime(time,current); 95. //时差在一个小时之内,算正常 96. if(Math.abs(between) < 3600L){ 97. flag2 = true; 98. } 99. } 100. 101. if(!(flag1 && flag2)){ 102. throw new AxisFault("校验失败"); 103. } 104. 105. //更新map内信息 106. CheckNumBean check = (CheckNumBean) map.get(operNum); 107. check.setLastTime(check.getCurrentTime()); 108. check.setCurrentTime(current); 109. } else if(null == element1 && (null == element2 || null == element3 || null == element4)){ 110. throw new AxisFault("校验失败"); 111. } 112. } 113. 114. //计算时间差 115. private Long countTime(String str1, String str2){ 116. SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 117. Date begin = null; 118. Date end = null; 119. try { 120. begin = df.parse(str1); 121. end = df.parse(str2); 122. } catch (ParseException e) { 123. e.printStackTrace(); 124. } 125. long between=(end.getTime()-begin.getTime())/1000;//除以1000是为了转换成秒 126. return between; 127. } 128.}
由于客户端是手持机,而这边的客户端是java ssh架构,所以存储用户信息,正能依靠内存来完成。
客户端调用的时候,需要向soapHeader放验证信息。
客户端代码如下:
1.package com.wensi.service.client; 2. 3. 4.import java.net.MalformedURLException; 5.import java.net.URL; 6.import java.rmi.RemoteException; 7.import java.util.Date; 8. 9.import javax.xml.namespace.QName; 10.import javax.xml.rpc.ParameterMode; 11.import javax.xml.rpc.ServiceException; 12.import javax.xml.rpc.encoding.XMLType; 13.import javax.xml.soap.SOAPElement; 14.import javax.xml.soap.SOAPException; 15. 16.import org.apache.axis.client.Call; 17.import org.apache.axis.client.Service; 18.import org.apache.axis.encoding.ser.ArrayDeserializerFactory; 19.import org.apache.axis.encoding.ser.ArraySerializerFactory; 20.import org.apache.axis.encoding.ser.BeanDeserializerFactory; 21.import org.apache.axis.encoding.ser.BeanSerializerFactory; 22.import org.apache.axis.message.SOAPHeaderElement; 23. 24.import com.wensi.common.Util; 25.import com.wensi.service.server.AccountCustomerBean; 26.import com.wensi.service.server.AccountFlag; 27.import com.wensi.service.server.AccountResponse; 28.import com.wensi.service.server.AuthorityBean; 29.import com.wensi.service.server.LoginResponse; 30.import com.wensi.service.server.OperatorBean; 31.import com.wensi.service.server.ServiceConstant; 32. 33. 34.public class ZNWServiceClient { 35. String endpoint = ServiceConstant.endpoint;//webservice的具体路径 36. Service service = new Service();//创建service实例 37. 38. public LoginResponse login(String userName,String password) throws Exception{ 39. SOAPHeaderElement cpHeader = new SOAPHeaderElement(endpoint,"MessageHeader"); 40. cpHeader.setPrefix("cp"); 41. cpHeader.setMustUnderstand(true); 42. SOAPElement ele = null; 43. ele = cpHeader.addChildElement("isLogin"); 44. ele.addTextNode("true"); 45. 46. //创建call实例 47. Call call = (Call) service.createCall(); 48. //将webservice的服务路径加入到call实例中,并为call设置服务的位置 49. URL url = new URL(endpoint); 50. call.setTargetEndpointAddress(url); 51. //调用webservice 的方法 52. call.setOperationName("login"); 53. //序列化对象 54. QName qn1 = new QName("urn:ZNWService","OperatorBean"); 55. call.registerTypeMapping(OperatorBean.class, qn1, new BeanSerializerFactory(OperatorBean.class,qn1), new BeanDeserializerFactory(OperatorBean.class,qn1)); 56. 57. QName qn2 = new QName("urn:ZNWService","AuthorityBean"); 58. call.registerTypeMapping(AuthorityBean.class, qn2, new BeanSerializerFactory(AuthorityBean.class,qn2), new BeanDeserializerFactory(AuthorityBean.class,qn2)); 59. 60. QName qn3 = new QName("urn:ZNWService","ArrayOfAuthorityBean"); 61. call.registerTypeMapping(AuthorityBean[].class, qn3,new ArraySerializerFactory(),new ArrayDeserializerFactory()); 62. 63. QName qn4 = new QName("urn:ZNWService","LoginResponse"); 64. call.registerTypeMapping(LoginResponse.class, qn4, new BeanSerializerFactory(LoginResponse.class,qn4), new BeanDeserializerFactory(LoginResponse.class,qn4)); 65. 66. call.addParameter("userName", org.apache.axis.Constants.XSD_STRING,ParameterMode.IN); 67. call.addParameter("password", org.apache.axis.Constants.XSD_STRING,ParameterMode.IN); 68. call.setReturnType(qn1, LoginResponse.class); 69. 70. call.addHeader(cpHeader); 71. 72. LoginResponse loginRes = (LoginResponse) call.invoke(new Object[]{userName,password}); 73. return loginRes; 74. } 75.}
【转载地址】
http://wufeng219219.iteye.com/blog/808807
发表评论
-
Apache CXF Writing a service with Spring notes
2012-12-26 11:22 899This example will lead you thro ... -
axis2和cxf取得内置对象
2012-12-25 19:30 1271开发webservice的时候使用内置对象的确很头疼,网上找了 ... -
CXF之用spring配置服务端实例
2012-12-25 16:05 990<?xml version="1.0&qu ... -
application/xml and text/xml的区别
2012-12-07 10:35 983经常看到有关xml时提到"application/x ... -
使用Eclipse的wsdl2java工具
2012-10-16 18:12 1245一、用Eclipse调用Axis的wsdl2java 1.在e ... -
axis WSDL2Java
2012-09-22 18:06 0Main: org.apache.axis.wsdl.WSDL ... -
Unable to find config file. Creating new servlet engine config file: /WEB-INF/se
2012-08-02 16:23 4318[solve]Unable to find config fi ... -
Axis2 不能传递Map等复杂数据类型解决方案 .
2012-08-01 15:09 1562一.用CXF进行服务端发布,Axis2 XMLBean方式生 ...
相关推荐
在 Axis1.4 中传递复杂类型数组参数,涉及到的是 Web 服务中的数据绑定和消息处理。Axis 是一个开源的 SOAP 库,它允许开发者创建、部署和使用 Web 服务。在处理复杂类型数组时,ArrayMapping 是 Axis 中的一个关键...
标题“axis1.4完整包下载”表明我们关注的是Apache Axis的1.4版本,这是一个较早但仍然在某些环境中使用的版本。 在描述中提到,“包含Axis1.4的所有完整包”,这意味着下载包中包含了运行和开发SOAP Web服务所需的...
在这个"WebService Axis1.4接口服务序列/反序列复杂项目实例"中,我们将深入探讨如何在 Axis1.4 中处理复杂的参数、自定义实体对象的序列化与反序列化,以及客户端的复杂调用。 首先,让我们理解序列化和反序列化的...
Axis1.4是Apache软件基金会提供的一个开源工具,专门用于处理Web服务,特别是基于SOAP(Simple Object Access Protocol)的Web服务。本文将深入探讨如何使用Axis1.4生成客户端,以及与之相关的知识点。 1. **Web...
而Axis1.4是Apache软件基金会的一个开源项目,它提供了一个SOAP(简单对象访问协议)Web服务框架,用于创建和部署Web服务。 当我们需要在Spring Boot项目中集成Axis1.4来实现Web服务时,我们需要了解以下几个关键...
Axis1.4是Apache软件基金会开发的一个开源SOAP(简单对象访问协议)库,主要用于构建和部署Web服务。这个版本的Axis是基于Java平台的,它为开发者提供了强大的工具集,以便于实现符合WS-I(Web Services ...
Axis1.4是Apache组织提供的一款基于Java的Web服务框架,它允许开发者轻松地创建、发布和调用Web服务。本文将深入探讨如何使用Axis1.4.jar包以及Eclipse IDE来实现WSDL(Web Service Description Language)和服务端...
axis1_4 发布webservice 传递对象或返回对象(一)_benet6_新浪博客.mht
在本文中,我们将深入探讨如何在Spring Boot项目中集成并使用Axis1.4来发布Web服务。Spring Boot以其简化配置和快速开发能力而受到广泛欢迎,而Axis1.4是Apache软件基金会的一个开源项目,主要用于生成和消费SOAP ...
Apache Axis1.4是Apache软件基金会开发的一个开源Web服务框架,专门用于构建和部署Web服务。这个框架在2004年发布,虽然现在已经有些老旧,但因其稳定性、广泛支持和丰富的功能,仍然在很多项目中被使用。本文将深入...
Axis1.4是Apache Axis的一个版本,它是一个流行的开源工具,用于实现和部署Java Web服务。Apache Axis1.4支持SOAP(Simple Object Access Protocol)和WSDL(Web Services Description Language),这两种技术是构建...
AXIS1.4是Apache软件基金会开发的一个开源Java库,用于构建和使用Web服务。它提供了在Java平台上创建Web服务的工具和API,使得开发者能够快速实现SOAP(Simple Object Access Protocol)通信。在这个"AXIS1.4 ...
当我们需要在Spring Boot项目中集成旧版的 Axis1.4 来发布Web服务时,这通常涉及到对传统SOAP(简单对象访问协议)服务的支持。以下将详细讲解如何在Spring Boot应用中集成Axis1.4以及使用wsdd文件发布Web服务。 ...
Apache Axis1.4是历史悠久的一款开源SOAP(Simple Object Access Protocol)服务器和客户端库,它主要用于构建Web服务。这款工具在2003年发布,是Apache软件基金会的一部分,旨在简化XML-RPC和SOAP的实现。由于其...
标题 "axis1.4+activation.jar+mail.jar" 指涉的是一个基于Java的Web服务开发工具包,Axis1.4,以及两个必要的库文件:activation.jar和mail.jar。这些组件在Java应用程序中,尤其是涉及到网络通信和邮件处理时扮演...
了解并熟练使用Axis1.4和Axis2的相关jar文件,对于开发和维护Web服务至关重要。这不仅可以帮助开发者快速构建服务,还能确保与现有系统和其他Web服务的互操作性。在实际项目中,应根据具体需求选择适合的版本,同时...
在这个“axis1.4 + document/literal 实例”中,我们将深入探讨Axis 1.4框架下的document/literal绑定模式。 首先,让我们理解什么是Axis 1.4。Axis 1.4是Axis的一个早期版本,它提供了一套工具和服务,使得开发者...
AXIS1.4客户端调用是关于Web服务客户端开发的一个主题,主要涉及到使用Apache Axis1.4库来创建和调用SOAP(Simple Object Access Protocol)服务。Apache Axis1.4是一个开源工具,它允许开发者在Java环境中轻松地...
在实际应用中, Axis1.4还可以与其他Java EE组件如EJB、JMS等结合,实现更复杂的业务逻辑。同时,由于Axis1.4支持WS-I(Web Services Interoperability)规范,因此可以保证跨平台、跨语言的互操作性。 总的来说,...
axis1.4 源码包,亲测,好用,放心下载,不必再进行反编译工作