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 handlername="code">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;}}