1.webservice传递javabean

  自定义javabean必须是可序列化的

  如果javabean中有内部类必须是静态的,因为只有静态的类才可以序列化

  如果javabean中用到了其他的javabean,也必须在server-config.wsdd文件中进行映射声明

  1.1 服务器端搭建

    1)创建java类并进行编译

  1. package com.beifeng.hadoop.webservice.server;
  2.  
  3. import java.io.Serializable;
  4.  
  5. public class Order implements Serializable{
  6.  
  7. private static final long serialVersionUID = 1L;
  8.  
  9. private int orderId;
  10. private String orderName;
  11. 。。。之后的getset方法在此进行省略
  12. }
  1. package com.beifeng.hadoop.webservice.server;
  2.  
  3. public class OrderWebService {
  4.  
  5. public Order getOrder(Order order) {
  6. order.setOrderName("response by server");
  7. return order;
  8. }
  9. }

    2) 将编译后的class文件和包结构拷贝到tomcat/webapps/axis/web-info/classes目录下

    3) 在web-info目录下的server-config.wsdd文件中添加webservice服务

  1. <service name="OrderWebService" provider="java:RPC">
  2. <parameter name="className" value="com.beifeng.hadoop.webservice.server.OrderWebService" />
  3. <parameter name="allowedMethods" value="getOrder" />
         <!--配置实体映射-->
  4. <beanMapping qname="ns1:Order" languageSpecificType="java:com.beifeng.hadoop.webservice.server.Order" xmlns:ns1="urn:BeanService"/>
  5. </service>

    4) 重启tomcat,在浏览器中查看

       

  1.2 客户端调用

    必须在客户端代码中包含此实体,且包结构必须一致

  1. String url = "http://localhost:8080/axis/services/OrderWebService";
  2.  
  3. Service service = new Service();
  4. Call call = (Call) service.createCall();
  5.  
  6. // 注册javabean对象并添加序列化和反序列化器
  7. QName qn = new QName("urn:BeanService", "Order");
  8. call.registerTypeMapping(Order.class, qn,
  9. new BeanSerializerFactory(Order.class, qn),//序列化工厂类
  10. new BeanDeserializerFactory(Order.class, qn)); //反序列化工厂类
  11.  
  12. call.setTargetEndpointAddress(url);
  13. call.setOperationName(new QName(url, "getOrder"));
  14.  
  15. //设置传入和返回参数类型
  16. call.addParameter("arg1", qn, ParameterMode.IN);
  17. call.setReturnType(new QName(url, "Order"), Order.class);
  18. Order order = (Order) call.invoke(new Object[] { new Order() });
  19.  
  20. //服务器返回
  21. System.out.println(order);

