`
sosdairs
  • 浏览: 5569 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

Axis的高级应用(一)

阅读更多

本文属于原创,转载请著明出处.欢迎各位朋友和我一起讨论.共同学习交流

      上一篇介绍了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的使用.

 

分享到:
评论

相关推荐

    Webservice之Axis高级编程

    3. **AXIS第三课:AXIS高级应用,使用Handler来增强Web服务的功能** Handler是Axis中一个强大的特性,允许开发者插入自定义逻辑在服务处理流程的各个阶段。你可以通过编写Handler来实现如认证、日志记录、消息转换...

    Axis高级编程

    #### 五、AXIS高级应用,在AXIS服务间传递JavaBean及其安全解决 **知识点概述:** 本节讨论如何在Axis服务之间传递JavaBean对象,并确保数据的安全性。 **知识点详述:** 1. **JavaBean的定义** - JavaBean是一...

    axis教程文档大全

    非常实用"意味着这份资料包含了从初学者到高级开发者所需的所有内容,无论你是刚刚接触Web服务,还是已经在项目中使用Axis有一段时间,都能从中获益。文档详尽地讲解了Axis如何帮助开发者轻松地创建、发布和调用Web...

    axis和axis2的一些发布差异(WSDL2Java) 收藏

    - Axis2提供了更多高级功能,如数据绑定的选择(通过`-d`指定,可以选择`adb`、`xmlbeans`、`jibx`、`jaxme`和`jaxbri`)。 2. **部署描述文件的生成**: - 在Axis中,可以通过添加`-D`选项来生成部署描述文件...

    axis2的API,axis2 API,axis2帮助文档

    本文将详细介绍Axis2的API及其在Web服务开发中的应用,同时也会探讨Axis2的帮助文档如何协助开发者更好地理解和使用这个框架。 ### Axis2简介 Axis2是Apache Axis的第二代版本,它在第一代的基础上进行了许多改进和...

    eclipse java axis2

    Eclipse Java Axis2 是一个基于Java的Web服务开发框架,由Apache软件基金会开发。它主要用于构建和部署SOAP(简单对象访问协议)Web服务。在Java环境中,Eclipse作为流行的集成开发环境(IDE),提供了强大的支持来...

    axis及其关联包

    Axis2支持更多高级Web服务标准,如WS-Addressing和WS-ReliableMessaging。 - **Axis2 Transports**: 一系列传输模块,包括HTTP、HTTPS、JMS等,用于发送和接收SOAP消息。 - **AXIOM (Apache XML Objects for ...

    axis-sample1.4.rar

    "axis-sample1.4.rar" 是一个压缩包文件,它包含了一个名为 "axis-sample" 的项目或库的版本1.4。Axis 是一个开源的Java Web服务开发框架,主要用于创建和部署SOAP(简单对象访问协议)服务。这个压缩包可能是为...

    Axis2 IBM developerWorks

    在IBM DeveloperWorks上,你可以找到一系列的文章,涵盖了从Axis2的安装、配置到高级特性的使用。这些文章可能会详细讲解如何创建服务部署单元(Service Archive, AAR)、如何配置模块、如何处理异常以及如何利用...

    tomcat与axis2的配置过程

    Apache Axis2是一个用于构建Web服务和Web服务客户端的高级框架。它与流行的Java应用服务器,如Apache Tomcat,协同工作。以下是配置Tomcat与Axis2的详细步骤: 1. **下载和解压Axis2**: 首先,访问Apache官方网站...

    Axis1.4_开发指南

    Axis1.4开发指南是一份针对使用Axis1.4版本开发WebService的详尽文档,它介绍了WebService的基本概念、Axis框架的安装与使用、WebService开发和部署的关键技术,以及如何处理复杂对象传递、异常和文件传递等高级特性...

    axis2所用jar包大全下载

    总之,Axis2项目需要一系列jar包来实现其功能,这些jar包涉及了Web服务的各个方面,从基础的SOAP处理到高级的功能如数据绑定和事务管理。开发者在使用Axis2时,必须确保所有必要的依赖都被正确地引入,以避免运行时...

    axis1_4

    在实际项目中, Axis1.4还可以与其他技术结合,例如Spring框架,实现更高级的功能,如依赖注入和事务管理。同时,对于安全性,可以通过设置HTTPS和数字证书来增强Web服务的安全性。 总之,Axis1.4是Java Web ...

    axis入门中文文档

    总的来说,【Axis入门中文文档】是学习和实践Web服务开发的重要参考资料,涵盖了从基础概念到高级应用的全面内容,对于理解和掌握Web服务技术具有极大的帮助。通过深入学习和实践,开发者可以更加熟练地运用Axis构建...

    Axis2WebService与Spring的整合

    在IT行业中,Web服务是应用程序之间进行通信的一种标准方式,而Axis2是Apache软件基金会开发的一个流行的Java Web服务框架。Spring框架则是Java企业级应用的事实标准,提供了强大的依赖注入、AOP(面向切面编程)等...

    axis2-demo

    标题 "axis2-demo" 指的是一个基于Apache Axis2框架的学习示例集合。Apache Axis2是Java平台上的一个Web服务开发框架,它为创建、部署和管理Web服务提供了强大的支持。这个压缩包包含了用于教学和实践目的的各种轴2...

    axis学习资源,很不错的资料哦

    4. AXIS的高级应用:这部分可能会探讨更复杂的主题,如WS-Security(Web服务安全)、消息传输优化机制(MTOM)和WS-I(Web服务互操作性)规范的实现,以及如何处理复杂的数据类型和错误处理。 在提供的压缩包文件...

    Axis2例子Demo

    这个"Axis2例子Demo"旨在帮助开发者快速理解和应用Axis2框架,解决他们在尝试 Axis2 示例时可能遇到的问题。 **一、Axis2简介** Axis2是基于SOAP(简单对象访问协议)的Web服务框架,它构建在AXIOM(抽象XML信息...

Global site tag (gtag.js) - Google Analytics