Handler的使用
Java EE 中web service 开发handler的使用
1、 handler的作用:类似于servlet中的filter
a) 客户端 --- http请求 --- filter的过滤 ---资源访问
Filter作用:对客户的认证,授权
将用户的操作写入日志
加密、解密
webservice对象的缓存
2、 webservice的工作原理
SOAP消息 ----------------web服务器(部署handler)
3、 实现的过程:
a) 接口的方式:org.apache.axis.Handler
b) 继承的方式(使用居多):org.apache.axis.Handlers.BasicHandler
---方法:MessageContext() --- 接收和响应客户端的请求SOAPMessage
c) Handler配合Service出现
i. Service
ii. Handler
在服务端创建一个简单的webservice
HandlerService.java
publicclassHandlerService {
//创建一个简单的webservice
public StringpublicMethod(String name){
return"Hello"+ name ;
}
}
创建一个handler日志类
LogHandler.java
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;
publicclassLogHandler extends BasicHandler{
//invoke方法是每一个Handler必须实现的方法
publicvoid invoke(MessageContextmsgcontext) throwsAxisFault {
//每当webservice服务被调用,记录到log中
try{
//通过MessageContext对象,获取webservice
Handlerhandler = msgcontext.getService() ;
//生成log的文件名
Stringfilename = (String) this.getOption("filename") ;//获取当前web上的log日志文件
if(filename == null || filename.equals("")){
thrownew AxisFault("Server nologFile","No log file configuration for the LogHandler",null,null) ;
}
//创建一个基础文件输出流
FileOutputStreamfos = newFileOutputStream(filename,true) ;
//包装基础文件输出流:格式化的输出流
PrintWriterwriter = newPrintWriter(fos) ;
//统计webservice被调用了几次
Integercount = (Integer) handler.getOption("accesses") ;
if(count == null){
count= newInteger(0) ;
count= newInteger(count.intValue() + 1) ;//计数1次
Datedate = newDate() ;
//在控制台上做显示
msgcontext.getMessage().writeTo(System.out) ;
//创建日志信息次
Stringresult = "在" + date + " :web服务 " +msgcontext.getTargetService() + "被调用,截止到现在一共调用了" + count + "次" ;
handler.setOption("accesses",count) ;
writer.println(result);
writer.close();
}
}catch(Exception e){
e.printStackTrace();
}
}
}
发布服务,也就是修改server-config.wsdd文件信息
<service name="HandlerService"provider="java:RPC">
<parametername="className" value="com.webservice.anni.HandlerService"/>
<parametername="allowedMethods" value="*" />
<requestFlow>
<handlername="logging"type="java:com.webservice.anni.LogHandler">
<parametername="filename" value="C:\tomcat7.0\MyService.log"/>
</handler>
</requestFlow>
</service>
保存启动tomcat,没出现任何错误,服务已经被注册了,接下来就是编写客户端的代码了,在客户端项目里,编写LogClient.java。和以前的代码类似
import javax.xml.namespace.QName;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
publicclassLogClient {
publicstaticvoid main(String[] args) throws Exception {
Loglog = LogFactory.getLog(LogClient.class) ;
Stringurl = "http://localhost:8089/axis/services/HandlerService" ;
Serviceservice = newService() ;
Callcall = (Call) service.createCall() ;
call.setTargetEndpointAddress(new URL(url)) ;
call.setOperationName(new QName("HandlerService","publicMethod"));
Stringres = (String) call.invoke(new Object[]{"Mr.li"}) ;
log.info(res);
}
}