zoukankan      html  css  js  c++  java
  • 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>
  • 相关阅读:
    node lesson2
    二级联动(list对象中存list对象)
    Spring的注解@Qualifier注解
    @Service(value = "aaaa") 和@Service( "a")的区别
    oracle分页
    Oracle数据导入导出imp/exp
    oracle截取某个字符前面的字符串
    oracle中截取某个字符前面和后面的值
    解决Eclipse启动报错Failed to create the Java Virtual Machine
    成功秘诀就是拿出勇气和坚定的信念去做自己喜欢并且擅长的事情
  • 原文地址:https://www.cnblogs.com/lifeone/p/7222121.html
Copyright © 2011-2022 走看看