Web Service的Handler配置

        老大要求用web service实现一个增值服务,业务到很简单,于是顺着小研究了下,公司很守旧,只让用Axis,

而且还是1.4的,不过引擎也就只是一些配置的玩意。

        用Eclipse wtp开发web service实在太方便了,打算加几个handler玩一下,无意看到一篇文章,关于handler

描述的很全面 使用Handler来增强Web服务的功能 ,看完之后才发现是别人2003年的文章,感叹一下,自己真落

后啊!

        我参照这篇文章,共配了三个handler,创建的handler必须继承BasicHandler,其次必须在wsdd文件里配置,我这里是server-config.wsdd,从这两点来说跟servlet的filter很像。

        这是第一个handler用来写日志滴。


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  {

    
public void invoke(MessageContext msgContext) throws AxisFault {
        
// TODO Auto-generated method stub
         
//每当web服务被调用,都记录到log中。
        PrintWriter writer = null;
        
try {
            
//handler代表当前的服务
            Handler handler = msgContext.getService();
            
//调用父类的getOption用于获得wsdd文件配置的filename属性
            String filename = (String)getOption("filename");
            
if (filename == null || "".equals(filename))
                
throw new AxisFault("Server.NoLogFile""No log file configured for the LogHandler!"nullnull);
            FileOutputStream fos 
= new FileOutputStream(filename, true);            
            writer 
= new PrintWriter(fos);            
            Integer counter 
= (Integer)handler.getOption("accesses");
            
if (counter == null)
                counter 
= new Integer(0);            
            counter 
= new Integer(counter.intValue() + 1);            
            Date date 
= new Date();
            msgContext.getMessage().writeTo(System.out);
           
            String result 
= "" + date + ": Web 服务 " + msgContext.getTargetService() +
                            
" 被调用,现在已经共调用了 " + counter + " 次.";
            handler.setOption(
"accesses", counter);            
            writer.println(result);            
        }
 catch (Exception e) {
            e.printStackTrace();
            
throw AxisFault.makeFault(e);
        }

        
finally{
            
if (writer != null)
                writer.close();
        }

    }


}

在server-config.wsdd文件的配置如下

  < handler  name ="logging"  type ="java:packageName.LogHandler" >
  
< parameter  name ="filename"  value ="c:/MyService.log" />
 
handler >

wsdd文件的根节点是deployment,其下节点globalConfiguration,handler,service等。

这个就放在globalConfiguration节点之后,service节点之前,和其他的handler同级关系。

紧接着在找到服务的service节点,比如我这里的web service服务叫ReceviceInfo。

  < service  name ="ReceviceInfo"  provider ="java:RPC"  style ="wrapped"  use ="literal" >

 
< operation  name ="receviceInfo"  qname ="ns1:receviceInfo"  returnQName ="ns1:receviceInfoReturn"  returnType ="xsd:string"  soapAction =""  xmlns:ns1 ="http://business.mccservice.whty.com"  xmlns:xsd ="http://www.w3.org/2001/XMLSchema" >
   
< parameter  qname ="ns1:serviceId"  type ="xsd:string" />
   
< parameter  qname ="ns1:content"  type ="xsd:string" />
  
operation >

然后在注释内容为"这里添加handler"的地方添加如下代码

     < requestFlow >
        
< handler  type ="logging" />  
                 

    
requestFlow >

这样配置就完成了。调用服务的方法前会先进入LogHandler来写日志内容。

其他两个配置相同,AuthenticationHandler我用来验证ip,用户名和密码,AuthorizationHandler用来验证该用户的

权限。

        Axis还提供了两个Monitor来监听客户端和服务端的信息传送和返回情况,SOAPMonitor用来查看SOAP消息,

TCPMonitor用来查看http消息,想使用TCPMonitor工具很方面,在命令行窗口下输入

>cd %AXIS_HOME%/WEB-INF/lib/
>java -classpath axis.jar org.apache.axis.utils.tcpmon

就可看到界面。SOAPMonitor可以参看apache的文档 我弄了一个下午没成功,相当烦,最后就放弃了。

 

 

 

 

 

 

 

 

你可能感兴趣的:(service,web,import,integer,web服务,null)