webservice的handler中对header信息进行校验。

本文介绍了一种在Web服务中实现SOAP Header信息校验的方法。通过对客户端和服务端的Handler进行改造,确保了只有带有特定Header信息的请求才能被处理。

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

我们已经知道怎么传递header信息。这里我们看怎么进行校验。

对Test进行修改:

package service.ps.smile.com;

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

import javax.xml.namespace.QName;
import javax.xml.ws.Holder;

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();
			User u = new User();
			u.setId(10);u.setNickname("old big");u.setUsername("laoda");u.setPassword("123456");
//			ms.login("123", "123");
			Holder<User> users = new Holder<User>(u);
			ms.addUser(users);
			System.out.println("end");
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
	}

}
客户端HeaderHandler进行修改,只对list和addUser操作进行处理:

package service.ps.smile.com.handler;

import java.util.Set;

import javax.xml.namespace.QName;
import javax.xml.soap.SOAPBody;
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;

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();
				}
				SOAPBody body = envelop.getBody();
				Node nName = body.getChildNodes().item(0);
				String partName = nName.getLocalName();
				if("list".equals(partName) || "addUser".equals(partName)){
					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.Iterator;
import java.util.Set;

import javax.xml.namespace.QName;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPFault;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPHeaderElement;
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 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();
				SOAPBody body = envelope.getBody();
				Node nName = body.getChildNodes().item(0);
				String partName = nName.getLocalName();
				if("list".equals(partName) || "addUser".equals(partName)){
					Iterator<SOAPHeaderElement> iterator = header.extractAllHeaderElements();
					if(!iterator.hasNext()){
						//添加一个错误信息
						System.out.println("ttt");
						SOAPFault fault = body.addFault();
						fault.setFaultString("头部信息不正确!");
						throw new SOAPFaultException(fault);
					}
					while(iterator.hasNext()){
						SOAPHeaderElement ele = iterator.next();
						System.out.println(ele.getTextContent());
					}
//					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;
	}

}
这样就实现了对header信息进行校验的过程。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值