只列出部分核心代码, 其它代码都是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;
}
}