webService快速入门入门系列《5》----自定义拦截器
2017-11-12 14:55
363 查看
上篇写到用cfx自带的拦截器。这次我们用自定义的拦截器,以后工作中会经常用到
AuthInInterceptor拦截器类 名字随便起
客户端要也要添加自定义拦截器,添加头部信息
客户端拦截器YanZhengInInterceptor
在服务器端自定义拦截器
发布:package com.lzh.ws; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import javax.jws.WebService; import org.apache.cxf.binding.soap.SoapMessage; import org.apache.cxf.endpoint.Server; import org.apache.cxf.interceptor.Interceptor; import org.apache.cxf.interceptor.LoggingInInterceptor; import org.apache.cxf.interceptor.LoggingOutInterceptor; import org.apache.cxf.jaxws.JaxWsServerFactoryBean; import org.apache.cxf.phase.AbstractPhaseInterceptor; @WebService(endpointInterface="com.lzh.ws.WebServiceTest") public class WebServiceTestImpl implements WebServiceTest { private static HashMap<User, ArrayList> map; private static User user; private static ArrayList<Dog> list; static{ user = new User(1,"刘中华"); Dog dog1=new Dog(001,"小狗",12); Dog dog2=new Dog(002,"大狗",22); list=new ArrayList<Dog>(); list.add(dog1); list.add(dog2); map=new HashMap<User, ArrayList>(); map.put(user, list); } public int add(int i, int j) { // TODO Auto-generated method stub return i+j; } public List<Dog> getDogByUser(User u) { // TODO Auto-generated method stub if(user.equals(u)){ ArrayList<Dog> list = map.get(u); return list; } return null; } public static void main(String[] args) { String url="http://localhost:9999/web"; // EndpointImpl endpointImpl = (EndpointImpl) Endpoint.publish(url, new WebServiceTestImpl()); /** * 注意,一定要是JaxWsServerFactoryBean这个类,这个类是cfx的类,不能用Endpoint这个类,这个是java自带的。 * 给一个url和实体类.class 必须实体类的!!!!!!! * * */ JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean(); factory.setAddress(url); factory.setServiceClass(WebServiceTestImpl.class); /** * 添加拦截器,getInInterceptors()得到拦截器集合list。然后添加的是日志in 和 日志out */ /* factory.getInInterceptors().add(new LoggingInInterceptor()); factory.getOutInterceptors().add(new LoggingOutInterceptor());*/ /** * 添加自定义拦截器 AuthInInterceptor类是自定义的,需要继承AbstractPhaseInterceptor<SoapMessage>类 */ factory.getInInterceptors().add(new AuthInInterceptor()); /** * 创建服务,启动 */ Server server = factory.create(); server.start(); System.out.println("发布webservice成功!"); } public HashMap<String, Dog> getDogMap() { HashMap<String, Dog> map= new HashMap<String, Dog>(); int i=0; for(Dog d:list){ map.put("第 "+ i++ +"条狗" + "",d); } return map; } }
AuthInInterceptor拦截器类 名字随便起
package com.lzh.ws; import org.apache.cxf.binding.soap.SoapMessage; import org.apache.cxf.interceptor.Fault; import org.apache.cxf.phase.AbstractPhaseInterceptor; import org.apache.cxf.phase.Phase; public class AuthInInterceptor extends AbstractPhaseInterceptor<SoapMessage>{ public AuthInInterceptor() { super(Phase.PRE_INVOKE); //调用之前拦截 SOAP信息 // TODO Auto-generated constructor stub } //SoapMessage 是SOAP消息,就是客户端访问服务端的时候的信息,我们要做的就是在访问服务器之前解析这个消息,看看有没有我们所需要的东西,比如账号,密码之类的。没有就不让访问。他是xml文件。带的信息是在heard里面,不是在body里面 public void handleMessage(SoapMessage msg) throws Fault { // TODO Auto-generated method stub //所携带的额外信息实在头部的,所以要得到headers,他是个list集合。如果没有就抛异常 List<Header> headers = msg.getHeaders(); if(headers==null||headers.size()<1){ throw new Fault(new Exception("没有header,调用不了")); } Header header = headers.get(0); Element element = (Element) header.getObject(); NodeList userId = element.getElementsByTagName("userId"); NodeList userPass = element.getElementsByTagName("userPass"); if(userId.getLength() != 1){ throw new Fault(new Exception("用户格式不对")); } if(userPass.getLength() != 1){ throw new Fault(new Exception("密码格式不对")); } String u = userId.item(0).getTextContent(); String p = userPass.item(0).getTextContent(); if(u.equals("lzh") && p.equals("123")){ System.out.println("成功"); }else{ throw new Fault(new Exception("不对!!!!")); } } }
客户端要也要添加自定义拦截器,添加头部信息
package com.lzh.ws.client; import java.util.List; import org.apache.cxf.frontend.ClientProxy; import org.apache.cxf.interceptor.LoggingInInterceptor; import org.apache.cxf.interceptor.LoggingOutInterceptor; import com.lzh.ws.Dog; import com.lzh.ws.Entry; import com.lzh.ws.StringDog; import com.lzh.ws.User; import com.lzh.ws.WebServiceTest; import com.lzh.ws.WebServiceTestImplService; public class Client { public static void main(String[] args) { // TODO Auto-generated method stub WebServiceTestImplService impl = new WebServiceTestImplService(); WebServiceTest implPort = impl.getWebServiceTestImplPort(); /** * 添加日志拦截器 先创建一个代理类,是cfx的类,参数是上面的implPort(这个类是webService的远程代理), */ org.apache.cxf.endpoint.Client proxy = ClientProxy.getClient(implPort); proxy.getOutInterceptors().add(new YanZhengInInterceptor("lzh","123")); proxy.getOutInterceptors().add(new LoggingOutInterceptor()); int add = implPort.add(1, 2); System.out.println(add); User user = new User(); user.setId(1); user.setName("刘中华"); List<Dog> list = implPort.getDogByUser(user); for(Dog d:list){ System.out.println(d.getName()); } System.out.println("-------------"); StringDog dogMap = implPort.getDogMap(); for(Entry e:dogMap.getList()){ System.out.println(e.getValue().getName()); } } }
客户端拦截器YanZhengInInterceptor
package com.lzh.ws.client; 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; public class YanZhengInInterceptor extends AbstractPhaseInterceptor<SoapMessage> { private String username; private String pass; public YanZhengInInterceptor(String username,String pass) { super(Phase.PREPARE_SEND); //在消息发送之前调用 this.username=username; this.pass=pass; } public void handleMessage(SoapMessage msg) throws Fault { // TODO Auto-generated method stub List<Header> headers = msg.getHeaders(); /** * 得到了soap对象就要把验证信息添加到头部。他是个xml片段。 */ Document doc = DOMUtils.createDocument(); //创建头部 Element authHeader = doc.createElement("authHeader"); //创建username和userpass 并赋值 创建元素的名字要和服务器那边解析的要一致 Element userId = doc.createElement("userId"); userId.setTextContent(username); Element userPass = doc.createElement("userPass"); userPass.setTextContent(pass); //把创建的子元素添加到头部。 authHeader.appendChild(userPass); authHeader.appendChild(userId); //把创建的头部添加到头部 headers.add(new Header(new QName("刘中华"), authHeader)); /** * 所得到的格式比如是: * <soap:Envelope> * <soap:Header> * <authHeader> * <userPass>1234</userPass> * <userId>lzh</userId> * </authHeader> * </soap:Header> * <soap:Body> * <ns2:add xmlns:ns2="http://ws.lzh.com/"> * <arg0>1</arg0> * <arg1>2</arg1> * </ns2:add> * </soap:Body> * </soap:Envelope> */ } }
相关文章推荐
- webService快速入门入门系列《4》----cfx框架之系统拦截器
- webService快速入门入门系列《2》--本地调用
- webService快速入门入门系列《3》----wsdl文件
- webService快速入门入门系列《6》----cfx框架集成spring
- Netty 快速入门系列 - Chapter 6 自定义数据协议【第十三讲】 通过大端序列方法将4个字节int转成 byte数组
- webService快速入门入门系列《1》-----url调用
- Netty 快速入门系列 - Chapter 6 自定义数据协议【第十四讲】ByteBuffer 和 ChannelBuffers
- Netty 快速入门系列 - Chapter 6 自定义数据协议【第十五讲】自定义方法Serializer
- SUMO仿真快速入门系列二:使用XML生成自定义地图
- 小猪的C语言快速入门系列(七)
- Netty 快速入门系列 - Chapter 3 Netty5.x【第八讲】 - Client 重连
- 小猪的C语言快速入门系列(九)
- 快速入门系列--NOSQL--05Redis也木有那么“高富帅”
- Spring boot 入门系列(一):快速搭建一个简单web系统(简单的SSM框架)
- 1900系列交换机快速入门指南
- ASP.NET 2.0 快速入门系列课程
- 快速入门系列--CLR--01基本概念
- JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(四):自定义T4模板快速生成页面
- WPF快速入门系列(7)——深入解析WPF模板
- Java EL系列-2.JUEL快速入门