说明:过滤器使用范围还是挺广泛的,比如webservice中的安全认证、数字签名、Token认证都可以使用过滤器来做;下面纯粹是一个小例子,以方便后期使用时查询,仅供参考。以服务端和客户端两部分介绍(所需要包自己导入):
【服务端】
一、定义接口
import javax.jws.WebService;
@WebService
public interface HelloWorld {
public String sayHello(String inputXML);
}
二、定义实现类
@WebService(endpointInterface = "com.dyc.dao.HelloWorld")
public class HelloWorldImpl implements HelloWorld {
@WebMethod
public String sayHello(@WebParam(name = "inputXML") String inputXML) {
// TODO Auto-generated method stub
String name = ParseXml.parseElement(inputXML, "name");
System.out.println("Server接收到输入参数为-->" + name);
return "How are you ?-->" + name;
}
}
三、XML解析类(dom4j,请自导入包)
public class ParseXml {
public static String parseElement(String inputXML, String objStr) {
InputStream in = null;
String str = null;
Element rootElement = null;
try {
in = new ByteArrayInputStream(inputXML.getBytes("UTF-8"));
SAXReader reader = new SAXReader();
Document document = reader.read(in); // 把流转成document对象。
rootElement = document.getRootElement();
Element tokenNode = rootElement.element(objStr);
if (tokenNode != null) {
str = tokenNode.getTextTrim();
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
}
return str;
}
}
四、过滤器
public class TokenInFilter extends AbstractPhaseInterceptor<SoapMessage> {
public TokenInFilter(String phase) {
super(Phase.PRE_INVOKE);
}
public void handleMessage(SoapMessage message) throws Fault {
// 获取SOAP消息的全部头
List<Header> headers = message.getHeaders();
if (null == headers || headers.size() < 1) {
throw new Fault(new SOAPException("SOAP消息头格式不对哦!"));
}
try{
for (Header header : headers) {
SoapHeader soapHeader = (SoapHeader) header;
// 取出SOAP的Header元素
/*解析soap的头信息*/
Element element = (Element) soapHeader.getObject();
XMLUtils.printDOM(element);
NodeList tokenList = element
.getElementsByTagName("tns:token");
/*NodeList nameList = element
.getElementsByTagName("tns:name");
NodeList passList = element
.getElementsByTagName("tns:pass");*/
String token = tokenList.item(0).getTextContent();
System.out.println("Token------>"+token);
//在此验证Token的合法性
/* System.out.println(nameList.item(0).getTextContent());
System.out.println(passList.item(0).getTextContent());*/
}
}catch(Exception e){
throw new Fault(new SOAPException("解析Soap信息出错!"));
}
}
}
五、XML配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/beans_*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<display-name>cxf</display-name>
<servlet>
<servlet-name>cxf</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>cxf</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>60</session-timeout>
</session-config>
</web-app>
六、bean_1.xml:用来发布服务的配置
<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<!-- 自定义拦截器 -->
<bean id="authIntercetpr" class="com.dyc.filter.TokenInFilter">
<constructor-arg value="receive" />
</bean>
<jaxws:endpoint id="helloWorld"
implementor="com.dyc.impl.HelloWorldImpl" address="/HelloWorld">
<jaxws:inInterceptors> <!-- 进入webservice之前的拦截器 -->
<ref bean="authIntercetpr" />
</jaxws:inInterceptors>
</jaxws:endpoint>
【客户端】
一、利用wsdl2java生成客户端代码(省略,代码太多了)
例:wsdl2java -p com.dyc.client -d d:/ws -verbose http://localhost:6888/webgisplatform/BaseService?wsdl
二、将生成的代码导入一个工程,可以建任意一个java工程
三、生成AddSoapHeader,模拟生成一个soap的头信息
public class AddSoapHeader extends AbstractSoapInterceptor {
private static String nameURI="http://localhost:8080/cxf_filter/HelloWorld";
public AddSoapHeader(){
super(Phase.WRITE);
}
public void handleMessage(SoapMessage message) throws Fault {
String token="12345678956789123344444";
QName qname=new QName("RequestSOAPHeader");
Document doc=DOMUtils.createDocument();
//自定义节点
Element spId=doc.createElement("tns:token");
spId.setTextContent(token);
Element username=doc.createElement("tns:name");
username.setTextContent("gary");
Element password=doc.createElement("tns:pass");
password.setTextContent("123456");
Element root=doc.createElementNS(nameURI, "tns:RequestSOAPHeader");
root.appendChild(spId);
root.appendChild(username);
root.appendChild(password);
SoapHeader head=new SoapHeader(qname,root);
List<Header> headers=message.getHeaders();
headers.add(head);
System.out.println(">>>>>添加header<<<<<<<");
}
}
四、写一个调试入口main方法
public void testSend() {
try {
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
List<Interceptor<? extends Message>> list = new ArrayList<Interceptor<? extends Message>>();
// 添加soap header
list.add(new AddSoapHeader());
// 添加soap消息日志打印
list.add(new org.apache.cxf.interceptor.LoggingOutInterceptor());
factory.setOutInterceptors(list);
factory.setServiceClass(HelloWorld.class);
factory
.setAddress("http://localhost:8080/cxf_filter/HelloWorld");
Object obj = factory.create();
System.out.println(obj == null ? "NULL" : obj.getClass().getName());
if (obj != null) {
HelloWorld ws = (HelloWorld) obj;
String name = Dom4jDemo.createDocument("");
System.out.println(name);
// 1、获取连接
String str = ws.sayHello(name) ;
System.out.println("res--->" + str);
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static void main(String[] args) {
Test tc = new Test();
tc.testSend();
}
OK!发布好服务端,启动服务,可以测试了!
分享到:
相关推荐
实战Web Service 之 CXF 实战Web Service 之 CXF
WebService之CXF开发指南WebService之CXF开发指南WebService之CXF开发指南
cxf使用中编码问题,有关于gbk等的编码问题在cxf中的解决方法
Apache CXF = Celtix + XFire,Apache CXF 的前身叫 Apache CeltiXfire,现在已经正式更名为 Apache CXF 了,以下简称为 CXF。CXF 继承了 Celtix 和 XFire 两大开源项目的精华,提供了对 JAX-WS 全面的支持,并且...
CXF源码:CXF_Spring源码 CXF源码:CXF_Spring源码
CXF下载 CXF下载 CXF下载 CXF下载 CXF下载 CXF下载 CXF下载 CXF下载 CXF下载 CXF下载 CXF下载 CXF下载 CXF下载 CXF下载 CXF下载 CXF下载 CXF下载 CXF下载 CXF下载 CXF下载 CXF下载 CXF下载
cxf服务端开发
WebService之CXF开发指南
cxf-core-3.1.16版本jar包,用于java开发使用
Spring CXF Restful 实例
JAVA7和JAVA8对应CXF资源 WebService CXF 用了一天时间找,官网打不开,国内要积分,下下来又永不了。最后终于搞到手,上传上来分享给大家。 jdk版本 CXF版本 java 9及以上 3.3.x java 8 3.x java 7 2.2x --- ...
借鉴网上例子,弄了一个SpringBoot开发WebService之CXF示例。
WebService之CXF开发指南.rar
CXF Webservice 开发手册
Apache CXF是一个开源的Service框架,它实现了JCP与Web Service中一些重要标准。CXF简化了构造,集成,面向服务架构(SOA)业务组件与技术的灵活复用。在CXF中,Service使用WSDL标准定义并能够使用各种不同的消息格式...
WebService CXF 详细教程 加上自带CXF文件
2013版的 <基于Apache CXF构建SOA应用> 源码 Apache CXF是一个开放源码的Web服务框架,提供了一个易于使用,用于开发Web Services标准为基础的编程模型。本书主要介绍Apache CXF在构建SOA架构各个方面的应用说明和...
处理cxf版本和jaxb包中冲突问题,解决webservice中遇到的版本问题
Web Service Cxf转换器的示例,包含源码和jar包。
利用Apache CXF开发webservice接口需要用到的jar集合 cxf-core-3.0.15.jar cxf-rt-bindings-soap-3.0.15.jar cxf-rt-bindings-xml-3.0.15.jar cxf-rt-databinding-jaxb-3.0.15.jar cxf-rt-frontend-jaxws-3.0.15.jar...