Axis2基础

本章主要介绍如何使用axis2开发webservice接口。

以下以一个实例程序讲解如何编写一个axis2的服务端和客户端。

axis2版本:axis2-1.5.4-bin.zip

目录结构:

关键代码:

package com.alfred.check;

import java.util.Iterator;
import org.apache.axiom.om.OMElement;
import org.apache.axis2.AxisFault;
import org.apache.axis2.context.MessageContext;

public class AccessCheck {
	public static void checkUserPwd() throws AxisFault {
		MessageContext msgContext = MessageContext.getCurrentMessageContext();
		// 获取Head
		Iterator list = (Iterator) msgContext.getEnvelope().getHeader()
				.getFirstElement().getChildren();
		String username = "";
		String password = "";
		while (list.hasNext()) {
			OMElement element = (OMElement) list.next();
			if (element.getLocalName().equals("username")) {
				username = element.getText();
			}
			if (element.getLocalName().equals("password")) {
				password = element.getText();
			}
		}
		if (!username.equals("admin") || !password.equals("123456")) {
			throw new AxisFault(
					" Authentication Fail! Check username/password ");
		}
	}
}

AccessCheck.java

package com.alfred.service;

import org.apache.axis2.AxisFault;

import com.alfred.check.AccessCheck;

public class SoapService {
	public String sayHello(String name) throws AxisFault {
		// 以下是添加axis2访问头部验证
		// AccessCheck.checkUserPwd();
		return "Hello," + name;
	}

	public String getWorld() {
		return "Hello,World";
	}
}

SoapService.java

package com.alfred.client;

import javax.xml.namespace.QName;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;

import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;

public class ServiceClient {
	public static void main(String args[]) throws AxisFault {
		sendAxis2();
	}

	/**
	 * 添加Header头部验证信息
	 *
	 * @return
	 */
	public static OMElement createHeaderOMElement() {
		OMFactory factory = OMAbstractFactory.getOMFactory();
		OMNamespace SecurityElementNamespace = factory.createOMNamespace(
				"http://handler.com", "wsse");
		OMElement authenticationOM = factory.createOMElement("Authentication",
				SecurityElementNamespace);
		OMElement usernameOM = factory.createOMElement("username",
				SecurityElementNamespace);
		OMElement passwordOM = factory.createOMElement("password",
				SecurityElementNamespace);
		usernameOM.setText("admin");
		passwordOM.setText("123456");
		authenticationOM.addChild(usernameOM);
		authenticationOM.addChild(passwordOM);
		return authenticationOM;
	}

	/**
	 * 发送axis2的接口信息
	 * @throws AxisFault
	 */
	private static void sendAxis2() throws AxisFault {
		// 使用RPC方式调用WebService
		RPCServiceClient serviceClient = new RPCServiceClient();

		// 向Soap Header中添加校验信息
		serviceClient.addHeader(createHeaderOMElement());

		Options options = serviceClient.getOptions();
		// 指定调用WebService的URL
		EndpointReference targetEPR = new EndpointReference(
				"http://127.0.0.1:8080/aw/services/mySoapService");
		options.setTo(targetEPR);
		// 指定sayHello方法的参数值,如果有多个,继续往后面增加即可
		Object[] opAddEntryArgs = new Object[] { "alfred" };
		// 指定sayHello方法返回值的数据类型的Class对象
		Class[] classes = new Class[] { String.class };
		// 在创建QName对象时,QName类的构造方法的第一个参数表示WSDL,文件的命名空间名,也就是<wsdl:definitions>元素的targetNamespace属性值
		// 第二个参数是要调用的方法名
		QName opAddEntry = new QName("http://service.alfred.com", "sayHello");
		// 返回参数类型,这个和axis1有点区别
		// invokeBlocking方法有三个参数:
		// 第一个参数的类型是QName对象,表示要调用的方法名;
		// 第二个参数表示要调用的WebService方法的参数值,参数类型为Object[];
		// 第三个参数表示WebService方法的返回值类型的Class对象,参数类型为Class[];
		// 当方法没有参数时,invokeBlocking方法的第二个参数值不能是null,而要使用new Object[]{}
		// 如果被调用的WebService方法没有返回值,应使用RPCServiceClient类的invokeRobust方法,
		// 该方法只有两个参数,它们的含义与invokeBlocking方法的前两个参数的含义相同
		Object ret = serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs,
				classes)[0];
		System.out.println(ret);
	}

}

ServiceClient.java

<?xml version="1.0" encoding="UTF-8"?>
<serviceGroup>
	<!-- 可以指定发布多个service -->
	<service name="mySoapService">
	    <description>
	        axis2 example
	    </description>
	    <!-- 指定接口类地址 -->
	    <parameter name="ServiceClass">
	        com.alfred.service.SoapService
	    </parameter>
	    <!-- Operation级消息接收器:可以为不同的操作指定不同的消息接收器
	    <operation name="sayHello">
        	<messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
    	</operation>
	    <operation name="getWorld">
        	<messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
    	</operation>
	     -->
	    <!-- 服务级消息接收器 -->
	    <messageReceivers>
	        <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
	            class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
	        <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
	            class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
	    </messageReceivers>
	</service>