2.webservice中的handler使用

  2.1 handler的创建方式:实现Handler接口或者集成BasicHandler

  2.2 handler的作用:类似于web中的Filter

    日志记录,认证和授权等

  2.3.1 handler日志记录实现

    2.3.1.1 服务器端的实现

      1)编写service类和handler类并实现invoke方法,编译拷贝class文件到tomcat

  1. package com.beifeng.hadoop.webservice.server.handler;
  2.  
  3. import java.io.FileNotFoundException;
  4. import java.io.FileOutputStream;
  5. import java.io.PrintWriter;
  6. import java.util.Date;
  7. import org.apache.axis.AxisFault;
  8. import org.apache.axis.Handler;
  9. import org.apache.axis.MessageContext;
  10. import org.apache.axis.handlers.BasicHandler;
  11.  
  12. public class LogHandler extends BasicHandler {
  13. private static final long serialVersionUID = 1L;
  14. public void invoke(MessageContext msgContext) {
  15. try {
  16. //获取webservice服务
  17. Handler handler=msgContext.getService();
  18.  
  19. //获取日志文件
  20. String filename=(String) this.getOption("filename");
  21. if (filename==null||filename.equals("")) {
  22. throw new AxisFault("日志文件不存在");
  23. }
  24.  
  25. //创建基础文件输出流
  26. FileOutputStream fileOutputStream=new FileOutputStream(filename,true);
  27.  
  28. //格式化输出流
  29. PrintWriter printWriter=new PrintWriter(fileOutputStream);
  30.  
  31. //获取被访问次数
  32. Integer counter=(Integer) handler.getOption("accesses");
  33. if (counter==null) {
  34. counter=1;
  35. }else {
  36. counter++;
  37. }
  38. //记录日志
  39. printWriter.println("在"+new Date()+msgContext.getTargetService()+"被调用了"+counter+"次");
  40. printWriter.close();
  41. handler.setOption("accesses", counter);
  42. }catch (Exception e) {
  43. e.printStackTrace();
  44. }
  45. }
  46. }

      2)修改server-config.wsdd文件

  1. <service name="HandlerWebService" provider="java:RPC">
  2. <parameter name="className" value="com.beifeng.hadoop.webservice.server.HandlerWebService" />
  3. <parameter name="allowedMethods" value="hello" />
  4. <requestFlow>
  5. <handler name="LogHandler" type="java:com.beifeng.hadoop.webservice.server.handler.LogHandler">
           <!--日志记录文件配置-->
  6. <parameter name="filename" value="/service.log"/>
  7. </handler>
  8. </requestFlow>
  9. </service>

      3)重启tomcat,并允许客户端代码进行调用,查看service.log文件内容

        

    2.3.2 权限认证(判断用户名和密码是否在tomcat/webapps/axis/WEB-INF/users.lst文件中存在)

      2.3.2.1 服务器端开发

        1) 编写handler,并编译拷贝class文件 

  1. package com.beifeng.hadoop.webservice.server.handler;
  2.  
  3. import org.apache.axis.AxisFault;
  4. import org.apache.axis.MessageContext;
  5. import org.apache.axis.handlers.BasicHandler;
  6. import org.apache.axis.security.AuthenticatedUser;
  7. import org.apache.axis.security.SecurityProvider;
  8. import org.apache.axis.security.simple.SimpleSecurityProvider;
  9.  
  10. public class AuthenticationHandler extends BasicHandler {
  11.  
  12. private static final long serialVersionUID = 1L;
  13.  
  14. private String securityProvider="securityProvider";//安全服务
  15.  
  16. private String unanthenticated="unauthenticated";//未认证
  17.  
  18. private String authenticatedUser="authenticatedUser"; //已认证用户
  19.  
  20. public void invoke(MessageContext msgContext) throws AxisFault {
  21. //获取当前的安全服务
  22. SecurityProvider provider=(SecurityProvider) msgContext.getProperty(securityProvider);
  23. if (provider==null) {
  24. provider=new SimpleSecurityProvider();
  25. msgContext.setProperty(securityProvider, provider);
  26. }
  27.  
  28. //获取当前的认证信息
  29. //String username=msgContext.getUsername();
  30. //String password=msgContext.getPassword();
  31. //对访问的用户进行认证(查看用户名和密码是否在tomcat/webapps/axis/WEB-INF/users.lst文件中存在)
  32. AuthenticatedUser user=provider.authenticate(msgContext);
  33. if (user==null) {
  34. throw new AxisFault("认证失败");
  35. }
  36. //将已认证的用户添加到msgContext中
  37. msgContext.setProperty(authenticatedUser, user);
  38. }
  39. }

        2)在tomcat/.../server.config.wsdd中添加配置

  1. <service name="HandlerWebService" provider="java:RPC">
  2. <parameter name="className" value="com.beifeng.hadoop.webservice.server.HandlerWebService" />
  3. <parameter name="allowedMethods" value="hello" />
  4. <requestFlow>
         <!--认证handler配置-->
         <handler name="AuthenticationHandler" type="java:com.beifeng.hadoop.webservice.server.handler.AuthenticationHandler"/>
  5. <handler name="LogHandler" type="java:com.beifeng.hadoop.webservice.server.handler.LogHandler">
  6.        <!--日志记录文件配置-->
  7. <parameter name="filename" value="/service.log"/>
  8. </handler>
  9. </requestFlow>
  10. </service>

    2.3.2.2 客户端调用代码

        需要在call中设置使用的用户名和密码  

  1. String url="http://localhost:8080/axis/services/HandlerWebService";
  2. Service service=new Service();
  3. Call call=(Call) service.createCall();
  4. call.setTargetEndpointAddress(url);
  5. call.setOperationName(new QName(url, "hello"));
  6.  
  7. //设置用户名密码
  8. call.setUsername("user1");
  9. call.setPassword("pass1");
  10. String result=(String) call.invoke(new Object[]{"tom"});

    2.3.3 授权(客户端和认证一样,这里只记录服务端开发)

      1)编写handler

  1. package com.beifeng.hadoop.webservice.server.handler;
  2.  
  3. import org.apache.axis.AxisFault;
  4. import org.apache.axis.Handler;
  5. import org.apache.axis.MessageContext;
  6. import org.apache.axis.handlers.BasicHandler;
  7. import org.apache.axis.security.AuthenticatedUser;
  8. import org.apache.commons.logging.Log;
  9. import org.apache.commons.logging.LogFactory;public class AuthorityHandler extends BasicHandler {
  10. private static final long serialVersionUID = 1L;
  11. private static Log log=LogFactory.getLog(AuthorityHandler.class);
  12. public void invoke(MessageContext msgContext) throws AxisFault {
  13. //获取认证通过的用户
  14. AuthenticatedUser authenticatedUser=(AuthenticatedUser) msgContext.getProperty("authenticatedUser");
  15. if (authenticatedUser==null) {
  16. throw new AxisFault("用户不能为空!");
  17. }
  18.  
  19. String username=authenticatedUser.getName();
  20. Handler hanlder = msgContext.getService();
  21. //获取配置文件中授权的用户列表字符串
  22. String allowedRoles=(String) hanlder.getOption("allowedRoles");
  23. if (allowedRoles==null) {
  24. log.info("不需要授权");
  25. return;
  26. }
  27.  
  28. String[] roles=allowedRoles.split(",");
  29. for(String role:roles){
  30. if (username.equals(role)) {
  31. log.info("通过授权");
  32. return;
  33. }
  34. }
  35. throw new AxisFault("授权失败");
  36. }
  37. }

      2)修改tomcat/.../server_config.wsdd

  1. <service name="HandlerWebService" provider="java:RPC">
  2. <parameter name="className" value="com.beifeng.hadoop.webservice.server.HandlerWebService" />
  3. <parameter name="allowedMethods" value="hello" />
      <!--授权的用户列表-->
      <parameter name="allowedRoles" value="tom,user1"/>
  4. <requestFlow>
  5.      <!--认证handler配置-->
  6.      <handler name="AuthenticationHandler" type="java:com.beifeng.hadoop.webservice.server.handler.AuthenticationHandler"/>
         <!--授权handler配置-->
         <handler name="AuthorityHandler" type="java:com.beifeng.hadoop.webservice.server.handler.AuthorityHandler"/>
  7. <handler name="LogHandler" type="java:com.beifeng.hadoop.webservice.server.handler.LogHandler">
  8.        <!--日志记录文件配置-->
  9. <parameter name="filename" value="/service.log"/>
  10. </handler>
  11. </requestFlow>
  12. </service>

