WebService之XFire和Jax实现身份验证

只列出部分核心代码, 其它代码都是myeclipse生成, 详见附件.

1.服务器代码:

HelloWorld.java代码:

package test;

public class HelloWorld implements IHelloWorld {

	public Float add(float a, float b) {
		return a + b;
	}

	public String sayHello(String name) {
		return "hello, " + name + "...";
	}

}

 IHelloWorld.java代码:

package test;

import java.rmi.Remote;

public interface IHelloWorld extends Remote{
	
	public String sayHello(String name);
	
	public Float add(float a, float b);
}

 ServerHandler.java代码:

package test;

import org.codehaus.xfire.MessageContext;
import org.codehaus.xfire.XFireRuntimeException;
import org.codehaus.xfire.handler.AbstractHandler;
import org.jdom.Element;

public class ServerHandler extends AbstractHandler {
	public void invoke(MessageContext message) throws Exception {
		Element header = message.getInMessage().getHeader();
		if (header == null) {
			throw new XFireRuntimeException("Missing SOAP header...");
		}
		Element element = header.getChild("AuthenticationToken");
		String userName = element.getChild("userName").getValue();
		String password = element.getChild("password").getValue();
		System.out.println("userName:" + userName + ",password" + password);
		if ("wander".equals(userName) && "wander".equals(password)) {
			System.out.println("yes, you passed...");
		} else {
			throw new XFireRuntimeException("error password and username...");
		}
	}

}

 services.xml内容:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xfire.codehaus.org/config/1.0">

	<service>
		<name>HelloWorldSimple</name>
		<namespace>http://simple.xfire.webservice/HelloWorld</namespace>
		<serviceClass>test.IHelloWorld</serviceClass>
		<implementationClass>test.HelloWorld</implementationClass>
		<scope>request</scope>
		<inHandlers>
			<handler handlerClass="test.ServerHandler">
			</handler>
		</inHandlers>
	</service>
</beans>

2.XFire实现身份验证

ClientMain2.java代码:

package test;

import java.util.List;
import java.lang.reflect.Proxy;
import java.net.MalformedURLException;
import java.util.ArrayList;

import org.codehaus.xfire.MessageContext;
import org.codehaus.xfire.client.Client;
import org.codehaus.xfire.client.XFireProxy;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.handler.AbstractHandler;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;
import org.jdom.Element;

public class ClientMain2 
extends AbstractHandler{
	
	public static void main(String[] args) throws MalformedURLException {
		ClientMain2 
auth = new ClientMain2
();
		String url = "http://localhost:8080/msg/services/HelloWorldSimple";
		Service service = new ObjectServiceFactory().create(IHelloWorld.class);
		IHelloWorld helloWorld = (IHelloWorld) new XFireProxyFactory().create(service, url);
		
		XFireProxy xfireProxy = (XFireProxy) Proxy.getInvocationHandler(helloWorld);
		Client client = xfireProxy.getClient();
		client.addOutHandler(auth);
		
		System.out.println(helloWorld.sayHello("wander"));
	}

	public void invoke(MessageContext message) throws Exception {
		Element header = new Element("header");
		Element authentication = new Element("AuthenticationToken");
		
		Element userName = new Element("userName");
		userName.setText("wander");
		
		Element password = new Element("password");
		password.setText("wander");
		
		authentication.addContent(userName);
		authentication.addContent(password);
		header.addContent(authentication);
		message.getOutMessage().setHeader(header);
	}

}

3.Jax-ws 实现身份验证

ClientMain.java代码

import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

import javax.xml.namespace.QName;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPFactory;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPMessage;
import javax.xml.ws.handler.Handler;
import javax.xml.ws.handler.HandlerResolver;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.PortInfo;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;

public class ClientMain {

	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
		HelloWorldSimple simple = new HelloWorldSimple();

		simple.setHandlerResolver(new HandlerResolver() {
			public List<Handler> getHandlerChain(PortInfo portInfo) {
				List<Handler> list = new ArrayList<Handler>();
				list.add(new MySOAPHandler());
				return list;
			}
		});
		HelloWorldSimplePortType port = simple.getHelloWorldSimpleHttpPort();
		System.out.println(port.sayHello("cat1"));
	}
}

class MySOAPHandler implements SOAPHandler<SOAPMessageContext> {

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

	public void close(MessageContext context) {
	}

	public boolean handleFault(SOAPMessageContext context) {
		throw new UnsupportedOperationException("Not supported yet.");
	}

	public boolean handleMessage(SOAPMessageContext context) {
		Boolean outboundProperty = (Boolean) context
				.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
		if (outboundProperty.booleanValue()) {
			SOAPMessage message = context.getMessage();
			try {
				SOAPEnvelope envelope = message.getSOAPPart().getEnvelope();
				SOAPFactory factory = SOAPFactory.newInstance();
				SOAPElement authenticationToken = factory
						.createElement("AuthenticationToken");
				SOAPElement userName = factory.createElement("userName");
				userName.setValue("wander");
				SOAPElement password = factory.createElement("password");
				password.setValue("wander");
				authenticationToken.addChildElement(userName);
				authenticationToken.addChildElement(password);
				
				SOAPHeader header = envelope.addHeader();
				header.addChildElement(authenticationToken);
				
			} catch (SOAPException e) {
				e.printStackTrace();
			}
		}
		return true;
	}
}

猜你喜欢

转载自wander312.iteye.com/blog/1180698