JAX-WS HandlerChain使用详解

原创 2015年07月21日 15:40:38

JAX-WS的Handler和Servlet的Filter相似,可以对所有WebServicer进行拦截,在Handler中可以记录日志、权限控制、对请求的SOAP消息进行加密,解密等。JAX-WS提供两个Handler接口,LogicalHandler和SOAPHandler。LogicalHandler处理的是Message Payload,只能够访问消息单元中的SOAP消息体。SOAPHandler处理的是整个SOAP消息(包含SOAP header和SOAP body),可以访问整个SOAP消息。

注册Handler的方式有下面几种:

使用HandlerResolver(客户端比较方便)

使用HandlerChain注解和配置文件

从WSDL生成

使用Custom Binding声明HandlerChain


实例代码http://download.csdn.net/detail/accountwcx/8922191


JAX-WS中WebService执行顺序如图所示



下面用SOAPHandler实现在WebService服务端记录请求内容和响应内容。

import java.io.IOException;
import java.util.Set;

import javax.xml.namespace.QName;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPMessage;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;

/**
 * 记录SOAP请求及响应
 * @author accountwcx@qq.com
 *
 */
public class LoggerHandler implements SOAPHandler<SOAPMessageContext> {

	@Override
	public void close(MessageContext context) {
	}

	@Override
	public boolean handleFault(SOAPMessageContext context) {
		return true;
	}

	@Override
	public boolean handleMessage(SOAPMessageContext context) {
		// 判断消息是输入还是输出
		Boolean output = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
		System.out.println(output ? "响应SOAP:" : "请求SOAP:");
		
		SOAPMessage message = context.getMessage();
		
		try {
			message.writeTo(System.out);
		} catch (SOAPException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		System.out.println("");

		return true;
	}

	@Override
	public Set<QName> getHeaders() {
		return null;
	}

}

在classpath下建handler-chain.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<javaee:handler-chains xmlns:javaee="http://java.sun.com/xml/ns/javaee"
	xmlns:xsd="http://www.w3.org/2001/XMLSchema">
	<javaee:handler-chain>
		<javaee:handler>
			<javaee:handler-class>com.rvho.server.ws.handler.LoggerHandler</javaee:handler-class>
		</javaee:handler>
	</javaee:handler-chain>
</javaee:handler-chains>

在服务实现类上添加HandlerChain配置

package com.rvho.server.ws.impl;

import java.util.Date;

import javax.jws.HandlerChain;
import javax.jws.WebService;

import com.rvho.server.ws.HelloWService;

@WebService(
	endpointInterface = "com.rvho.server.ws.HelloWService",
	portName = "HelloWSPort",
	serviceName = "HelloWSService",
	targetNamespace = "http://www.tmp.com/ws/hello"
)
@HandlerChain(file="handler-chain.xml") //添加Handler配置文件
public class HelloWServiceImpl implements HelloWService {
	public String index() {
		return "hello";
	}

	public Integer add(Integer x, Integer y) {
		return x + y;
	}

	public Date now() {
		return new Date();
	}
}

服务实现接口

package com.rvho.server.ws;

import java.util.Date;

import javax.jws.WebService;

/**
 * WebService接口
 */
@WebService(
	name = "HelloWS",
	targetNamespace = "http://www.tmp.com/ws/hello"
)
public interface HelloWService {
	/**
	 * 返回字符串
	 * 
	 * @return
	 */
	String index();

	/**
	 * 两个整数相加
	 * 
	 * @param x
	 * @param y
	 * @return 相加后的值
	 */
	Integer add(Integer x, Integer y);

	/**
	 * 返回当前时间
	 * 
	 * @return
	 */
	Date now();
}

客户端发起index请求,服务端的记录

请求SOAP:
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"
			xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<S:Body>
		<ns2:index xmlns:ns2="http://www.tmp.com/ws/hello" />
	</S:Body>
</S:Envelope>

响应SOAP:
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"
			xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<S:Body>
		<ns2:indexResponse xmlns:ns2="http://www.tmp.com/ws/hello">
			<return>hello</return>
		</ns2:indexResponse>
	</S:Body>
</S:Envelope>


【JAX-WS入门系列】第04章_SOAP异常处理和Handler处理

完整版见https://jadyer.github.io/2013/05/31/jaxws-soap-handler/
  • jadyer
  • jadyer
  • 2013年05月31日 19:09
  • 2253

jax-ws服务端生成和客户端调用实例详解

java自带webservice jax-ws客户端生成和服务端调用实例详解!
  • qiyejunlintian
  • qiyejunlintian
  • 2014年12月16日 10:23
  • 4327

JAX-WS 的简单使用

Jax-ws的WebService定义是通过注解进行的,我们必须在其WebService类的接口上使用@WebService注解进行标记...
  • Itfemg
  • Itfemg
  • 2015年03月09日 17:23
  • 2377

MyEclipse8_0中使用 JAX-WS 部署 WebService 实例

  • 2012年05月11日 16:41
  • 1.81MB
  • 下载

JAX-WS使用教程

  • 2013年09月17日 11:21
  • 658KB
  • 下载

JAX-WS使用教程(内含jar包)

  • 2012年06月12日 14:35
  • 6.36MB
  • 下载

JAX-WS开发webservice示例详解

http://www.micmiu.com/soa/webservice/jax-ws-demo/ 目录: 概述实验环境服务端的实现客户端的实现 [一]、概述 Java API for X...
  • caolaosanahnu
  • caolaosanahnu
  • 2012年08月07日 13:19
  • 741

JAX-WS - Handler详解

一、Handler说明     Handler用于处理Soap消息,如控制Header(如隐式的添加用户信息等)     Handler分成LogicalHandler和SOAPHandler...
  • u013379717
  • u013379717
  • 2014年06月24日 19:54
  • 1144

Jax-ws 开发webService ,并使用spring注入service类中遇到 空指针

一般情况下,使用eclipse自带的 jax-ws 生成webservice 会自动生成2个类: ContractConnector.java package com.wonders.we...
  • z69183787
  • z69183787
  • 2013年03月26日 10:04
  • 9127

JAX-WS Web Service -春秋航空销售部分接口使用

JAX-WS Web Service -春秋航空销售部分接口使用   春秋航空销售部分接口由于使用的是Web Service方式,只知道有这么一种接口类型,大多数我们还是用的RESTful Web...
  • doctor_who2004
  • doctor_who2004
  • 2017年05月09日 10:51
  • 1259
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JAX-WS HandlerChain使用详解
举报原因:
原因补充:

(最多只允许输入30个字)