1. 使用CXF提供的拦截器

拦截器在我看来分为两端两向,两端分为:客户端和服务端,两向(方向)分为:进(in)和出(out),即大致四类拦截器。

在这里利用cxf提供的 日志拦截器举例

1.1 在服务端的发布类中获取所有拦截器,在 in 和 out两个方向(即调用和返回的过程) 添加日志拦截器

package com.lonely.server.impl;

import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean; import com.lonely.server.HelloWs; public class ReleaseClient { public static void main(String[] args) {
System.out.println("WS 服务端 start~~~~~~");
String address = "http://localhost:8090/sayhello";
HelloWs helloWs = new HelloWsImpl();
JaxWsServerFactoryBean jaxWsServerFactoryBean = new JaxWsServerFactoryBean();
// 设置地址
jaxWsServerFactoryBean.setAddress(address);
// 设置接口
jaxWsServerFactoryBean.setServiceClass(HelloWs.class);
// 设置实现类
jaxWsServerFactoryBean.setServiceBean(helloWs); // 添加 in 日志拦截器
jaxWsServerFactoryBean.getInInterceptors().add(new LoggingInInterceptor());
// 添加 out 日志拦截器
jaxWsServerFactoryBean.getOutInterceptors().add(new LoggingOutInterceptor()); jaxWsServerFactoryBean.create();
System.out.println("WS 服务端 started~~~~~~~");
}
}

1.2 启动发布

1.3 在客户端的发布类中获取所有拦截器,在 in 和 out两个方向(即调用和返回的过程) 添加日志拦截器
在客户端需要借用  ClientProxy 创建 Client来获取所有拦截器,具体代码如下

package com.lonely.client;

import java.util.List;

import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor; import com.lonely.server.HelloWs;
import com.lonely.server.HelloWsService;
import com.lonely.server.MyClass;
import com.lonely.server.MyClassArray;
import com.lonely.server.User; public class HelloInvoking { public static void main(String[] args) {
HelloWsService helloWsService = new HelloWsService();
HelloWs helloWs = helloWsService.getHelloWsPort();
// System.out.println(helloWs.sayHelloWs("dugu")); /*
* Clazz clazz = new Clazz(); clazz.setClassId(1); List<User> list =
* helloWs.findUsersByClassId(clazz); for (User user : list) {
* System.out.println(user.getUsername() + ":" + user.getClassId()); }
*/ // 获取 Client对象,来获取拦截器
Client client = ClientProxy.getClient(helloWs);
// 添加 in 日志拦截器
client.getInInterceptors().add(new LoggingInInterceptor());
// 添加 out 日志拦截器
client.getOutInterceptors().add(new LoggingOutInterceptor()); MyClassArray myClassArray = helloWs.findAllUsers();
List<MyClass> list = myClassArray.getItem();
for (MyClass myClass : list) {
System.out.println("班级:" + myClass.getKey());
List<User> users = myClass.getValue();
for (User user : users) {
System.out.println("\t学生:" + user.getUsername());
}
}
}
}

1.4 运行看效果,至此,cxf提供的拦截器 配置完成,下面是 自定义拦截器配置



2. 自定义拦截器的配置使用

在这里通过该demo可以实现身份的验证,只有身份验证通过才可以成功调用方法成功。
2.1 在服务器端 配置一个 in 的 自定义身份验证拦截器,拦截所有请求,获取其身份信息进行验证
package com.lonely.intercepter;

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.Node;
import org.w3c.dom.NodeList; public class MyIntercepter extends AbstractPhaseInterceptor<SoapMessage> { public MyIntercepter() {
// 在调用方法之前拦截
super(Phase.PRE_INVOKE); } @Override
public void handleMessage(SoapMessage message) throws Fault {
// 1. 获取拦截器,这里就假设只有一个拦截器
List<Header> headers = message.getHeaders();
if (headers == null || headers.size() == 0) {
throw new IllegalArgumentException("没有获取到表头信息");
}
Header header = headers.get(0); // 2. 获取元素
Element element = (Element) header.getObject();
NodeList uNodeList = element.getElementsByTagName("userName");
NodeList cNodeList = element.getElementsByTagName("classId"); Node uNode = uNodeList.item(0);
String userName = uNode.getTextContent();
Node cNode = cNodeList.item(0);
String classId = cNode.getTextContent(); // 3.验证
if (!userName.equals("aa") || !classId.equals("1")) {
throw new IllegalArgumentException("用户名或密码错误");
} } }

2.2 在 发布类中 添加该 拦截器

// 在调用方法之前验证身份,创建一个身份验证的 in 拦截器
jaxWsServerFactoryBean.getInInterceptors().add(new MyIntercepter());

2.3 启动发布

2.4 在客户端 配置一个调用webservice服务前 的拦截器,作用在于 在调用前把身份信息封装到 soap的header信息中
package com.lonely.intercepter;

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 AuthIntercepter extends AbstractPhaseInterceptor<SoapMessage> { private String userName;
private String classId; public AuthIntercepter(String userName, String classId) {
// 发起调用前
super(Phase.PREPARE_SEND);
this.userName = userName;
this.classId = classId;
} /**
* 调用服务端方法前 将身份信息封装到soap中,服务端拦截器拦截获取信息验证
*/
@Override
public void handleMessage(SoapMessage message) throws Fault {
// 获取soap表头信息
List<Header> headers = message.getHeaders(); // 1.创建document和元素
Document document = DOMUtils.createDocument();
Element authEle = document.createElement("authInfo");
Element uEle = document.createElement("userName");
Element cEle = document.createElement("classId"); // 2.赋值
uEle.setTextContent(userName);
cEle.setTextContent(classId);
authEle.appendChild(uEle);
authEle.appendChild(cEle); // 3. 添加到headers中
headers.add(new Header(new QName("auth"), authEle)); } }

