axis2+springmvc详解

关键代码:

Maven  pom.xml

<axis2.version>1.6.2</axis2.version>
   

<dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2</artifactId>
<version>${axis2.version}</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-adb</artifactId>
<version>${axis2.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-kernel</artifactId>
<version>${axis2.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-transport-http</artifactId>
<version>${axis2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-transport-local</artifactId>
<version>${axis2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-spring</artifactId>
<version>${axis2.version}</version>
</dependency>

  

spring 配置文件加入(使用注解自动扫描)

<bean id="applicationContext"
class="org.apache.axis2.extensions.spring.receivers.ApplicationContextHolder" />

  

web.xml

<servlet>
<servlet-name>AxisServlet</servlet-name>
<servlet-class>org.apache.axis2.transport.http.AxisServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:conf/axis2.xml</param-value>
</init-param>

<load-on-startup>2</load-on-startup>
</servlet>

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

  

java代码

public interface HelloService {

public String sayHello(String name);
}

  

import org.springframework.stereotype.Service;

@Service("helloService")
public class HelloServiceImpl implements HelloService {

	@Override
	public String sayHello(String name) {
		// TODO Auto-generated method stub
		if((name == null) || (name == "")) {
            name = "anonymous";
        }
        return "hello, " + name;
	}

}

  

在WebContent/WEB-INF/services/decode/META-INF/services.xml

此路径下建services.xml文件,decode可以自己取名,与则必须一致

<?xml version="1.0" encoding="UTF-8" ?>
<serviceGroup>
<service name="helloService" scope="application">
<description>simple spring example</description>

<module ref="userCheck"/>  <!--此处为Axis2身份验证-采用Module方式验证Soap Header实现 稍等介绍-->
<parameter name="ServiceObjectSupplier">
org.apache.axis2.extensions.spring.receivers.SpringAppContextAwareObjectSupplier
</parameter>
<parameter name="SpringBeanName">helloService</parameter>
<messageReceivers>
<messageReceiver mep= "http://www.w3.org/2004/08/wsdl/in-only"
class = "org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
<messageReceiver mep= "http://www.w3.org/2004/08/wsdl/in-out"
class = "org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
</messageReceivers>
</service>
</serviceGroup>

  

启动项目浏览器输入http://localhost:8080/工程名/services/helloService?wsdl 可以看到显示出webservice的wsdl信息,说明部署成功。

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

客户端:

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://localhost:8080/工程名/services/helloService");
		options.setTo(targetEPR);
		// 指定sayHello方法的参数值,如果有多个,继续往后面增加即可
		Object[] opAddEntryArgs = new Object[] { "axis2" };
		// 指定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);
	}

}

  

运行即可

Axis2身份验证-采用Module方式验证Soap Header实现

基于业务用户的身份认证吧。要实现这个功能,我们需要做三件事:

1、实现基于业务用户的身份认证的扩展模块,

2、在服务端加载扩展模块,

3、在客户端调用时,往soap头中添加身份信息。

一、实现基于业务用户的身份认证的扩展模块
需要新建一个普通的Java工程,新建两个类,一个是module另一个是handler。module类必须实现org.apache.axis2.modules.Module接口,可以不用具体实现任何接口方法,除非您的扩展模块有初始化及销毁的操作。这个是AXIS2架构要求的。

1、新建UserCheckModule类

import org.apache.axis2.AxisFault;
import org.apache.axis2.context.ConfigurationContext;
import org.apache.axis2.description.AxisDescription;
import org.apache.axis2.description.AxisModule;
import org.apache.axis2.modules.Module;
import org.apache.neethi.Assertion;
import org.apache.neethi.Policy;

public class UserCheckModule implements Module {

	@Override
	public void init(ConfigurationContext configContext, AxisModule module) throws AxisFault {
		// TODO Auto-generated method stub

	}

	@Override
	public void engageNotify(AxisDescription axisDescription) throws AxisFault {
		// TODO Auto-generated method stub

	}

	@Override
	public boolean canSupportAssertion(Assertion assertion) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public void applyPolicy(Policy policy, AxisDescription axisDescription) throws AxisFault {
		// TODO Auto-generated method stub

	}

	@Override
	public void shutdown(ConfigurationContext configurationContext) throws AxisFault {
		// TODO Auto-generated method stub

	}

}

  

handler类必须继承org.apache.axis2.handlers.AbstractHandler基类。实现invoke方法,具体的用户身份认证逻辑在此方法中实现。

2、UserCheckHandler类

import java.util.Iterator;

import org.apache.axiom.om.OMElement;
import org.apache.axis2.AxisFault;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.engine.Handler;
import org.apache.axis2.handlers.AbstractHandler;

public class UserCheckHandler extends AbstractHandler implements Handler {

    @Override
    public InvocationResponse invoke(MessageContext msgContext) throws AxisFault {
        // 获取Head
        OMElement fistElement = msgContext.getEnvelope().getHeader().getFirstElement();
        if (fistElement!=null&&fistElement.getChildren() != null) {
            Iterator<?> list = (Iterator<?>) fistElement.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("password")) {
                throw new AxisFault(" Authentication Fail! Check username/password ");
            }
            return InvocationResponse.CONTINUE;
        } else {
            throw new AxisFault(" Authentication Fail! Check username/password ");
        }
    }
}

  

3、接下来,我们需要编写module.xml,向axis2表明我们扩展的模块的实现是什么。这个文件需要我们在src目录下新建META-INF文件夹,并将这个文件放到META-INF文件夹下。
在module.xml中,除了<InFlow>外,还有<OutFlow>,<InFaultFlow>和<OutFaultFlow>,分别对应入、出、入错误、出错误四个流程,我们可以根据需要进行配置,像本人现在这个需求,只要在请求进入时进行验证,因此只要配置<InFlow>即可。

<?xml version="1.0" encoding="UTF-8"?>
<moudle name="userCheck" class="包.UserCheckModule">
    <InFlow>
        <handler name="InFlowLogHandler" class="包.UserCheckHandler">
            <order phase="userCheckPhase"/>
        </handler>
    </InFlow>
</moudle>

 4、在axis2.xml的<InFlow>的最后添加phase,像我的这个为<phase name="UserCheckPhase"/>

  axis2.xml引用在上面web.xml介绍

5、修改services.xml文件,在需要身份认证的服务中引用身份认证模块,<module ref="logging"/>。

  上面services.xml文件中有

客户端调用如上所示.

时间: 2024-10-31 10:49:01

axis2+springmvc详解的相关文章

Spring框架:SpringMVC详解

SpringMVC的工作流程.最先接触到请求的是DispatcherServlet,它会将请求根据配置文件转发到控制器,控制器返回视图名称和一个Model表示处理结果.DispatcherServlet再将处理结果发送给视图模板引擎,由它进行页面的渲染.下图是整个过程. 基本配置 声明servlet.首先要在web.xml中声明Spring的Servlet,代码如下: <servlet> <servlet-name>spring</servlet-name> <s

SpringMVC详解(五)------参数绑定

参数绑定,简单来说就是客户端发送请求,而请求中包含一些数据,那么这些数据怎么到达 Controller ?这在实际项目开发中也是用到的最多的,那么 SpringMVC 的参数绑定是怎么实现的呢?下面我们来详细的讲解. 1.SpringMVC 参数绑定 在 SpringMVC 中,提交请求的数据是通过方法形参来接收的.从客户端请求的 key/value 数据,经过参数绑定,将 key/value 数据绑定到 Controller 的形参上,然后在 Controller 就可以直接使用该形参. 这里

SpringMVC详解(二)

十. MVC 的 Handler 方法可以接受哪些 ServletAPI 类型的参数 HttpServletRequest HttpServletResponse HttpSession 十一.使用 POJO 对象绑定请求参数值 Spring MVC 会按请求参数名和 POJO 属性名进行自动匹 配,自动为该对象填充属性值.支持级联属性. 如:dept.deptId.dept.address.tel 等 十二.处理模型数据 Spring MVC 提供了以下几种途径输出模型数据: –ModelAn

SpringMVC详解(一)------入门实例

本系列教程我们将详细的对SpringMVC进行介绍,相信你在学完本系列教程后,一定能在实际开发中运用自如. 1.什么是 SpringMVC ? 在介绍什么是 SpringMVC 之前,我们先看看 Spring 的基本架构.如下图: 我们可以看到,在 Spring 的基本架构中,红色圈起来的 Spring Web MVC ,也就是本系列的主角 SpringMVC,它是属于Spring基本架构里面的一个组成部分,属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里

SpringMVC详解(六)------与json交互

Json(JavaScript Object Notation),它是一种轻量级数据交换格式,格式简单,易于读写,目前使用特别广泛.那么这篇博客我们主要谈谈在 SpringMVC 中,如何对 json 数据格式进行解析和转换? 本篇博客源码链接:http://pan.baidu.com/s/1kURnwDx 密码:b37t 1.两种交互模式 上图显示了客户端请求数据的两种格式,一种是 直接请求 json 数据,另一种是 key/value 数据.但是不管请求是哪种数据,为了在前端页面方便对结果进

[转]springMVC详解

SpringMVC学习笔记---- 一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于SpringMVC的配置 <!--configure the setting of springmvcDispatcherServlet and configure the mapping--> <servlet> <servlet-name>springmvc</servlet

SpringMvc详解

一Spring mvc是什么 二Spring mvc运行流程架构 三组件说明 1DispatcherServlet前端控制器 2HandlerMapping处理器映射器 3Handler处理器 4HandlAdapter处理器适配器 5ViewResolver视图解析器 四框架搭建流程 1导入相关架包本处不阐述 2配置前端控制器DispatcherServlet在WEB-INFwebxml中配置前端控制器 3配置处理器映射器HandlerMapping和处理器适配器HandlerAdapter注

SpringMVC详解(四)------SSM三大框架整合之登录功能实现

为了后面讲解的需要,我们取数据都会从数据库中获取,所以这里先讲讲三大框架(Spring.SpringMVC.MyBatis)的整合.前面讲解 MyBatis 时,写了一篇 MyBatis 和 Spring 的整合,有兴趣的可以先看看:http://www.cnblogs.com/ysocean/p/7368499.html ,那么接下来我们直接进入正题! 本篇博客源码下载链接:http://pan.baidu.com/s/1skAfNRZ 密码:n3fn 1.整合思路 ①.表现层,也就是 Con

SpringMVC详解(三)------基于注解的入门实例

前两篇博客我们讲解了基于XML 的入门实例,以及SpringMVC运行的详细流程.但是我们发现基于 XML 的配置还是比较麻烦的,而且,每个 Handler 类只能有一个方法,在实际开发中肯定是不可能这样来进行开发的.那么这篇博客我们就讲解实际开发中用的最多的基于注解配置的SpringMVC配置. 本篇博客源码下载 项目结构为: 1.在 web.xml 文件中配置前端处理器 <?xml version="1.0" encoding="UTF-8"?> &