Spring Apache cxf基本身份验证
我有一个正在运行的ApacheCXF示例,但是当我运行代码提供的这个wsdl文件时,我不知道如何将用户名和密码传递给soapui 代码是: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
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"/>