2.5 在客户端的 测试类中,添加 该 out 拦截器

// 添加 out 自定义身份验证拦截器
client.getOutInterceptors().add(new AuthIntercepter("aa", "1"));

2.6 调用测试,分别 正确和错误都演示一边

成功调用

身份错误,调用失败

2.7 至此,拦截器使用demo 完成


使用CXF开发WebService程序的总结(六):结合拦截器使用的更多相关文章

  1. 使用CXF开发WebService程序的总结(七):Spring+CXF+Mybatis+Mysql共同打造的服务端示例

    通过该demo,可以 熟悉下 spring+cxf+maven+mybatis+mysql等常见后端技术整合 1. 在前面的 父工程 ws_parent 中 添加依赖 由于原来的项目是使用的cxf依赖 ...

  2. 使用CXF开发WebService程序的总结(五):基于Map数据类型处理的的客户端和服务端代码的编写

    1. 首先我们按照List或数组等处理方式来处理Map,看看效果 1.1 在服务端的接口中添加以下方法 /** * 查询所有班级信息加上对应的学生列表 * * @return */ public Ma ...

  3. 使用CXF开发WebService程序的总结(三):创建webservice客户端

    1.创建一个maven子工程 ws_client,继承父工程 1.1 修改父工程pom配置 <modules> <module>ws_server</module> ...

  4. 使用CXF开发WebService程序的总结(四):基于bean的客户端和服务端代码的编写

    1. 在原服务端项目 ws_server中添加两个bean 1.1 添加两个类  User 和 Clazz   package com.lonely.pojo; public class User { ...

  5. 【WebService】使用CXF开发WebService(四)

    CXF简介 Apache CXF = Celtix + XFire,开始叫 Apache CeltiXfire,后来更名为 Apache CXF 了,以下简称为 CXF.CXF 继承了 Celtix ...

  6. struts1+spring+myeclipse +cxf 开发webservice以及普通java应用调用webservice的实例

    Cxf + Spring+ myeclipse+ cxf 进行  Webservice服务端开发 使用Cxf开发webservice的服务端项目结构 Spring配置文件applicationCont ...

  7. 使用cxf开发webservice应用时抛出异常

    在使用cxf开发webservice应用时,报出了类似下面的错误 JAXB: [javax.xml.bind.UnmarshalException: unexpected element (uri:& ...

  8. 使用cxf开发webservice接口

    项目中经常用到开发webservice接口,及调用webService接口.这里讲解如何使用cxf开发webService接口. 一.webservice介绍及理解 webservice是一种跨平台, ...

  9. Spring boot+CXF开发WebService

    最近工作中需要用到webservice,而且结合spring boot进行开发,参照了一些网上的资料,配置过程中出现的了一些问题,于是写了这篇博客,记录一下我这次spring boot+cxf开发的w ...

随机推荐

  1. Struts初学

    自我概述 今天看了Struts,感觉这是个非常好用的东西!虽然它已经过时了,被springMVC取代了,但是仍然有了解的价值. 可是在学习过程中遇到了很多问题,比如其中一些原理很是抽象,有一些问题莫名 ...

  2. 【Spark机器学习速成宝典】模型篇02逻辑斯谛回归【Logistic回归】(Python版)

    目录 Logistic回归原理 Logistic回归代码(Spark Python) Logistic回归原理 详见博文:http://www.cnblogs.com/itmorn/p/7890468 ...

  3. webSocket通信

    针对webSocket通信总结: 1.webSocket通信原理图: 2.webSocket通信实例 参考地址1:https://www.cnblogs.com/cjm123/p/9674506.ht ...

  4. react-native 环境安装常见问题

    npm install react-native-cli -g react-native init yourproject npm install react-native run-ios 问题1:卡 ...

  5. Java关键字之static的典型用法分析

    static关键字是java中非常重要的一个关键字,用的好的话可以提高程序的运行性能,优化程序结构.接下来我们来总结一下static关键字及其用法.1.static变量 static变量也称作静态变量 ...

  6. New Date API介绍

    一.新的Date API介绍 LocalDateLocalTimeInstantDurationPeriod formatterparsejdk以前的java.util.Date存在的问题 1)比如n ...

  7. 阶段3 2.Spring_02.程序间耦合_8 工厂模式解耦的升级版

    遍历枚举 改造获取的方法,这样获取的对象就是单例模式 再次运行测试程序 对象只有一个实例的情况下对i这个值进行了反复的操作.当多个人活着多线程在使用时.这就会出现类成员变量由于第一个人的修改.后面看到 ...

  8. 阶段3 2.Spring_01.Spring框架简介_01.spring课程四天安排

    spring共四天 第一天:spring框架的概述以及spring中基于XML的IOC配置 第二天:spring中基于注解的IOC和ioc的案例 第三天:spring中的aop和基于XML以及注解的A ...

  9. vim技巧1

    在编辑模式或可视模式下输入的命令会另外注明.1. 查找   /xxx(?xxx)       表示在整篇文档中搜索匹配xxx的字符串, / 表示向下查找, ? 表示                   ...

  10. RAC FAILover详解(转载)

    Oracle  RAC 同时具备HA(High Availiablity) 和LB(LoadBalance). 而其高可用性的基础就是Failover(故障转移). 它指集群中任何一个节点的故障都不会 ...