本文属于原创,转载请著明出处.欢迎各位朋友和我一起讨论.共同学习交流
上一篇介绍了Axis的三种发布方式,之前有提到,应用得最广泛的还是stub方式.本章主要是围绕stub方式发布的webservice服务而展开.讲解将从浅到深,依次展开.
本章将涉及到的内容主要是 handler 的应用. Handler和Chain是Axis引擎提供的一个很强大的工具.假如现在客户有以下需求:
1.记录来访客户端的IP地址.
2.记录webservice服务被访问的次数.
3.以日志的形式记录以上两个信息.
具体分析下来,该需求并不是很复杂.有几种解决方案:
1.在所访问的webservice服务中实现一个全局变量,每次有访问,则加1,且取得IP
2.在访问的入口处记录访问次数和IP
假设现在对外提供10个webservice服务,那么采用第一种解决方案,势必要重复10次代码.若采用第二种解决方案,我们只需要实现handler,即可解决所有问题.handler的好处初步显露出来.下面看代码
服务端代码
package myservice;
public class MyService implements MyServiceInterface{
public String processService(String arg) {
return arg;
}
public String processService(String arg1, String arg2) throws Exception{
return " welcome !";
}
}
当客户端调用processService方法时,返回字符串
LogHandler类
public class LogHandler extends BasicHandler {
public void invoke(MessageContext msgContext) throws AxisFault {
// 每当web服务被调用,都记录到log中。
try {
Handler handler = msgContext.getService();
String filename = (String) getOption("log");
if ((filename == null) || (filename.equals(""))) {
throw new AxisFault("Server.NoLogFile",
"No log file configured for the LogHandler!", null,
null);
}
URL url = ClassLoader.getSystemResource("");
String path = "";
if (url != null) {
path = url.getPath();
if (path.lastIndexOf("/work") != -1) {
path = path.substring(0, path.length() - "/work".length());
}
}
FileOutputStream fos = new FileOutputStream(path + filename, true);
PrintWriter 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();
HttpServletRequest request = (HttpServletRequest) msgContext
.getProperty(HTTPConstants.MC_HTTP_SERVLETREQUEST);
msgContext.getMessage().writeTo(System.out);
String result = "在" + date + ": Web 服务 "
+ msgContext.getTargetService() + " 被来自 "
+ getRealIpAddress(request) + " 调用, 现在已经共调用了 " + counter
+ " 次.";
handler.setOption("accesses", counter);
writer.println(result);
System.out.println(result);
writer.close();
} catch (Exception e) {
throw AxisFault.makeFault(e);
}
}
}
BasicHandler是一个抽象类,Axis提供了很多Handler的具体实现,BasicHandler只是其中最简单的一个。invoke方法必须在BasicHandler的子类中实现.getOption(String name)方法是取得HashMap中的键值对中的值(稍后贴出源码).该LogHandler取"log"属性的文件名,创建日志文件,将访问端的IP地址和访问次数写入日志中.
getRealIpAddress(HttpRequest request)方法如下
public String getRealIpAddress(HttpServletRequest request) throws Exception {
String ip = request.getRemoteAddr();
try {
ip = request.getHeader("x-forwarded-for");
if (ip == null || ip.length() == 0
|| "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0
|| "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0
|| "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
} catch (Exception ex) {
throw ex;
}
return ip;
}
上面这段代码我就不解释了,大家google一下
关键部分来了,来看看发布的deploy.wsdd
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<!-- 定义全局LogHandler -->
<!-- 该Log用来记录访问者的IP地址等客户端信息 -->
<handler name="Log" type="java:handler.LogHandler">
<parameter name="log" value="appliction.log"/>
</handler>
<service name="MyService" provider="java:RPC">
<parameter name="className" value="myservice.MyService" />
<parameter name="allowedMethods" value="*" />
<!-- webservice服务中的object的生命周期 -->
<!-- request, session, application -->
<parameter name="scope" value="session"/>
<requestFlow>
<handler type="Log"/>
</requestFlow>
</service>
</deployment>
在应用的的 */WEB-INF/ 的目录下,执行命令
java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -lhttp://localhost:8080/axis_example/servlet/AxisServlet deploy.wsdd
(注意:1 在web.xml中要定义AxisServlet 和 AdminClient; 2 tomcat要在启动状态下)
命令成功后将生成server-config.wsdd,片段截取如下
<handler name="Log" type="java:handler.LogHandler">
<parameter name="log" value="appliction.log"/>
</handler>
<service name="MyService" provider="java:RPC">
<requestFlow>
<handler type="Log"/>
</requestFlow>
<parameter name="allowedMethods" value="*"/>
<parameter name="scope" value="session"/>
<parameter name="className" value="myservice.MyService"/>
</service>
看到这,大家可能会猜到LogHandler类中getOption("log")的含义.没错.他就是取<parameter name="log" value="appliction.log"/>, 取得的值为"appliction.log". 为了验证自己的猜想,找到axis对应的源码.看看吧.
public abstract class BasicHandler implements Handler {
protected boolean makeLockable = false;
protected Hashtable options;
protected String name;
protected void initHashtable()
{
if (makeLockable) {
options = new LockableHashtable();
} else {
options = new Hashtable();
}
}
public void setOption(String name, Object value) {
if ( options == null ) initHashtable();
options.put( name, value );
}
public Object getOption(String name) {
if ( options == null ) return( null );
return( options.get(name) );
}
}
Handler通过getOption(String)这个方法拿到了配置文件中我配置的属性值,而我们上述所做的所有工作对于原来的Webserivce来说都是透明的,不会对侵入原有的程序当中。一个Handler可以被多个service所使用通过<requestFlow>这个标签来引用到某一个service中,这里还要多提一句既然是一个requestFlow,这个当然可以加不只一个的Handler。除了<requestFlow>之外,Axis还提供了与之相应的</responseFlow>,用法和是requestflow一样的,所不同的是一个在service执行之前一个是之后。可以加下面代码到发布文件中的<service>元素下就可以实现responseflow的功能.在以后的文章中,会见到这两个标签的具体使用.在此先暂时不表.
下一张,将在此章的基础上做一些扩展.我们来看看Handler其他的应用. 包括用户认证和权限认证,最后将引出chain的使用.
分享到:
相关推荐
3. **AXIS第三课:AXIS高级应用,使用Handler来增强Web服务的功能** Handler是Axis中一个强大的特性,允许开发者插入自定义逻辑在服务处理流程的各个阶段。你可以通过编写Handler来实现如认证、日志记录、消息转换...
#### 五、AXIS高级应用,在AXIS服务间传递JavaBean及其安全解决 **知识点概述:** 本节讨论如何在Axis服务之间传递JavaBean对象,并确保数据的安全性。 **知识点详述:** 1. **JavaBean的定义** - JavaBean是一...
非常实用"意味着这份资料包含了从初学者到高级开发者所需的所有内容,无论你是刚刚接触Web服务,还是已经在项目中使用Axis有一段时间,都能从中获益。文档详尽地讲解了Axis如何帮助开发者轻松地创建、发布和调用Web...
- Axis2提供了更多高级功能,如数据绑定的选择(通过`-d`指定,可以选择`adb`、`xmlbeans`、`jibx`、`jaxme`和`jaxbri`)。 2. **部署描述文件的生成**: - 在Axis中,可以通过添加`-D`选项来生成部署描述文件...
本文将详细介绍Axis2的API及其在Web服务开发中的应用,同时也会探讨Axis2的帮助文档如何协助开发者更好地理解和使用这个框架。 ### Axis2简介 Axis2是Apache Axis的第二代版本,它在第一代的基础上进行了许多改进和...
Eclipse Java Axis2 是一个基于Java的Web服务开发框架,由Apache软件基金会开发。它主要用于构建和部署SOAP(简单对象访问协议)Web服务。在Java环境中,Eclipse作为流行的集成开发环境(IDE),提供了强大的支持来...
Axis2支持更多高级Web服务标准,如WS-Addressing和WS-ReliableMessaging。 - **Axis2 Transports**: 一系列传输模块,包括HTTP、HTTPS、JMS等,用于发送和接收SOAP消息。 - **AXIOM (Apache XML Objects for ...
"axis-sample1.4.rar" 是一个压缩包文件,它包含了一个名为 "axis-sample" 的项目或库的版本1.4。Axis 是一个开源的Java Web服务开发框架,主要用于创建和部署SOAP(简单对象访问协议)服务。这个压缩包可能是为...
在IBM DeveloperWorks上,你可以找到一系列的文章,涵盖了从Axis2的安装、配置到高级特性的使用。这些文章可能会详细讲解如何创建服务部署单元(Service Archive, AAR)、如何配置模块、如何处理异常以及如何利用...
Apache Axis2是一个用于构建Web服务和Web服务客户端的高级框架。它与流行的Java应用服务器,如Apache Tomcat,协同工作。以下是配置Tomcat与Axis2的详细步骤: 1. **下载和解压Axis2**: 首先,访问Apache官方网站...
Axis1.4开发指南是一份针对使用Axis1.4版本开发WebService的详尽文档,它介绍了WebService的基本概念、Axis框架的安装与使用、WebService开发和部署的关键技术,以及如何处理复杂对象传递、异常和文件传递等高级特性...
总之,Axis2项目需要一系列jar包来实现其功能,这些jar包涉及了Web服务的各个方面,从基础的SOAP处理到高级的功能如数据绑定和事务管理。开发者在使用Axis2时,必须确保所有必要的依赖都被正确地引入,以避免运行时...
在实际项目中, Axis1.4还可以与其他技术结合,例如Spring框架,实现更高级的功能,如依赖注入和事务管理。同时,对于安全性,可以通过设置HTTPS和数字证书来增强Web服务的安全性。 总之,Axis1.4是Java Web ...
总的来说,【Axis入门中文文档】是学习和实践Web服务开发的重要参考资料,涵盖了从基础概念到高级应用的全面内容,对于理解和掌握Web服务技术具有极大的帮助。通过深入学习和实践,开发者可以更加熟练地运用Axis构建...
在IT行业中,Web服务是应用程序之间进行通信的一种标准方式,而Axis2是Apache软件基金会开发的一个流行的Java Web服务框架。Spring框架则是Java企业级应用的事实标准,提供了强大的依赖注入、AOP(面向切面编程)等...
标题 "axis2-demo" 指的是一个基于Apache Axis2框架的学习示例集合。Apache Axis2是Java平台上的一个Web服务开发框架,它为创建、部署和管理Web服务提供了强大的支持。这个压缩包包含了用于教学和实践目的的各种轴2...
4. AXIS的高级应用:这部分可能会探讨更复杂的主题,如WS-Security(Web服务安全)、消息传输优化机制(MTOM)和WS-I(Web服务互操作性)规范的实现,以及如何处理复杂的数据类型和错误处理。 在提供的压缩包文件...
这个"Axis2例子Demo"旨在帮助开发者快速理解和应用Axis2框架,解决他们在尝试 Axis2 示例时可能遇到的问题。 **一、Axis2简介** Axis2是基于SOAP(简单对象访问协议)的Web服务框架,它构建在AXIOM(抽象XML信息...