使用CXF Interceptor&Feature
使用CXF Interceptor特性
package demo.order.server;import javax.xml.namespace.QName;import org.apache.cxf.binding.soap.SoapMessage;import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;import org.apache.cxf.headers.Header;import org.apache.cxf.interceptor.Fault;import org.apache.cxf.phase.Phase;import org.w3c.dom.Element;import org.w3c.dom.Node;public class OrderProcessUserCredentialInterceptor extends AbstractSoapInterceptor { private String userName; private String password; public OrderProcessUserCredentialInterceptor() { super(Phase.PRE_INVOKE); } public void handleMessage(SoapMessage message) throws Fault { System.out.println("OrderProcessUserCredentialInterceptor handleMessage invoked"); QName qnameCredentials = new QName("OrderCredentials"); // Get header based on QNAME if (message.hasHeader(qnameCredentials)) { Header header = message.getHeader(qnameCredentials); Element elementOrderCredential = (Element) header.getObject(); Node nodeUser = elementOrderCredential.getFirstChild(); Node nodePassword = elementOrderCredential.getLastChild(); if (nodeUser != null) { userName = nodeUser.getTextContent(); } if (nodePassword != null) { password = nodePassword.getTextContent(); } } System.out.println("userName reterived from SOAP Header is " + userName); System.out.println("password reterived from SOAP Header is " + password); // Perform dummy validation for John if ("John".equalsIgnoreCase(userName) && "password".equalsIgnoreCase(password)) { System.out.println("Authentication successful for John"); } else { throw new RuntimeException("Invalid user or password"); } } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; }}
?
?
?
package demo.order;import javax.jws.WebService;@org.apache.cxf.interceptor.InInterceptors(interceptors = {"demo.order.server.OrderProcessUserCredentialInterceptor"})@WebServicepublic class OrderProcessImpl implements OrderProcess { public String processOrder(Order order) { System.out.println("Processing order..."); String orderID = validate(order); return orderID; } /** * Validates the order and returns the order ID* */ private String validate(Order order) { String custID = order.getCustomerID(); String itemID = order.getItemID(); int qty = order.getQty(); double price = order.getPrice(); if (custID != null && itemID != null && qty > 0 && price > 0.0) { return "ORD1234"; } return null; }}
package demo.order.client;import javax.xml.namespace.QName;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import org.apache.cxf.binding.soap.SoapMessage;import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;import org.apache.cxf.binding.soap.interceptor.SoapPreProtocolOutInterceptor;import org.apache.cxf.headers.Header;import org.apache.cxf.interceptor.Fault;import org.apache.cxf.phase.Phase;import org.w3c.dom.Document;import org.w3c.dom.Element;public class OrderProcessClientHandler extends AbstractSoapInterceptor { public String userName; public String password; public OrderProcessClientHandler() { super(Phase.WRITE); addAfter(SoapPreProtocolOutInterceptor.class.getName()); } public void handleMessage(SoapMessage message) throws Fault { System.out.println("OrderProcessClientHandler handleMessage invoked"); DocumentBuilder builder = null; try { builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); } catch (ParserConfigurationException e) { e.printStackTrace(); } Document doc = builder.newDocument(); Element elementCredentials = doc.createElement("OrderCredentials"); Element elementUser = doc.createElement("username"); elementUser.setTextContent(getUserName()); Element elementPassword = doc.createElement("password"); elementPassword.setTextContent(getPassword()); elementCredentials.appendChild(elementUser); elementCredentials.appendChild(elementPassword); // Create Header object QName qnameCredentials = new QName("OrderCredentials"); Header header = new Header(qnameCredentials, elementCredentials); message.getHeaders().add(header); } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; }}
package demo.order.client;import demo.order.OrderProcess;import demo.order.Order;import org.apache.cxf.frontend.ClientProxy;import org.apache.cxf.transport.http.gzip.GZIPInInterceptor;import org.apache.cxf.transport.http.gzip.GZIPOutInterceptor;import org.springframework.context.support.ClassPathXmlApplicationContext;public final class Client { public Client() { } public static void main(String args[]) throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"client-beans.xml"}); OrderProcess client = (OrderProcess) context.getBean("orderClient");// OrderProcess client = (OrderProcess) context.getBean("orderClient2"); OrderProcessClientHandler clientInterceptor = new OrderProcessClientHandler(); clientInterceptor.setUserName("John"); clientInterceptor.setPassword("password"); org.apache.cxf.endpoint.Client cxfClient = ClientProxy.getClient(client); cxfClient.getOutInterceptors().add(clientInterceptor); Order order = new Order(); order.setCustomerID("C001"); order.setItemID("I001"); order.setQty(100); order.setPrice(200.00); String orderID = client.processOrder(order); String message = (orderID == null) ? "Order not approved" : "Order approved; order ID is " + orderID; System.out.println(message); }}
package demo.order;import org.apache.cxf.feature.LoggingFeature;import org.apache.cxf.interceptor.LoggingInInterceptor;import org.apache.cxf.interceptor.LoggingOutInterceptor;import org.apache.cxf.jaxws.JaxWsServerFactoryBean;import org.apache.cxf.transport.http.gzip.GZIPFeature;import org.apache.cxf.transport.http.gzip.GZIPInInterceptor;import org.apache.cxf.transport.http.gzip.GZIPOutInterceptor;public class OrderProcessServerStart { public static void main(String[] args) throws Exception { OrderProcess orderProcess = new OrderProcessImpl(); LoggingFeature log = new LoggingFeature(); GZIPFeature gzip = new GZIPFeature(); gzip.setThreshold(1); JaxWsServerFactoryBean server = new JaxWsServerFactoryBean(); server.setServiceBean(orderProcess); server.setAddress("http://localhost:8080/OrderProcess"); server.getFeatures().add(log); server.getFeatures().add(gzip); //server.getFeatures().add(log); //server.getInInterceptors().add(new LoggingInInterceptor()); //server.getOutInterceptors().add(new LoggingOutInterceptor()); server.create(); System.out.println("Server ready...."); Thread.sleep(5 * 60 * 1000); System.out.println("Server exiting"); System.exit(0); }}
?