(三)
CXF提供了Interceptor拦截器链对SOAP消息进行拦截处理
拦截器分为不同的Phase,各个Phase又有自己的拦截器链,参考http://cxf.apache.org/docs/interceptors.html
在客户端加入头信息
头信息为一个字符串
编写interceptor
PHASE:WRITE
package com.hqh.ws.cxf.interceptor; import java.util.List; import javax.xml.bind.JAXBException; import javax.xml.namespace.QName; import org.apache.cxf.binding.soap.SoapMessage; import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor; import org.apache.cxf.databinding.DataBinding; import org.apache.cxf.headers.Header; import org.apache.cxf.interceptor.Fault; import org.apache.cxf.jaxb.JAXBDataBinding; import org.apache.cxf.phase.Phase; public class LicenseOutInterceptor extends AbstractSoapInterceptor{ /** * 指定加入拦截器到某个阶段 * @param p */ public LicenseOutInterceptor() { super(Phase.WRITE); } @Override public void handleMessage(SoapMessage message) throws Fault { List<Header> headers = message.getHeaders(); try { //创建QName String namespaceURI = "http://ws.cxf.hqh.com"; String localPart = "license"; String prefix = "ns"; QName qname = new QName(namespaceURI, localPart, prefix); //创建需要使用header进行传输的对象 String sendObj = "license for webservice"; //创建DataBinding DataBinding dataBinding = new JAXBDataBinding(String.class); //创建Header Header header = new Header(qname, sendObj, dataBinding); //将header加入到SOAP头集合中 headers.add(header); } catch (JAXBException e) { e.printStackTrace(); throw new Fault(e); } } }
调用服务时加入interceptor
/** * 使用interceptor加入header */ @Test public void test03() { JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); factory.setServiceClass(IMyService.class); factory.setAddress("http://localhost:8888/cxf/ws?wsdl"); //打印发出的消息 factory.getOutInterceptors().add(new LoggingOutInterceptor()); //加入自定义的拦截器 factory.getOutInterceptors().add(new LicenseOutInterceptor()); //获取服务对象 IMyService service = (IMyService)factory.create(); //调用服务 String reply = service.sayHello("李思思"); System.out.println(reply); System.exit(0); }
头信息为一个对象
package com.hqh.ws.cxf.model; public class User { private String name; private String pwd; public User() { super(); } public User(String name, String pwd) { super(); this.name = name; this.pwd = pwd; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } }
package com.hqh.ws.cxf.interceptor; import java.util.List; import javax.xml.bind.JAXBException; import javax.xml.namespace.QName; import org.apache.cxf.binding.soap.SoapMessage; import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor; import org.apache.cxf.databinding.DataBinding; import org.apache.cxf.headers.Header; import org.apache.cxf.interceptor.Fault; import org.apache.cxf.jaxb.JAXBDataBinding; import org.apache.cxf.phase.Phase; import com.hqh.ws.cxf.model.User; public class LicenseOutInterceptor extends AbstractSoapInterceptor{ /** * 指定加入拦截器到某个阶段 * @param p */ public LicenseOutInterceptor() { super(Phase.WRITE); } @Override public void handleMessage(SoapMessage message) throws Fault { List<Header> headers = message.getHeaders(); try { //创建QName String namespaceURI = "http://ws.cxf.hqh.com"; String localPart = "license"; String prefix = "ns"; QName qname = new QName(namespaceURI, localPart, prefix); //创建需要使用header进行传输的对象 //String sendObj = "license for webservice"; //头信息为一个对象 User user = new User("admin","admin1"); //创建DataBinding //DataBinding dataBinding = new JAXBDataBinding(String.class); DataBinding dataBinding = new JAXBDataBinding(User.class); //创建Header //Header header = new Header(qname, sendObj, dataBinding); Header header = new Header(qname, user, dataBinding); //将header加入到SOAP头集合中 headers.add(header); } catch (JAXBException e) { e.printStackTrace(); throw new Fault(e); } } }
客户端发出的SOAP消息
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Header> <ns:license xmlns:ns="http://ws.cxf.hqh.com"> <name>admin</name> <pwd>admin1</pwd> </ns:license> </soap:Header> <soap:Body> <ns2:sayHello xmlns:ns2="http://cxf.ws.hqh.com/"> <name>李思思</name> </ns2:sayHello> </soap:Body> </soap:Envelope>
服务端使用拦截器获取头信息
PHASE:UNMARSHALLER
package com.hqh.ws.cxf.interceptor; import java.util.List; import javax.xml.bind.JAXBException; import javax.xml.soap.SOAPException; import org.apache.cxf.binding.soap.SoapMessage; import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor; import org.apache.cxf.databinding.DataBinding; import org.apache.cxf.headers.Header; import org.apache.cxf.interceptor.Fault; import org.apache.cxf.jaxb.JAXBDataBinding; import org.apache.cxf.phase.Phase; import org.w3c.dom.Element; import com.hqh.ws.cxf.model.User; public class licenseInIntercptor extends AbstractSoapInterceptor{ /** * 指定拦截器使用的阶段 * 这里是服务端对header的拦截处理,指定到UNMARSHAL阶段 * 注意:不要指定到READ阶段,READ阶段获取到的是xml数据,还不能从message对象中获取到header的相关信息 * 在unmarshaller将xml转换为对象之后使用拦截器,才能从header对象中获取到数据 * @param p */ public licenseInIntercptor() { super(Phase.UNMARSHAL); } @Override public void handleMessage(SoapMessage message) throws Fault { //获取所有的header List<Header> headers = message.getHeaders(); System.out.println("headers size:"+headers.size()); try { //服务端能通过DataBinding进行对象的自动转换吗?在read/unmarshaller时加入? //DataBinding binding = new JAXBDataBinding(User.class); for(Header head : headers) { String localPart = head.getName().getLocalPart(); System.out.println("当前头信息节点名称:"+localPart); if("license".equals(localPart)) { //获取cxf拦截器转换得到的头信息对象 Object obj = head.getObject(); //注意:这里获取到的obj并不是客户端指定的User对象! System.out.println(obj instanceof User); Element element = (Element)obj; String name = element.getElementsByTagName("name").item(0).getTextContent(); String pwd = element.getElementsByTagName("pwd").item(0).getTextContent(); if("admin".equals(name) && "admin".equals(pwd)) { System.out.println("验证成功"); } else { SOAPException ex = new SOAPException("认证信息错误!"); throw new Fault(ex); } } } } catch (Exception e) { //e.printStackTrace(); throw new Fault(e); } } }
服务端发布服务时加入指定的拦截器
/** * 使用CXF发布服务 */ public static void startServerByCXF() { JaxWsServerFactoryBean svrFactory = new JaxWsServerFactoryBean(); svrFactory.setServiceClass(IMyService.class); svrFactory.setAddress("http://localhost:8888/cxf/ws"); svrFactory.setServiceBean(new MyServiceImpl()); //打印进入的消息 svrFactory.getInInterceptors().add(new LoggingInInterceptor()); //打印发出的消息 svrFactory.getOutInterceptors().add(new LoggingOutInterceptor()); /** * 加入服务端的Handler处理客户端传递的头信息 */ // List<Handler> handlers = new ArrayList<Handler>(); // handlers.add(new LicenseHandler()); // svrFactory.setHandlers(handlers); /** * 加入对头信息的拦截器 */ svrFactory.getInInterceptors().add(new licenseInIntercptor()); svrFactory.create(); }
相关推荐
在IT行业中,Apache CXF是一个广泛使用的开源框架,它提供了创建和消费Web服务的能力。CXF使得开发人员能够轻松地实现服务接口,并将其部署为SOAP或RESTful服务。本篇文章将深入探讨如何利用CXF的Interceptor(拦截...
在Java世界中,Apache CXF是一个广泛使用的开源框架,它允许开发者创建和消费Web服务。在Web服务开发中,拦截器扮演着至关重要的角色,它们提供了在消息发送和接收过程中插入自定义逻辑的能力。本篇文章将深入探讨...
标题:“CXF拦截器(Interceptor)的使用” 描述:“讲解了cxf实现拦截器的原因、核心API及使用方法” 在深入探讨CXF拦截器的使用之前,我们首先需要理解其在CXF框架中的核心作用与价值。Apache CXF是一个开源框架,...
安装完成后,可以使用SOAP UI等工具发送带有自定义SOAP头的请求,以测试CXF服务是否能够正确处理和验证头部信息。 综上所述,通过Apache CXF提供的Interceptor机制,我们可以方便地在SOAP消息中添加、读取和验证...
4. **处理HTTP头信息**:CXF提供了拦截器(Interceptor)机制,可以通过自定义拦截器来读取和操作HTTP头。在`frontend/client`或`frontend/server`的拦截器链中添加自定义拦截器,拦截器可以访问并处理Message对象中...
在Java世界中,Apache CXF是一个广泛使用的开源框架,它允许开发者创建和消费Web服务。当我们谈论"CXF发布WebService加入拦截器"时,这涉及到在CXF服务端和客户端增加拦截器来增强服务功能和控制流程。拦截器是CXF...
你可以继承`org.apache.cxf.interceptor.FaultInterceptor`或`org.apache.cxf.interceptor.AbstractFaultInterceptor`类,并重写其`handleMessage`方法来插入自己的逻辑。然后,你需要在服务端或客户端的配置中注册...
在这个主题中,我们将深入探讨CXF的Interceptor拦截器、处理复杂类型对象的传递以及如何结合Spring进行集成,最后我们将学习如何使用ANT工具快速构建和部署CXF工程。 1. CXF Interceptor拦截器: 拦截器是CXF框架...
CXF提供了丰富的功能,包括服务端和客户端的拦截器(Interceptor)机制,使得开发者能对服务调用进行自定义处理,如权限控制和登录校验。本文将深入探讨"CXF拦截器-权限控制-登录校验"这一主题。 首先,我们需要...
这里的Interceptor就和Filter、Struts的Interceptor很类似,提供它的主要作用就是为了很好的降低代码的耦合性,提供代码的内聚性。以HelloWorldService为例子。 参照网址:...
例如,可以使用客户端拦截器添加额外的HTTP头信息,或者在请求失败时执行重试逻辑。在CXF中,我们可以创建实现`org.apache.cxf.interceptor.ClientInterceptor`接口的类,并通过`ClientProxy.getClient()`方法获取...
通过上述步骤,我们成功实现了使用CXF打印SOAP报文的功能,并能够有效地记录WebService的日志信息。这对于调试和维护基于CXF的服务来说是非常有用的。此外,通过扩展此类自定义拦截器,还可以添加更多的功能,如安全...
3. **Spring集成**:在Spring3.2中,我们可以使用`<cxf:bus>`和`<cxf:interceptor>`标签将自定义拦截器注册到CXF Bus中。这样,Spring容器会管理拦截器的生命周期,并在需要时注入其他依赖。 4. **拦截器链**:CXF...
如果权限检查失败,拦截器应该抛出一个适当的异常,例如`org.apache.cxf.interceptor.Fault`,并附带错误信息。这样,CXF会捕获这个异常,并根据配置的策略返回相应的错误响应给客户端。 5. **测试与调试**: ...
同时,`org.apache.cxf.interceptor.security.BasicAuthInterceptor`拦截器处理了实际的身份验证过程,它会检查收到的请求是否包含正确的认证信息。 工具方面,CXF提供了多种工具帮助开发者管理和调试服务,如CXF的...
2. 消息日志:通过启用CXF的logging-interceptor,可以记录客户端发出和接收到的消息,便于调试。 3. 错误处理:CXF提供了异常处理机制,可以根据HTTP状态码或其他错误信息捕获和处理异常。 六、性能优化 1. 缓存:...
ssh2-interceptor拦截器(权限管理).
4. **处理异常**:当拦截器检测到无权限访问时,应该抛出合适的异常,如`org.apache.cxf.interceptor.Fault`。客户端可以捕获这些异常,提供相应的错误信息反馈给用户。 5. **测试与调试**:添加完拦截器后,进行...
例如,在Spring配置文件中,我们可以使用`<cxf:client>`或`<cxf:endpoint>`元素的`interceptor`属性来指定要使用的拦截器。 通过学习和理解这些示例,开发者可以更好地利用CXF拦截器来扩展和定制自己的Web服务,...