Web Service的Handler配置

来源:互联网 发布:阿里云企业邮箱收费吗 编辑:程序博客网 时间:2024/06/08 14:21

        老大要求用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">
<!--  这里添加handler  -->
 
<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"/> 
                 
<!--  这里可以配置多个handler  -->
    
</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的文档 我弄了一个下午没成功,相当烦,最后就放弃了。