3 handler clain的配置

  1.    <!--认证handler -->
  2. <handler name="AuthenticationHandler" type="java:com.beifeng.hadoop.webservice.server.handler.AuthenticationHandler"/>
  3. <!--授权handler -->
  4. <handler name="AuthorityHandler" type="java:com.beifeng.hadoop.webservice.server.handler.AuthorityHandler"/>
  5. <!-- 认证授权链 -->
  6. <chain name="chainHandler">
  7. <handler type="AuthenticationHandler"/>
  8. <handler type="AuthorityHandler"/>
  9. </chain>
  10.  
  11. <!-- chain的使用 -->
  12. <service name="ChainService" provider="java:RPC">
  13. <parameter name="className" value="com.beifeng.hadoop.webservice.server.ChainWebService"/>
  14. <parameter name="allowedMethods" value="*"/>
  15. <requestFlow>
  16. <chain type="chainHandler"/>
  17. </requestFlow>
  18. </service>

webservice的使用-axis1-02的更多相关文章

  1. 根据wsdl的url,使用axis1.4生成客户端,并且对webservice进行调用(转)

    根据wsdl的url,使用axis1.4生成客户端,并且对webservice进行调用 axis1.4下载地址 1.到www.apache.org上去下载axis-bin-1_4.zip,如要关联源代 ...

  2. java webservices 以Axis1.4方式 调用sap webservice接口.

    1. 首先需要下载Axis1.4 jar包,这个必应搜索大把,下载下来后把jar包加入eclipse工程项目路径中即可. 2. 下载mail.jar和activation.jar 俩个包.下载地址:h ...

  3. Webservice接口和Http接口

    WebService又是一种高级应用,与之前学习的Struts.Spring.Hibernate等框架不同.WebService是面向服务的架构(SOA),看起来像是比SSH框架要大.那么它到底是做什 ...

  4. 《转》CXF WebService 开发文档-目录索引

    CXF WebService 开发文档-目录索引 上次介绍了Axis的WebService,现在我们来看看CXF是怎么完成WebService的. Axis1 WebService 在线博文: htt ...

  5. Tomcat6.0+Jdk1.5+Axis1.3搭建java webservice环境,并使用c#调用该服务。

    java jdk:jdk1.5.0_17 下载网址:http://pan.baidu.com/s/1gdmAkgV tomcat 6.0 下载地址:http://tomcat.apache.org/d ...

  6. spring WebServiceTemplate 调用 axis1.4 发布的webservice

     前言: 最近在开发中需要调用对方的 webservice服务,按照现有的技术,本应该是一件很简单的事情,只需要拿到wsdl文件,生成客户端代码即可,但是,对方的webservice服务是06年用ax ...

  7. MyEclipse 搭建webservice (axis1.4)

    0 引言  以前都是做javaweb的 最近因工作需要 接触了webservice 关于什么事webservice,与web的区别,soap,跟http的区别,asix1和asix2的区别,为什么不用 ...

  8. axis1客户端调用webservice的通用代码

    1.axis1 作为web service 客户端时,调用web service 服务端的通用代码 String url = "http://www.webxml.com.cn/webser ...

  9. 使用URLConnection调用axis1.4开发的webservice

    写在前面: 调用webservice的方式有很多:1.直接在客户端使用工具生成客户端代码,将代码拷进项目中调用即可:2.使用对应的webservice框架来进行调用,比如如果我们我的服务端开发用的是a ...

  10. 基于axis1.4的webservice实例

    1.准备工作: 概念:SOAP(简单对象访问协议).WSDL(web服务描述语言).XML(可扩展标记语言).axis(阿帕奇可扩展交互系统) (1)     下载axis1.4,将axis1.4中的 ...

