webservice的使用-axis1-02

1.webservice传递javabean

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

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

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

  1.1 服务器端搭建

    1)创建java类并进行编译

package com.beifeng.hadoop.webservice.server;

import java.io.Serializable;

public class Order implements Serializable{

    private static final long serialVersionUID = 1L;
    
    private int orderId;
    private String orderName; 
    。。。之后的get和set方法在此进行省略
}    
package com.beifeng.hadoop.webservice.server;

public class OrderWebService {

    public Order getOrder(Order order) {
        order.setOrderName("response by server");
        return order;
    }
}

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

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

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

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

       

  1.2 客户端调用

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

        String url = "http://localhost:8080/axis/services/OrderWebService";

        Service service = new Service();
        Call call = (Call) service.createCall();

        // 注册javabean对象并添加序列化和反序列化器
        QName qn = new QName("urn:BeanService", "Order");
        call.registerTypeMapping(Order.class, qn,
                new BeanSerializerFactory(Order.class, qn),//序列化工厂类
                new BeanDeserializerFactory(Order.class, qn)); //反序列化工厂类

        call.setTargetEndpointAddress(url);
        call.setOperationName(new QName(url, "getOrder"));
        
        //设置传入和返回参数类型
        call.addParameter("arg1", qn, ParameterMode.IN);
        call.setReturnType(new QName(url, "Order"), Order.class);
        Order order = (Order) call.invoke(new Object[] { new Order() });
        
        //服务器返回
        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

package com.beifeng.hadoop.webservice.server.handler;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.util.Date;
import org.apache.axis.AxisFault;
import org.apache.axis.Handler;
import org.apache.axis.MessageContext;
import org.apache.axis.handlers.BasicHandler;

public class LogHandler extends BasicHandler {
    private static final long serialVersionUID = 1L;
    public void invoke(MessageContext msgContext) {
        try {
            //获取webservice服务
            Handler handler=msgContext.getService();
            
            //获取日志文件
            String filename=(String) this.getOption("filename");
            if (filename==null||filename.equals("")) {
                throw new AxisFault("日志文件不存在");
            }
            
            //创建基础文件输出流
            FileOutputStream fileOutputStream=new FileOutputStream(filename,true);
            
            //格式化输出流
            PrintWriter printWriter=new PrintWriter(fileOutputStream);
            
            //获取被访问次数
            Integer counter=(Integer) handler.getOption("accesses");
            if (counter==null) {
                counter=1;
            }else {
                counter++;
            }
            //记录日志
            printWriter.println("在"+new Date()+msgContext.getTargetService()+"被调用了"+counter+"次");
            printWriter.close();
            handler.setOption("accesses", counter);
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
}

      2)修改server-config.wsdd文件

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

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

        

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

      2.3.2.1 服务器端开发

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

package com.beifeng.hadoop.webservice.server.handler;

import org.apache.axis.AxisFault;
import org.apache.axis.MessageContext;
import org.apache.axis.handlers.BasicHandler;
import org.apache.axis.security.AuthenticatedUser;
import org.apache.axis.security.SecurityProvider;
import org.apache.axis.security.simple.SimpleSecurityProvider;

public class AuthenticationHandler extends BasicHandler {

    private static final long serialVersionUID = 1L;

    private String securityProvider="securityProvider";//安全服务
    
    private String unanthenticated="unauthenticated";//未认证
    
    private String authenticatedUser="authenticatedUser"; //已认证用户
    
    public void invoke(MessageContext msgContext) throws AxisFault {
        //获取当前的安全服务
        SecurityProvider provider=(SecurityProvider) msgContext.getProperty(securityProvider);
        if (provider==null) {
            provider=new SimpleSecurityProvider();
            msgContext.setProperty(securityProvider, provider);
        }
        
        //获取当前的认证信息
        //String username=msgContext.getUsername();
        //String password=msgContext.getPassword();
        //对访问的用户进行认证(查看用户名和密码是否在tomcat/webapps/axis/WEB-INF/users.lst文件中存在)
        AuthenticatedUser user=provider.authenticate(msgContext);
        if (user==null) {
            throw new AxisFault("认证失败");
        }
        //将已认证的用户添加到msgContext中
        msgContext.setProperty(authenticatedUser, user);
    }
}

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

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

    2.3.2.2 客户端调用代码

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

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

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

      1)编写handler

package com.beifeng.hadoop.webservice.server.handler;

import org.apache.axis.AxisFault;
import org.apache.axis.Handler;
import org.apache.axis.MessageContext;
import org.apache.axis.handlers.BasicHandler;
import org.apache.axis.security.AuthenticatedUser;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;public class AuthorityHandler extends BasicHandler {
    private static final long serialVersionUID = 1L;
    private static Log log=LogFactory.getLog(AuthorityHandler.class);
    public void invoke(MessageContext msgContext) throws AxisFault {
        //获取认证通过的用户
        AuthenticatedUser authenticatedUser=(AuthenticatedUser) msgContext.getProperty("authenticatedUser");
        if (authenticatedUser==null) {
            throw new AxisFault("用户不能为空!");
        }
        
        String username=authenticatedUser.getName();
        Handler hanlder = msgContext.getService();
        //获取配置文件中授权的用户列表字符串
        String allowedRoles=(String) hanlder.getOption("allowedRoles");
        if (allowedRoles==null) {
            log.info("不需要授权");
            return;
        }
        
        String[] roles=allowedRoles.split(",");
        for(String role:roles){
            if (username.equals(role)) {
                log.info("通过授权");
                return;
            }
        }
        throw new AxisFault("授权失败");
    }
}

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

<service name="HandlerWebService" provider="java:RPC">
    <parameter name="className" value="com.beifeng.hadoop.webservice.server.HandlerWebService" />
    <parameter name="allowedMethods" value="hello" />
  <!--授权的用户列表-->
  <parameter name="allowedRoles" value="tom,user1"/>
<requestFlow>      <!--认证handler配置-->      <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"/>
<handler name="LogHandler" type="java:com.beifeng.hadoop.webservice.server.handler.LogHandler">        <!--日志记录文件配置--> <parameter name="filename" value="/service.log"/> </handler> </requestFlow> </service>

 3 handler clain的配置

   <!--认证handler -->
    <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"/>
    <!-- 认证授权链  -->
    <chain name="chainHandler">
        <handler type="AuthenticationHandler"/>
        <handler type="AuthorityHandler"/>
    </chain>
    
    <!-- chain的使用 -->
    <service name="ChainService" provider="java:RPC">
        <parameter name="className" value="com.beifeng.hadoop.webservice.server.ChainWebService"/>
        <parameter name="allowedMethods" value="*"/>
        <requestFlow>
            <chain type="chainHandler"/>
        </requestFlow>
    </service>
原文地址:https://www.cnblogs.com/lifeone/p/7222121.html