handler可以作用于客户端,也可以作用了服务端

handler分为:1、LogicalHandler:只能获取到soap消息的body。

       2、SOAPHandler:可以获取SOAPMessage的信息(我们通常用这种)。

客户端--》服务端的请求中通过handler的顺序:

假如客户端和服务端的handler-chain.xml中定义的顺序都是:LogicalHandler1/SOAPHandler1/LogicalHandler2/SOAPHandler2

那么请求的顺序将是:

client-->LogicalHandler1-->LogicalHandler2-->SOAPHandler1-->SOAPHandler2-->|服务器容器|-->SOAPHandler1-->SOAPHandler2-->LogicalHandler1-->LogicalHandler2-->service

一、在客户端加handler

服务端service

@Override
public void testException() throws MyException{
throw new MyException("this is my exception");
}

在classpath目录下添加handler文件:handler-chain.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<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.ws03.MySoapHandler</javaee:handler-class>
</javaee:handler>
<!--还可以加入其它的handler
<javaee:handler>
<javaee:handler-class>com.ws03.MySoapHandler</javaee:handler-class>
</javaee:handler>
-->
</javaee:handler-chain>
</javaee:handler-chains>

MySoapHandler.java

package com.ws03;

import java.io.IOException;
import java.util.Set;
import javax.xml.namespace.QName;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPHeader;
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; public class MySoapHandler implements SOAPHandler<SOAPMessageContext> {
@Override
public boolean handleFault(SOAPMessageContext context) {
System.out.println("run handleFault method!");
return false;
} /**
* 先判断是否是发出去的消息,然后再在soapheader中添加消息userpassword
*/
@Override
public boolean handleMessage(SOAPMessageContext context) {
System.out.println("run handleMessage method!");
Boolean out = (Boolean)context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if(out){
SOAPMessage message = context.getMessage();
try {
SOAPEnvelope senv = message.getSOAPPart().getEnvelope();
SOAPHeader header = senv.getHeader();
if(header==null){
header = senv.addHeader();
}
QName qname = new QName("http://ws01.com/", "userpassword","lic");
header.addChildElement(qname).setValue("123456");
message.writeTo(System.out);
System.out.println();
} catch (SOAPException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//返回true表示继续执行之后的业务代码,否则停止运行业务代码
return true;
} @Override
public void close(MessageContext context) {
System.out.println("run close method!");
} @Override
public Set<QName> getHeaders() {
return null;
}
}

使用wsimport命令或者myeclipse生成客户端代码:

修改生成的IServiceImpService.java文件,在类定义上加上下面注解:

@HandlerChain(file="handler-chain.xml")

测试类:

@Test
public void test01(){
IServiceImpService service = new IServiceImpService();
IService iService = service.getIServiceImpPort();
try {
iService.testException();
} catch (MyException_Exception e) {
e.printStackTrace();
}
}

运行结果:

run handleMessage method!
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Header><lic:userpassword xmlns:lic="http://ws01.com/">123456</lic:userpassword></S:Header><S:Body><ns2:testException xmlns:ns2="http://ws01.com/"/></S:Body></S:Envelope>
run handleFault method!
run close method!
com.ws03.MyException_Exception: test exception
.....................

 二、服务器端获取soapheader消息

编写服务端handler的java文件,并配置。

ServiceSoapHandler.java

package com.ws01;

import java.util.Set;

import javax.xml.namespace.QName;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPHeader;
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; import org.w3c.dom.Node; public class ServiceSoapHandler implements SOAPHandler<SOAPMessageContext> { /**
* 如果客户端的saopheader为空或者密码不能123456则直接停止运行业务代码
*/
@Override
public boolean handleMessage(SOAPMessageContext context) {
Boolean out = (Boolean)context.get(SOAPMessageContext.MESSAGE_OUTBOUND_PROPERTY);
if(!out){
SOAPMessage message = context.getMessage();
try {
SOAPHeader header = message.getSOAPPart().getEnvelope().getHeader();
if(header != null){
Node node = header.getElementsByTagName("lic:userpassword").item(0);
String password = node.getTextContent();
System.out.println("client send password:"+password);
if(!"123456".equals(password)) return false;
}else{
return false;
}
} catch (SOAPException e) {
e.printStackTrace();
} }
return true;
} @Override
public Set<QName> getHeaders() {
// TODO Auto-generated method stub
return null;
} @Override
public void close(MessageContext context) {
// TODO Auto-generated method stub } @Override
public boolean handleFault(SOAPMessageContext context) {
// TODO Auto-generated method stub
return false;
}
}

IServiceImp.java

package com.ws01;

import javax.jws.HandlerChain;
import javax.jws.WebService; @WebService(endpointInterface="com.ws01.IService")
@HandlerChain(file="service-handler-chain.xml")
public class IServiceImp implements IService { @Override
public void testException() throws MyException {
throw new MyException("test exception");
//throw new RuntimeException("service runtime Exception");
} }

service-handler-chain.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<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.ws01.ServiceSoapHandler</javaee:handler-class>
</javaee:handler>
</javaee:handler-chain>
</javaee:handler-chains>

webservice系统学习笔记7-使用handler实现过滤器/拦截器效果的更多相关文章

  1. 【Spring学习笔记-MVC-17】Spring MVC之拦截器

    作者:ssslinppp       1. 拦截器简介及应用场景 2. 拦截器接口及拦截器适配器 3. 运行流程图 正常运行 中断流程 4. 程序实例 控制层: @Controller @Reques ...

  2. webservice系统学习笔记10-使用jax-ws创建基于tomcat类型的容器的ws服务

    1.在web-info目录下新建目录wsdl 2.在1步的目录下 新建文件user.wsdl <?xml version="1.0" encoding="UTF-8 ...

  3. webservice系统学习笔记9-使用契约优先的方式的一个服务端demo(隐式传Header信息)

    服务器端: 1.编写wsdl文件 <?xml version="1.0" encoding="UTF-8" standalone="no&quo ...

  4. webservice系统学习笔记8-简单的权限校验

    服务端handler.java package com.ws01; import java.util.Set; import javax.xml.namespace.QName; import jav ...

  5. webservice系统学习笔记6-使用soap的header传递消息

    1.显示的使用soap的header传递消息(不推荐使用,会破坏正常的代码结构,推荐使用handler处理) @WebResult(name="deleteResult") pub ...

  6. webservice系统学习笔记5-手动构建/发送/解析SOAP消息

    手动拼接SOAP消息调用webservice SOAP消息的组成: 1.创建需要发送的SOAP消息的XML(add方法为例子) /** * 创建访问add方法的SOAP消息的xml */ @Test ...

  7. webservice系统学习笔记4-使用工具查看SOAP消息

    使用myeclipse的WTP java ee视图里的[web services Explorer]来测试查看webservice传输的SOAP消息 1. 2. 测试getUserByUsername ...

  8. webservice系统学习笔记2-使用jdk的命令生成本地代码

    使用jdk自带的命令wsimport生成远程服务的本地代码 C:\Documents and Settings\Administrator>wsimport -d E:\mhWorkspace\ ...

  9. webservice系统学习笔记1-使用注解创建ws服务

    简单入门之helloword,具体详细的在后面的章节详细介绍. 使用JDK自带的jax-ws创建并发布一个简单的webservice 在本地创建服务,然后本机访问 1.创建服务提供接口 IMyServ ...

随机推荐

  1. Java基础加强总结(二)——泛型

    一.体验泛型 JDK1.5之前的集合类中存在的问题——可以往集合中加入任意类型的对象,例如下面代码: package cn.gacl.generic.summary; import java.util ...

  2. 微软正式发布VS2015和.Net为开发者提供数百个新功能

    今天,我很高兴地向大家宣布:Visual Studio 2015 和 .Net 4.6 的正式版本现已提供下载! 自去年十一月我们提出了微软开发技术的愿景:让所有开发者,无论他在什么平台,开发哪种应用 ...

  3. [转载] MATLAB快捷键

    原文地址,点此查看 一.常用对象操作 除了一般windows窗口的常用功能键外. 1.!dir 可以查看当前工作目录的文件. !dir& 可以在dos状态下查看. 2.who   可以查看当前 ...

  4. Spring-Bean配置-使用外部属性文件(转)

    Spring-Bean配置-使用外部属性文件 所以可以通过@value注解获取配置文件的key-value,生成一个配置文件bean.用以在代码中直接使用bean的方式. •在配置文件里配置Bean时 ...

  5. mormot当作内存数据库(缓存)使用

    mormot当作内存数据库(缓存)使用 mormot的TSQLRestStorageInMemory可以作为内存数据库来使用. 上图是在笔者4代I5笔记本上做的测试,增加10万记录,耗时:562毫秒. ...

  6. VS2010 打包生成exe文件后 执行安装文件出现 TODO:&lt;文件说明&gt;已停止工作并已关闭

    一.VS2010 打包生成exe文件后  执行安装文件出现  TODO:<文件说明>已停止工作并已关闭 TODO: <文件说明>已停止工作 原因: 打包的时候在文件系统中建立了 ...

  7. idea 配置简单web

    1.创建Facets 创建web的facets,可修改web的目录路径,如java目录 2.创建artifacts 创建web aplication exploded ,添加lib包到web-inf, ...

  8. vc 获得调用者的模块名称

    void ShowCallerModuleName(void* calleraddr ){ HMODULE hCallerModule = NULL; TCHAR szModuleName[MAX_P ...

  9. 近看到的机器学习、NLP相关书单

    书单再多,不去读,也是白搭~~ 水木上的machine learning书单:http://www.newsmth.net/bbscon.php?bid=5&id=34859&ftyp ...

  10. 深入理解Java中的组合和继承

    Java是一个面向对象的语言.每一个学习过Java的人都知道,封装.继承.多态是面向对象的三个特征.每个人在刚刚学习继承的时候都会或多或少的有这样一个印象:继承可以帮助我实现类的复用.所以,很多开发人 ...