Spring Apache cxf基本身份验证

Spring Apache cxf基本身份验证,spring,maven,cxf,Spring,Maven,Cxf,我有一个正在运行的ApacheCXF示例,但是当我运行代码提供的这个wsdl文件时,我不知道如何将用户名和密码传递给soapui 代码是: ORDER.JAVA package demo.order; public class Order { private String customerID; private String itemID; private int qty; private double price; // Constructor

我有一个正在运行的ApacheCXF示例,但是当我运行代码提供的这个wsdl文件时,我不知道如何将用户名和密码传递给soapui

代码是:

ORDER.JAVA
package demo.order;

public class Order {

    private String customerID;
    private String itemID;
    private int qty;
    private double price;

    // Constructor
    public Order() {
    }

    public String getCustomerID() {
        return customerID;
    }

    public void setCustomerID(String customerID) {
        this.customerID = customerID;
    }

    public String getItemID() {
        return itemID;
    }

    public void setItemID(String itemID) {
        this.itemID = itemID;
    }

    public int getQty() {
        return qty;
    }

    public void setQty(int qty) {
        this.qty = qty;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

}

package demo.order;

import javax.jws.WebService;

@WebService
public interface OrderProcess {
    String processOrder(Order order);
}


package demo.order;

import javax.jws.WebService;

@org.apache.cxf.interceptor.InInterceptors (interceptors = {"demo.order.server.OrderProcessUserCredentialInterceptor" })
@WebService
public 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 demo.order.OrderProcess;
import demo.order.Order;

import org.apache.cxf.frontend.ClientProxy;
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[] {"demo/order/client/client-beans.xml"});

        OrderProcess client = (OrderProcess) context.getBean("orderClient");
        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.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;
    }
}
_________________________
CLIENTBEAN.XML
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:jaxws="http://cxf.apache.org/jaxws"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
                        http://www.springframework.org/schema/beans/spring-beans.xsd
                        http://cxf.apache.org/jaxws 
                        http://cxf.apache.org/schemas/jaxws.xsd">

    <jaxws:client id="orderClient" serviceClass="demo.order.OrderProcess" address="http://localhost:8080/OrderProcess" />
</beans>
_______________________
package demo.order.server;

import org.apache.cxf.jaxws.JaxWsServerFactoryBean;

import demo.order.OrderProcess;
import demo.order.OrderProcessImpl;

public class OrderProcessServerStart {

    public static void main(String[] args) throws Exception {

        OrderProcess orderProcess = new OrderProcessImpl();
        JaxWsServerFactoryBean server = new JaxWsServerFactoryBean();
        server.setServiceBean(orderProcess);
        server.setAddress("http://localhost:8787/OrderProcess");
        server.create();
        System.out.println("Server ready....");

        Thread.sleep(5 * 60 * 1000);
        System.out.println("Server exiting");
        System.exit(0);
    }
}
___________________________
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 retrieved from SOAP Header is " + userName);
        System.out.println("password retrieved 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;
    }

}
_______________

