SOAP Handler
概述
SOAP Handler是一个SOAP message的拦截器,它可以拦截进来或出去两个方向的SOAP message,修改并决定是否放行。
例如:
服务端
文件分布图
Handler
package cn.ljl.sand.jws.chapter4.service.handler;
import java.util.Set;
import javax.xml.namespace.QName;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPFault;
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 javax.xml.ws.soap.SOAPFaultException;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class AccessHandler implements SOAPHandler<SOAPMessageContext> {
@Override
public boolean handleMessage(SOAPMessageContext context) {
Boolean out = (Boolean) context
.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
// true表示出的方向,即服务端返回的时候;false表示进的方向,即服务端接收请求参数的时候
if (!out) {
SOAPHeader header = null; try {
header = context.getMessage().getSOAPPart().getEnvelope().getHeader();
} catch (SOAPException e) {
e.printStackTrace();
return false;
}
if (header == null) {
String tip = "缺少头部信息!";
SOAPFaultException exception = createFaultException(tip);
throw exception;
} else if (!header.hasChildNodes()) {
String tip = "头部信息不能为空!";
SOAPFaultException exception = createFaultException(tip);
throw exception;
} else {
NodeList nl = header.getElementsByTagNameNS(
"http://service.chapter4.jws.sand.ljl.cn/", "user");
if (nl.getLength() == 0) {
String tip = "头部信息中找不到用户信息!";
SOAPFaultException exception = createFaultException(tip);
throw exception;
}
Node node = nl.item(0);
String user = node.getTextContent();
System.out.println("请求的用户为:" + user);
}
}
return true;
}
@Override
public boolean handleFault(SOAPMessageContext context) {
return false;
}
@Override
public void close(MessageContext context) {
}
@Override
public Set<QName> getHeaders() {
return null;
}
/**
* 根据消息创建异常.
*
* @param message
* 消息
* @return
*/
private SOAPFaultException createFaultException(String message) {
SOAPFault fault = null;
try {
SOAPMessage smess = MessageFactory.newInstance().createMessage();
SOAPBody body = smess.getSOAPPart().getEnvelope().getBody();
fault = body.addFault();
fault.setFaultString(message);
} catch (SOAPException e) {
e.printStackTrace();
if (fault == null)
return null;
}
SOAPFaultException exception = new SOAPFaultException(fault);
return exception;
}
}
Handler配置文件
<?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>
cn.ljl.sand.jws.chapter4.service.handler.AccessHandler
</javaee:handler-class>
</javaee:handler>
</javaee:handler-chain>
</javaee:handler-chains>
服务接口
package cn.ljl.sand.jws.chapter4.service;
import javax.jws.WebResult;
import javax.jws.WebService;
@WebService
public interface IAccessService {
@WebResult(name = "accessResult")
public String access();
}
服务实现类
package cn.ljl.sand.jws.chapter4.service;
import javax.jws.HandlerChain;
import javax.jws.WebService;
@WebService(endpointInterface = "cn.ljl.sand.jws.chapter4.service.IAccessService")
@HandlerChain(file = "cn/ljl/sand/jws/chapter4/service/handler/handler-chains.xml")
public class AccessServiceImpl implements IAccessService {
@Override
public String access() {
String message = "你成功了!";
return message;
}
}
服务发布者
package cn.ljl.sand.jws.chapter4.service;
import javax.xml.ws.Endpoint;
public class AccessServicePublisher {
public static void main(String[] args) {
String address = "http://localhost:6666/service/access";
IAccessService service = new AccessServiceImpl();
Endpoint.publish(address, service);
}
}
发布服务
客户端
文件分布图
Handler
package cn.ljl.sand.jws.chapter4.client.handler;
import java.util.Set;
import javax.xml.namespace.QName;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPFault;
import javax.xml.soap.SOAPHeader;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;
public class UserHandler implements SOAPHandler<SOAPMessageContext> {
@Override
public boolean handleMessage(SOAPMessageContext context) {
Boolean out = (Boolean) context
.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
// true表示出的方向,即发送请求到服务端
if (out) {
try {
SOAPEnvelope envelope = context.getMessage().getSOAPPart()
.getEnvelope();
SOAPHeader header = envelope.getHeader();
if (header == null)
header = envelope.addHeader();
QName hname = new QName(
"http://service.chapter4.jws.sand.ljl.cn/", "user");
header.addChildElement(hname).setTextContent("杨过");
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
return true;
}
@Override
public boolean handleFault(SOAPMessageContext context) {
SOAPFault fault = null;
try {
SOAPEnvelope envelope = context.getMessage().getSOAPPart()
.getEnvelope();
fault = envelope.getBody().getFault();
} catch (SOAPException e) {
e.printStackTrace();
return false;
}
System.out.println("在客户端Handler中:" + fault.getFaultString());
return false;
}
@Override
public void close(MessageContext context) {
// TODO Auto-generated method stub
}
@Override
public Set<QName> getHeaders() {
// TODO Auto-generated method stub
return null;
}
}
Handler配置文件
handler-chains.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>
cn.ljl.sand.jws.chapter4.client.handler.UserHandler
</javaee:handler-class>
</javaee:handler>
</javaee:handler-chain>
</javaee:handler-chains>
使用wsimport生成代码
@HandlerChain(file = "cn/ljl/sand/jws/chapter4/client/handler/handler-chains.xml")
客户端
package cn.ljl.sand.jws.chapter4.client;
import java.net.MalformedURLException;
import java.net.URL;
import org.junit.Assert;
import org.junit.Test;
import cn.ljl.sand.jws.chapter4.client.wsimport.AccessServiceImplService;
import cn.ljl.sand.jws.chapter4.client.wsimport.IAccessService;
public class WSIClient {
/** wsdl的地址 */
private static final String WSDL_URL = "http://localhost:6666/service/access?wsdl";
@Test
public void test() throws MalformedURLException {
URL url = new URL(WSDL_URL);
AccessServiceImplService ss = new AccessServiceImplService(url);
IAccessService service = ss.getAccessServiceImplPort();
String message = service.access();
Assert.assertEquals("你成功了!", message);
}
}
测试
客户端不添加head参数
客户端添加head参数
SOAP Handler的更多相关文章
- A little bit about Handlers in JAX-WS
by Rama Pulavarthi Handlers are message interceptors that can be easily plugged in to the JAX-WS run ...
- CXF之五 拦截器Interceptor
拦截器(Interceptor)是CXF功能最主要的扩展点,可以在不对核心模块进行修改的情况下,动态添加很多功能.拦截器和JAX-WS Handler.Filter的功能类似,当服务被调用时,就会创建 ...
- WebService--jax
使用javax.jws编写webservice服务: 服务端: 1,定义webservice接口: package com.jws.serviceInterface; import javax.jws ...
- 全国人口 信息(NCIIC)接口开发纪要
阶段一:根据wsdl2java命令解析https://ws.nciic.org.cn/nciic_ws/services/NciicServices?wsdl以生成接口调用的对象类: wsdl2jav ...
- CXF实战之拦截器Interceptor(四)
拦截器(Interceptor)是CXF功能最基本的扩展点,能够在不正确核心模块进行改动的情况下.动态加入非常多功能.拦截器和JAX-WS Handler.Filter的功能相似,当服务被调用时.就会 ...
- org.codehaus.xfire.fault.XFireFault: Could not read XML stream.. Nested exception is javax.xml.strea
xfire使用中出现故障: 1. [2014-04-16 14:51:07.564]-[ERROR] org.apache.struts2.dispatcher.Dispatcher Exceptio ...
- Kali linux 2016.2(Rolling)中的Exploits模块详解
简单来将,这个Exploits模块,就是针对不同的已知漏洞的利用程序. root@kali:~# msfconsole Unable to handle kernel NULL pointer der ...
- XFire客户端调用CXF服务端(四)
前面章节:http://www.cnblogs.com/xiehongwei/p/8082337.html 已经开发出了CXF服务端,现在用XFire开发客户端调用CXF服务端,代码如下: impor ...
- salesforce 零基础学习(五十五)java通过SOAP方式定时访问某个文件然后插入到sObject中
项目源码:https://github.com/zhangyueqidlmu/SOAP-Access-SFDC.git 项目背景:salesforce端相关数据需要其他系统提供,其他系统可以提供相关数 ...
随机推荐
- 什么叫TLD、gTLD、nTLD、ccTLD、iTLD 以及几者之间的关系
TLD TLD的全称是Top Level Domain,顶级域名,它是一个因特网域名的最后部分,也就是任何域名的最后一个点后面的字母组成的部分. 最早的顶级域名有:.com(公司和企业)..net(网 ...
- PHP日期时间操作
一.设置时区 date_default_timezone_set('PRC'); 二.获取当前时间的 Unix 时间戳(格林威治时间 1970 年 1 月 1 日 00:00:00到当前时间的秒数)和 ...
- 【lydsy1407】拓展欧几里得求解不定方程+同余方程
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1407 题意: 有n个野人,野人各自住在第c[i]个山洞中(山洞成环状),每年向前走p[i] ...
- python中的Queue模块
queue介绍 queue是python的标准库,俗称队列.可以直接import引用,在python2.x中,模块名为Queue.python3直接queue即可 在python中,多个线程之间的数据 ...
- CTF线下赛AWD模式下的生存技巧
作者:Veneno@Nu1L 稿费:200RMB 投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿 原文:https://www.anquanke.com/post/id/8467 ...
- •搭建LAMP环境及快速部署双网站并实现基于域名的虚拟主机
本节所讲内容: 实战:搭建LAMP环境及快速部署双网站并实现基于域名的虚拟主机 LAMP架构:??? Linux+Apache+Mysql+PHP Linux+Apache+Mysql/MariaDB ...
- Linux汇编教程03:大小比较操作
我们在上一讲中,简单了解了汇编程序大概的样子.接下来我们来了解一下,汇编程序的大小比较操作.所以我们以编写寻找一堆数中的最大值作为学习的载体. 在编写程序之前,先要分析我们的目的,在得出解决方案. 目 ...
- MACACA===gradle下载和安装
gradle下载地址: http://services.gradle.org/distributions/ 或者直接点击这个: http://services.gradle.org/distribut ...
- HTML+CSS+JS(+Vue)写一个通讯录组件
求各位大大的Star(*/ω\*). 没有录屏,所以上传的是图片.后面已补充录屏效果. 效果:(主要是参考小米Note3的通讯录的效果做的) 主要功能: 1. 滚动后,通讯录的模块标题会固定在顶部(图 ...
- android intent 传数据
1. 基本数据类型 Intent intent = new Intent(); intent.setClass(activity1.this, activity2.class); //描述起点和目标 ...