在前面的基础上加上身份验证。
只需在服务端与客户端的调用之前后知添加拦截器即可:
服务端:
package com.webservice.cxf.test;
import javax.xml.ws.Endpoint;
import org.apache.cxf.jaxws.EndpointImpl;
import com.webservice.cxf.auth.AuthInterceptor;
import com.webservice.cxf.impl.HelloWorldImpl;
public class TestMain
{
public static void main(String[] args)
{
HelloWorldImpl helloWorldImpl = new HelloWorldImpl();
EndpointImpl ep = (EndpointImpl) Endpoint.publish(
"http://127.0.0.1/richard", helloWorldImpl);
// 给服务器添加In拦截器,拦截从客户端来的信息。
ep.getInInterceptors().add(new AuthInterceptor());
// 给服务器添加Out拦截器,拦截从服务器端出去的信息。
//ep.getOutInterceptors().add(new LoggingOutInterceptor());
System.out.println("暴漏成功");
}
}
自定义In拦截器:
package com.webservice.cxf.auth;
import java.util.List;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.headers.Header;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
/**
* In拦截器
* @author xushuai
*
*/
public class AuthInterceptor extends AbstractPhaseInterceptor<SoapMessage>
{
public AuthInterceptor()
{
//显示调用父类的构造器,在发送消息之前调用,in拦截器
super(Phase.PRE_INVOKE);
}
@Override
public void handleMessage(SoapMessage msg) throws Fault
{
// 得到soap消息的所有header消息
List<Header> headers = msg.getHeaders();
if (headers.size() < 1 || headers.isEmpty())
{
throw new Fault(new IllegalArgumentException("没有header"));
}
// 获取第一个header并得到header信息
Header firstheader = headers.get(0);
Element ele = (Element) firstheader.getObject();
// 得到userId的节点
NodeList nodeIds = ele.getElementsByTagName("userId");
NodeList nodePasses = ele.getElementsByTagName("userPass");
// 检查各节点是否为空
if (nodeIds.getLength() != 1)
{
throw new Fault(new IllegalArgumentException("用户名格式不正确"));
}
if (nodePasses.getLength() != 1)
{
throw new Fault(new IllegalArgumentException("密码格式不正确"));
}
// 从数据库中获取user和密码是否被授权查询信息
String user = nodeIds.item(0).getTextContent();
String pwd = nodePasses.item(0).getTextContent();
if (!user.equals("Richard"))
{
throw new Fault(new IllegalArgumentException("用户名不正确"));
}
if (!pwd.equals("123"))
{
throw new Fault(new IllegalArgumentException("密码不正确"));
}
}
}
客户端:Out拦截器
package com.webservice.cxf.test;
import java.util.List;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
import com.webservice.cxf.Cat;
import com.webservice.cxf.Entity;
import com.webservice.cxf.IHelloWorld;
import com.webservice.cxf.StringCat;
import com.webservice.cxf.User;
import com.webservice.cxf.impl.HelloWorldImpl;
public class ClientTestmain
{
public static void main(String[] args)
{
HelloWorldImpl factory = new HelloWorldImpl();
IHelloWorld hw = factory.getHelloWorldImplPort();
// 为客户端添加out拦截器
Client clientProxy = ClientProxy.getClient(hw);
//为out拦截器添加自定义拦截器
clientProxy.getOutInterceptors().add(new AddHeaderInterceptor("Richard", "123"));
System.out.println(hw.sayHi("xushuai"));
User user = new User();
user.setId(1);
user.setName("Richard");
user.setPass("1234");
List<Cat> catList = hw.getCatsByUser(user);
for (Cat cat : catList)
{
System.out.println(cat.getCat());
}
StringCat stringCat = hw.getAllCats();
List<Entity> ens = stringCat.getEntities();
for (int i = 0; i < ens.size(); i++)
{
System.out.println(ens.get(i).getKey() + " | "
+ ens.get(i).getValue().getCat());
}
}
}
客户端的自定义拦截器,在其的Header中添加身份信息
package com.webservice.cxf.test;
import java.util.List;
import javax.xml.namespace.QName;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.headers.Header;
import org.apache.cxf.helpers.DOMUtils;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
/**
* soap消息分两部分,第一部分Header中携带身份等信息,第二部分body里面携带具体的操作信息
* AbstractPhaseInterceptor<SoapMessage>中的SoapMessage就是操作其Header信息,
* 在Header中添加身份信息。
* @author xushuai
* Out拦截器
*/
public class AddHeaderInterceptor extends AbstractPhaseInterceptor<SoapMessage>
{
private String userId;
private String pwd;
public AddHeaderInterceptor(String userid, String pwd)
{
// 准备发送消息的时候启用该拦截器
super(Phase.PREPARE_SEND);
this.pwd = pwd;
this.userId = userid;
}
@Override
public void handleMessage(SoapMessage mgs) throws Fault
{
List<Header> headers = mgs.getHeaders();
Document doc = DOMUtils.createDocument();
//自定义一个XML片段添加在Header中,并在服务器端查询是否有该片段。
//达到身份拦截的目的。
/**
* <authElement>
* <userId></userId>
* <userPass></userPass>
* </authElement>
*/
Element ele = doc.createElement("authElement");
Element useridEle = doc.createElement("userId");
useridEle.setTextContent(userId);
Element pwdEle = doc.createElement("userPass");
pwdEle.setTextContent(pwd);
ele.appendChild(useridEle);
ele.appendChild(pwdEle);
headers.add(new Header(new QName("web"),ele));
}
}