随机推荐

  1. MybatisPlus自动填充公共字段的策略

    背景:数据库中多个表有时间字段,并且字段名一致 需求:该时间字段由MybatisPlus自动插入和更新,业务代码无需处理 方法: 一.创建基础实体[BaseEntity],定义需要处理的公共字段(创建 ...

  2. 一个spark SQL和DataFrames的故事

    package com.lin.spark import org.apache.spark.sql.{Row, SparkSession} import org.apache.spark.sql.ty ...

  3. Oracle学习笔记<3>

    单值函数 1.函数的分类 Oracle数据库中函数分为两类: 1)单值函数 n条数据经过函数处理得到n条结果 例如:查询所有员工last_name,并以全部大写形式输出 2)多值函数(组函数) n条数 ...

  4. 高精度求A*B(FFT)

    A * B Problem Plus 链接:http://acm.hdu.edu.cn/showproblem.php?pid=1402 Time Limit: 2000/1000 MS (Java/ ...

  5. kubernetes容器集群管理部署master节点组件

    集群部署获取k8s二进制包 [root@master ~]# wget https://dl.k8s.io/v1.15.0/kubernetes-server-linux-amd64.tar.gz [ ...

  6. Java网络编程:IP地址和端口号

    1)IP地址 用来标志网络中的一个通信实体的地址.通信实体可以是计算机,路由器等. 2)IP地址分类 IPV4:32位地址,以点分十进制表示,如192.168.0.1 IPV6:128位(16个字节) ...

  7. deep features for text spotting 在linux,windows上使用

    做文本检测这个方向的同学应该都知道 deep features for text spotting 这篇ECCV14的文章. 用的是Matconvnet这个是深度学习框架来做文本检测,同时他还提供了代 ...

  8. JQuery-跑马灯(文字无缝向上翻动-封装)

    转载自他人:https://blog.csdn.net/z69183787/article/details/12857587   (function($){   $.fn.extend({   &qu ...

  9. C++ 之获取map元素[转]

    链接:https://www.cnblogs.com/jianfeifeng/p/11089799.html 对于map对象, count成员返回值只能是0或者1,map容器只允许一个键对应一个实例. ...

  10. ganglia监控部署

    1.ganglia组件 ganglia 相比于falcon和zabbix主要在于集群的状态集中显示,可以很便捷的对比各主机的性能状态. gmond:相当于是agent端,主要用于收集各node的性能状 ...