webservice根据handler处理header信息。

本文介绍如何在Webservice中利用Handler在客户端添加并处理Header信息,详细讲解了client端Handler的实现,并说明了在server端如何接收这些Header信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们已经知道在handler中可以对发送的消息进行拦截和处理。现在我们在client端的handler中添加header信息。同时在server端接收。

client端的HeaderHandler.java:

package service.ps.smile.com.handler;

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 HeaderHandler implements SOAPHandler<SOAPMessageContext> {
	private String ns = "http://com.smile.ps.service/";

	@Override
	public boolean handleMessage(SOAPMessageContext context) {
		try {
			boolean out = (Boolean)context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
			if(out){
				SOAPMessage message = context.getMessage();
				//判断message是否有header
				SOAPEnvelope envelop = message.getSOAPPart().getEnvelope();
				SOAPHeader header = envelop.getHeader();
				if(header == null){
					header = envelop.addHeader();
				}
				
				QName qname = new QName(ns,"licenseInfo","ws");
				header.addHeaderElement(qname).setValue("Hello World!");
			}
		} catch (SOAPException e) {
			e.printStackTrace();
		}
		System.out.println("headerHandler");
		return true;
	}

	@Override
	public boolean handleFault(SOAPMessageContext context) {
		System.out.println("error");
		return false;
	}

	@Override
	public void close(MessageContext context) {
		
	}

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

}
在服务器端添加一个LicenseHandler.java:

package com.smile.service.handler;

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;

import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class LicenseHandler implements SOAPHandler<SOAPMessageContext> {

	@Override
	public boolean handleMessage(SOAPMessageContext context) {
		try {
			boolean out = (Boolean)context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
			if(!out){
				SOAPMessage message = context.getMessage();
				SOAPEnvelope envelope = message.getSOAPPart().getEnvelope();
				SOAPHeader header = envelope.getHeader();
				if(header == null){
					header = envelope.addHeader();
				}
				NodeList nl = header.getElementsByTagName("ws:licenseInfo");
				Node n = nl.item(0);
				System.out.println("server:"+n.getTextContent());
			}
		} catch (SOAPException e) {
			e.printStackTrace();
		}
		return true;
	}

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

	@Override
	public void close(MessageContext context) {
		
	}

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

}
同时对handler进行配置。

然后我们在调用的时候:

package service.ps.smile.com;

import java.net.MalformedURLException;
import java.net.URL;

import javax.xml.namespace.QName;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			URL url = new URL("http://localhost:8890/ns?wsdl");
			QName qname = new QName("http://com.smile.ps.service/","MyServiceImplService");
			MyServiceImplService myimpService = new MyServiceImplService(url,qname);
			IMyService ms = myimpService.getMyServiceImplPort();
			ms.login("123", "123");
			System.out.println("end");
		} catch (UserException_Exception e) {
			System.out.println(e.getMessage());
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
	}

}
就可以发送和接收header的消息了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值