</serviceGroup>

services.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

	<!--Axis2 config start-->
	<display-name>Apache-Axis2</display-name>
    <servlet>
        <servlet-name>AxisServlet</servlet-name>
        <servlet-class>org.apache.axis2.transport.http.AxisServlet</servlet-class>
        <!--<init-param>-->
        <!--<param-name>axis2.xml.path</param-name>-->
        <!--<param-value>/WEB-INF/conf/axis2.xml</param-value>-->
        <!--<param-name>axis2.xml.url</param-name>-->
        <!--<param-value>http://localhost/myrepo/axis2.xml</param-value>-->
        <!--<param-name>axis2.repository.path</param-name>-->
        <!--<param-value>/WEB-INF</param-value>-->
        <!--<param-name>axis2.repository.url</param-name>-->
        <!--<param-value>http://localhost/myrepo</param-value>-->
        <!--</init-param>-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet>
        <servlet-name>AxisAdminServlet</servlet-name>
        <servlet-class>
            org.apache.axis2.webapp.AxisAdminServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>AxisServlet</servlet-name>
        <url-pattern>/servlet/AxisServlet</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>AxisServlet</servlet-name>
        <url-pattern>/services/*</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>AxisServlet</servlet-name>
        <url-pattern>*.jws</url-pattern>
    </servlet-mapping>
	<!--Axis2  end-->

	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>
</web-app>

web.xml

在浏览器地址栏输入地址:http://127.0.0.1:8080/aw/services/mySoapService?wsdl(使用tomcat服务器,项目名为aw),可以看到显示出webservice的wsdl信息,说明部署成功。

在ServiceClient中,调用sayHello,打印信息:

需要注意的一点就是services.xml文件的存放位置是固定的:WEB-INF/services/任意名字的文件夹/META-INF/services.xml

axis2访问验证

axis2接口可以通过向信息头部(Header)中添加验证信息,对接口调用者的身份进行验证。具体配置步骤是:

1、服务端在想要进行访问验证的接口方法中(sayHello),添加验证模块(AccessCheck.checkUserPwd());

2、验证模块通过获取webservice访问信息头部,提取验证信息,对客户端传递的验证信息进行进行检查判断;

3、客户端调用接口时,加入访问验证信息;

// 向Soap Header中添加校验信息
serviceClient.addHeader(createHeaderOMElement());

axis2的https访问

axis2如果需要进行https访问,需要加入全局配置文件axis2.xml(Axis2下提供了三种配置文件,第一种是整个系统的全局配置axis2.xml,第二种是服务配置services.xml,第三种是模块配置module.xml),默认该文件是存储在/WEB-INF/conf/axis2.xml。axis2.xml文件可以在axis2的开发包下获取。

在axis2.xml中加入一段:

<transportReceiver name="https" class="org.apache.axis2.transport.http.AxisServletListener">
    <parameter name="port">443</parameter>
</transportReceiver>

配置完成后访问https://127.0.0.1/aw/services/mySoapService?wsdl显示出webservice的wsdl信息,说明配置成功。

客户端如果想要访问https的服务端,需将服务端证书加入系统属性中

//指定服务端证书
System.setProperty("javax.net.ssl.keyStore",ProjConf.SERVER_KEYSTORE);
System.setProperty("javax.net.ssl.keyStorePassword",ProjConf.SERVER_KEYSTORE_PASSWORD);

System.setProperty("javax.net.ssl.trustStore",ProjConf.SERVER_TRUSTSTORE);
System.setProperty("javax.net.ssl.trustStorePassword",ProjConf.SERVER_TRUSTSTORE_PASSWORD);

如果想要手动指定axis2.xml文件路径(例如改为config文件夹下),可以在web.xml中配置(见上方web.xml)

<init-param>
        <param-name>axis2.xml.path</param-name>
        <param-value>/WEB-INF/config/axis2.xml</param-value>
</init-param>

常见错误

1、javax.servlet.ServletException: org.apache.axis2.AxisFault: The system is attempting to engage a module that is not available: addressing

解决方法:到axis2.xml中查找

<!-- Comment this to disable Addressing -->
<module ref="addressing"/>

将addressing的引用注释掉。

2、https is forbidden

解决方法:核实axis2.xml文件位置是否正确,默认是在WEB-INF/conf/axis2.xml,以及axis2.xml中是否配置了https。

3、unable to find valid certification path to requested target

解决方法:核实客户端访问https是否将证书加入系统属性。

最后,项目的结构如下:

时间: 2024-11-10 20:41:07

Axis2基础的相关文章

java web 开发三剑客 -------电子书

Internet,人们通常称为因特网,是当今世界上覆盖面最大和应用最广泛的网络.根据英语构词法,Internet是Inter + net,Inter-作为前缀在英语中表示“在一起,交互”,由此可知Internet的目的是让各个net交互.所以,Internet实质上是将世界上各个国家.各个网络运营商的多个网络相互连接构成的一个全球范围内的统一网,使各个网络之间能够相互到达.各个国家和运营商构建网络采用的底层技术和实现可能各不相同,但只要采用统一的上层协议(TCP/IP)就可以通过Internet

Eclipse + Apache Axis2 发布RESTful WebService(一)基础知识

1.什么是WebService 学习 WebService 第一步:体系结构.三元素SOAP/WSDL/UDDI 2.什么是Axis2 Axis2是Apache一套崭新的WebService引擎(框架),该版本是对Axis1.x重新设计的产物. Axis2不仅支持SOAP1.1和SOAP1.2,还集成了非常流行的REST WebService,同时还支持Spring.JSON等技术. 使用Axis2可以很方便的进行WebService开发,并可以与Eclipse集成. 3.什么是RESTful

利用Axis2默认口令安全漏洞入侵WebService网站

近期,在黑吧安全网上关注了几则利用Axis2默认口令进行渗透测试的案例,大家的渗透思路基本一致,利用的技术工具也大致相同,我在总结这几则案例的基础之上进行了技术思路的拓展.黑吧安全网Axis2默认口令安全弱点利用案例:航空安全之四川航空某系统漏洞导致Getshell(影响内网60多台主机安全\目测已被其他人渗透过)乐信通某服务器axis2服务存在弱口令可上传webshell(root权限)中国科学院网Web-services(axis2)系统任意代码执行工具准备:Axis2利用工具包: cat.

axis2五种创建服务方式的比较

AXIOM:Axis2 Object Model,Axis2对象模型 Axis2 对象模型(AXIs2 Object Model,AXIOM)是 Axis2 的基础,任何 SOAP 消息在 Axis2 中都表示为 AXIOM.AXIOM 相对于其他 XML 表示形式的优势在于,它基于 pull 解析器技术,而其他大多数则基于 push 解析器技术.pull 与 push 的主要不同之处在于,在 pull 技术中,调用者对解析器具有完全控制权,可以要求下一个事件:而对于 push,当要求解析器继续

WebService学习之旅(六)使用Apache Axis2实现WebService客户端调用

上节介绍了如何使用Axis2 发布一个WebService,Axis2除了为我们编写WebService应用带来了便利,也同样简化的客户端调用的过程,本节在上节的基础上使用Axis2自带的工具生成客户端调用辅助类,并实现客户端调用代码的编写. 1.將前面下载的axis2-1.7.1-bin.zip解压,新建一个环境变量AXIS2_HOME,值为解压后目录路径.接着在path变量中添加%AXIS2_HOME%/bin;. 2.Eclipse中新建一个Java Project,打开Windows控制

Spring项目跟Axis2结合

本文的前提是已经有一个Spring的项目,在此基础上如何跟Axis2进行结合,开发出WebService服务和调用WebService服务. 1.开放WebService服务    1.引入必要的jar包          将axis2-1.6.2-bin\axis2-1.6.2\lib所有包引入到你自己的工程中.(当然里面有些是不必要的,有兴趣的可以自己删减).    2.引入必要的文件,以及创建新的Service.xml         1.将\axis2-1.6.2-war\axis2\W

利用AXIS2传递JSON数据

Axis2是目前比较流行的WebService引擎.WebService被应用在很多不同的场景.例如,可以使用WebService来发布服务端 Java类的方法,以便使用不同的客户端进行调用.这样可以有效地集成多种不同的技术来完成应用系统.WebService还经常被使用在SOA中,用于 SOA各个部分交换数据.本文重点在于如何使用AXIS2引擎实现传递JSON数据. 博主本人由于项目需要,所以就查找了关于Web Service的文章.但碍于博主对Web的不熟,所以很多也就是按照网上教程做的.或

Java注解(1)-注解基础

注解(Annotation)是在JAVA5中开始引入的,它为在代码中添加信息提供了一种新的方式.注解在一定程度上把元数据与源代码文件结合在一起,正如许多成熟的框架(Spring)所做的那样.那么,注解到底可以做什么呢? 1.注解的作用. 提供用来完整地描述程序所需要的信息,如编译期校验程序信息. 生成描述符文件,或生成新类的定义. 减轻编写"样板"代码(配置文件)的负担,可以使用注解自动生成. 更加干净易读的代码. 编译期类型检查. 2.Java提供的注解 Java5内置了一些原生的注

MySQL数据库基础知识

day02 MySQL数据库基础知识 一.基础知识概述: 基础决定你这门课程的学习成败!只有学习好这些基础知识以后,你才能真正的运用自如.才能够对数据库有更深入的了解,道路才会越走越远. 二.基础知识: 1.数据库(database):数据库就好比是一个物理的文档柜,一个容器,把我们整理好的数据表等等归纳起来. 创建数据库命令:        create database 数据库名; 2.查看数据库         show databases; 3.打开指定的数据库         use