I have these files and the program compile succesfully and creting the wsdl file
ORDER.JAVA
包装演示。订购;
公共阶级秩序{
私有字符串customerID;
私有字符串itemID;
私人整数数量;
私人双价;
//建造师
公共秩序(){
}
公共字符串getCustomerID(){
返回客户ID;
}
public void setCustomerID(字符串customerID){
this.customerID=customerID;
}
公共字符串getItemID(){
返回itemID;
}
公共void setItemID(字符串itemID){
this.itemID=itemID;
}
public int getQty(){
退货数量;
}
公共作废设置数量(整数数量){
该数量=数量;
}
公开双价{
退货价格;
}
公共定价(双倍价格){
这个价格=价格;
}
}
包装演示。订购;
导入javax.jws.WebService;
@网络服务
公共接口订购流程{
字符串处理顺序(Order);
}
包装演示。订购;
导入javax.jws.WebService;
@interceptors(interceptors={“demo.order.server.OrderProcessUserCredentialInterceptor”})
@网络服务
公共类OrderProcessImpl实现OrderProcess{
公共字符串processOrder(订单){
System.out.println(“处理订单…”);
字符串orderID=验证(订单);
返回订单ID;
}
/**
*验证订单并返回订单ID
**/
私有字符串验证(订单){
字符串custID=order.getCustomerID();
String itemID=order.getItemID();
int qty=订单.getQty();
double price=order.getPrice();
如果(custID!=null&&itemID!=null&&qty>0&&price>0.0){
返回“ORD1234”;
}
返回null;
}
}
_______________
包demo.order.client;
导入demo.order.OrderProcess;
导入demo.order.order;
导入org.apache.cxf.frontend.ClientProxy;
导入org.springframework.context.support.ClassPathXmlApplicationContext;
公共最终类客户端{
公共客户机(){
}
公共静态void main(字符串args[])引发异常{
ClassPathXmlApplicationContext上下文
=新的ClassPathXmlApplicationContext(新字符串[]{“demo/order/client/client beans.xml”});
OrderProcess客户端=(OrderProcess)context.getBean(“orderClient”);
OrderProcessClientHandler clientInterceptor=新的OrderProcessClientHandler();
clientInterceptor.setUserName(“John”);
clientInterceptor.setPassword(“密码”);
org.apache.cxf.endpoint.Client cxfClient=ClientProxy.getClient(客户端);
cxfClient.getOutInterceptors().add(clientInterceptor);
订单=新订单();
order.setCustomerID(“C001”);
order.setItemID(“I001”);
订单设置数量(100);
订单。设定价格(200.00);
字符串orderID=client.processOrder(订单);
字符串消息=(orderID==null)?“订单未批准”:“订单已批准;订单ID为”+orderID;
System.out.println(消息);
}
}
_____________________
包demo.order.client;
导入javax.xml.namespace.QName;
导入javax.xml.parsers.DocumentBuilder;
导入javax.xml.parsers.DocumentBuilderFactory;
导入javax.xml.parsers.parserConfiguration异常;
导入org.apache.cxf.binding.soap.SoapMessage;
导入org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
导入org.apache.cxf.binding.soap.interceptor.SoapPreProtocolOutInterceptor;
导入org.apache.cxf.headers.Header;
导入org.apache.cxf.interceptor.Fault;
导入org.apache.cxf.phase.phase;
导入org.w3c.dom.Document;
导入org.w3c.dom.Element;
公共类OrderProcessClientHandler扩展了AbstractSoapInterceptor{
公共字符串用户名;
公共字符串密码;
public OrderProcessClientHandler(){
超级(相位写入);
addAfter(SoapPreProtocolOutInterceptor.class.getName());
}
public void handleMessage(SoapMessage消息)引发错误{
println(“调用OrderProcessClientHandler handleMessage”);
DocumentBuilder=null;
试一试{
builder=DocumentBuilderFactory.newInstance().newDocumentBuilder();
}捕获(ParserConfiguration异常e){
e、 printStackTrace();
}
Document doc=builder.newDocument();
Element elementCredentials=doc.createElement(“OrderCredentials”);
Element elementUser=doc.createElement(“用户名”);
elementUser.setTextContent(getUserName());
Element elementPassword=doc.createElement(“密码”);
elementPassword.setTextContent(getPassword());
elementCredentials.appendChild(elementUser);
elementCredentials.appendChild(elementPassword);
//创建标题对象
QName qnameCredentials=新的QName(“订单凭证”);
Header Header=新的头(qnameCredentials、elementCredentials);
message.getHeaders().add(header);
}
公共字符串getPassword(){
返回密码;
}
public void setPassword(字符串密码){
this.password=密码;
}
公共字符串getUserName(){
返回用户名;
}
public void setUserName(字符串用户名){
this.userName=用户名;
}
}
_________________________
CLIENTBEAN.XML
_______________________
包demo.order.server;
导入org.apache.cxf.jaxws.JaxWsServerFactoryBean;
导入demo.order.OrderProcess;
导入demo.order.orderprocesimpl;
公共类OrderProcessServerStart{
公共静态void main(字符串[]args)引发异常{
OrderProcess OrderProcess=new orderprocessinpl();
JaxWsServerFactoryBean服务器=新的JaxWsServerFactoryBean();
server.setService
<jaxws:client id="orderClient" 
              serviceClass="demo.order.OrderProcess" 
              address="http://localhost:8080/OrderProcess"
              username="yourUsername"
              password="yourPassword"/>