CXF拦截器使用,创建一个使用SOAPHeader的安全验证xml格式:
<soap:Header><auth:authentication xmlns:auth="http://gd.chinamobile.com//authentication"><auth:systemID>1</auth:systemID><auth:userID>test</auth:userID><auth:password>test</auth:password></auth:authentication>
</soap:Header>一,首先在服务端创建一个拦截器(被调用端),需要继承org.apache.cxf.phase.AbstractPhaseInterceptor
代码如下:
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.interceptor.Fault;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.apache.log4j.Logger;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;/*** 系统全局拦截器(排除登录服务调用) 用于校验登录的账号是否已登录* */
public class AuthValidateInterceptor extends AbstractPhaseInterceptor<SoapMessage> {private Logger logger = Logger.getLogger(this.getClass());public AuthValidateInterceptor() {// 定义拦截器阶段super(Phase.PRE_INVOKE);}/*** @Description: 拦截器操作* @param message*            被拦截到的消息* @throws Fault*/@Overridepublic void handleMessage(SoapMessage message) {List<Header> headers = message.getHeaders();if (headers == null || headers.isEmpty()) {throw new Fault(new Exception("无授权信息!"));}Element auth = null;// 获取授权信息元素for (Header header : headers) {QName qname = header.getName();String tagName = qname.getLocalPart();if (tagName != null && tagName.equals("auth")) {auth = (Element) header.getObject();break;}}// 如果授权信息元素不存在,提示错误if (auth == null) {throw new Fault(new Exception("无授权信息!"));}NodeList nameList = auth.getElementsByTagName("username");NodeList pwdList = auth.getElementsByTagName("password");if (nameList.getLength() != 1 || pwdList.getLength() != 1) {throw new Fault(new Exception("授权信息错误!"));}String name = nameList.item(0).getTextContent();String password = pwdList.item(0).getTextContent();if (!"admin".equals(name) || !"admin".equals(password)) {throw new Fault(new Exception("授权信息错误!"));}}}

二,修改cxf-beans.xml<!--id:随意配,implementor:指定接口具体实现类,address:随意配,访问时会用到,下面会做说明-->
<!--拦截器-->
<bean id="authIntercetpr" class="unitTest.AuthIntercetpr"></bean>
<jaxws:endpoint id="HelloWorldService" implementor="com.ws.HelloWorldServiceImpl"address="/IHelloService"><!-- 在此配置调用当前ws所触发的拦截器--><jaxws:inInterceptors><ref bean="authIntercetpr" /></bean>     <!--或者直接在这里写<bean  class="unitTest.AuthIntercetpr"></bean>--></jaxws:inInterceptors>
</jaxws:endpoint>到此服务端工作完毕!!!
下面是客户端(调用端)
三,这边同样创建一个拦截器,实现org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor
import java.util.List;import javax.xml.namespace.QName;import org.apache.cxf.binding.soap.SoapHeader;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
import org.apache.cxf.headers.Header;
import org.apache.cxf.helpers.DOMUtils;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.Phase;
import org.apache.log4j.Logger;
import org.w3c.dom.Document;
import org.w3c.dom.Element;/*** 系统全局拦截器(排除登录服务调用) 用于校验登录的账号是否已登录* */
public class ClientAuthValidateInterceptor extends AbstractSoapInterceptor {private Logger logger = Logger.getLogger(this.getClass());public static final String xml_namespaceUR = "";public static final String xml_header = "soap:Header";public static final String xml_authentication = "auth:authentication";public static final String xml_systemID = "auth:systemID";public static final String xml_username = "auth:username";public static final String xml_password = "auth:password";public ClientAuthValidateInterceptor() {// 定义拦截器阶段super(Phase.WRITE);}/*** @Description: 拦截器操作* @param message*            被拦截到的消息* @throws Fault*/@Overridepublic void handleMessage(SoapMessage message) {String userId = "test";String sysId = "1";String password = "test";Document doc = DOMUtils.createDocument();Element root = doc.createElement(xml_header);Element eSysId = doc.createElement(xml_systemID);eSysId.setTextContent(sysId);Element eUserId = doc.createElement(xml_username);eUserId.setTextContent(userId);Element ePwd = doc.createElement(xml_password);ePwd.setTextContent(password);Element child = doc.createElementNS(xml_namespaceUR, xml_authentication);child.appendChild(eSysId);child.appendChild(eUserId);child.appendChild(ePwd);root.appendChild(child);QName qname = new QName("RequestSOAPHeader");SoapHeader head = new SoapHeader(qname, root);List<Header> headers = message.getHeaders();headers.add(head);}}

四,具体调用ws的类代码
        HelloWorldServiceImplService hello = new HelloWorldServiceImplService();  HelloWorldService service = hello.getHelloWorldServiceImplPort();// 插入身份验证Client clientProxy = ClientProxy.getClient(port);// 通过目标ws获取代理// 注入拦截器,getOutInterceptors代表调用服务端时触发,getInInterceptors就是被调用才触发clientProxy.getOutInterceptors().add(new ClientAuthValidateInterceptor());// 超时时间设置HTTPConduit http = (HTTPConduit) clientProxy.getConduit();HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();httpClientPolicy.setConnectionTimeout(Integer.valueOf("6000"));httpClientPolicy.setReceiveTimeout(Integer.valueOf("6000"));httpClientPolicy.setAllowChunking(false);http.setClient(httpClientPolicy);//下面这行代码是具体调用服务段的deleteTeskTask()CallResult cResult = service.deleteTeskTask("1223");

五,还有一种方式是通过JaxWsProxyFactoryBean方式,注册拦截器及实例化ws,代码如下:

        JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();List<Interceptor<? extends Message>> clientAuthValidateInterceptors = new ArrayList<>();// 添加soap header 信息clientAuthValidateInterceptors.add(new ClientAuthValidateInterceptor());// 注入拦截器,getOutInterceptors代表调用服务端时触发,getInInterceptors就是被调用才触发
        factory.setOutInterceptors(clientAuthValidateInterceptors);factory.setServiceClass(HelloWorldService.class);// 实例化wsfactory.setAddress("http://localhost:8090/iwm/sapDeliveryOrderToIwm");Object obj = factory.create();HelloWorldService service = (HelloWorldService) obj;//下面这行代码是具体调用服务段的deleteTeskTask()CallResult cResult = service.deleteTeskTask("1223");

客户端代码到此结束

转载于:https://www.cnblogs.com/rinack/p/7922004.html

CXF 入门:创建一个基于SOAPHeader的安全验证(CXF拦截器使用)相关推荐

  1. 如何创建一个基于 MSBuild Task 的跨平台的 NuGet 工具包

    MSBuild 的 Task 为我们扩展项目的编译过程提供了强大的扩展性,它使得我们可以用 C# 语言编写扩展:利用这种扩展性,我们可以为我们的项目定制一部分的编译细节.NuGet 为我们提供了一种自 ...

  2. 如何创建一个基于Maven的SmartGWT项目

    如何创建一个基于Maven的SmartGWT项目 使用环境 Eclipse的版本为:Luna Service Release 2 (4.4.2)(这个其实不是很重要,你完全可以使用最新版本的Eclip ...

  3. python钓鱼网站_学习笔记6.0 Django入门创建一个钓鱼网站

    太久没写博客了,2020年上半年荒废了大部分时光.从现在开始改变吧,学习django开发的知识. 用了两天的时间,终于学会了如何用pycharm开发django,会自己写一个hello world.虽 ...

  4. Thinkphp入门-创建一个最简单的ThinkPhp项目工程

    从今天起,开始认真写博客,记录总结一些经验,也分享一下自己的学习过程. 说一说ThinkPhp入门创建工程吧,开始ThinkPhp应用编程的第一步. 软件环境: 1.phpstom,下载链接:点击打开 ...

  5. 使用开源微前端框架 Luigi 创建一个基于微前端架构的工程

    官网地址 微前端通常被称为"前端微服务". 它们允许您将大型单体前端分解为独立的.可扩展的.可以协同工作的独立部分. 微前端架构对于复杂的产品或拥有众多团队的公司尤其有用,可以帮助 ...

  6. revit二次开发概念_BIM百科 | Revit二次开发入门--创建一个简单的程序

    获取<每日一技,我的成长轨迹>汇总 · 请访问柏慕联创官方网站: www.lcbim.com · 创建一个简单的Revit外部命令程序[Revit2017+VS2015]: 1.打开VS, ...

  7. Java使用IntelliJ IDEA创建一个基于Swing的GUI图形化程序,打包发布为jar

    1.创建GUI窗体 首先,直接新建一个默认的空的Java模块即可,随便取个名字 之后再src目录下右键,新建,创建一个Swing的GUI窗体,随便取个名字 给主窗体改个名字 到java代码中生成一个窗 ...

  8. Revit二次开发入门--创建一个简单的程序

    创建一个简单的Revit外部命令程序[Revit2017+VS2015]: 1.打开VS,我的版本是VS2015,点击[新建项目]→[Visual C#]→[类库],然后输入程序名称,如:Hello ...

  9. bim 二次开发c语言,BIM百科 | Revit二次开发入门--创建一个简单的程序①

    获取<每日一技,我的成长轨迹>汇总 · 请访问柏慕联创官方网站: www.lcbim.com · Revit插件制作实例步骤: 1.创建你的第一步骤插件 启动 Visual C# 速成版开 ...

最新文章

  1. Pytorch使用CPU运行“Torch not compiled with CUDA enabled”
  2. 切换节点服务器网站,服务器手动切换节点
  3. 供应商管理(Supplier Management)
  4. Redis Lua脚本中学教程(上)
  5. armadillo 配置
  6. 当当网新用户注册界面——CSS代码
  7. z3 C++学习笔记
  8. 测试触发器有没有用_用30道电子工程师面试题来拷问堕落的假期...
  9. 为什么到最后还是要 专注于博客写作
  10. cygwin 解决 乱码问题 (转)
  11. wps文字表格制作拼音田字格模板_wps表格里怎么制作拼音田字格
  12. 罗马数字转换python_阿拉伯数字转换成罗马数字
  13. 做好的ppt太大怎么变小
  14. SSH上传提示:encountered 1 errors during the transfer错误解决办法
  15. Java:实现Ternary search三元搜索算法(附完整源码)
  16. 软件测试高薪“骗局”软件测试入门就月薪过万,还包就业。别再上当受骗了、清醒点吧
  17. CWnd::MoveWindow 详解
  18. 计算机二级 word 论文格式,(计算机二级word练习3.doc
  19. 数学笔记23——部分分式
  20. 超(效)等位基因,亚(效)等位基因,反(效)等位基因,新(效)等位基因

热门文章

  1. visual c++出错:link问题
  2. python基础——变量和数据类型及常见类型转换函数
  3. 调用函数,判断各位数字立方和是否等于它本身
  4. 关于CSS中的相对路径和绝对路径
  5. NASM 中 SECTION 的默认对齐
  6. Netty的引用计数对象
  7. JAVA的三种常量池
  8. UNIX再学习 -- 信号
  9. div上下展开收缩 html,js实现div层缓慢收缩与展开的方法
  10. php获取p标签的值,js使用html()或text()方法获取设置p标签的显示的值