camel 调用soap_使用Apache Camel通过soap添加WS-Security

camel 调用soap

WS-Security(Web服务安全性)是一个协议,可让您保护自己的soap Web服务。 发出Soap请求的客户端必须在Soap标头中提供登录名和密码。

服务器接收到肥皂请求,检查凭据并验证请求是否正确。 使用Apache Camel,可以很容易地使用肥皂网络服务(特别是如果您使用Apache CXF),但是使用WS-Security可能会很棘手。

这个想法是创建一个具有所有必需信息(包括登录名和密码)的xml模板,并将该模板添加到soap标头中。

public void addSoapHeader(Exchange exchange,String soapHeader){List<SoapHeader> soapHeaders = CastUtils.cast((List<?>) exchange.getIn().getHeader(Header.HEADER_LIST));SoapHeader newHeader;if(soapHeaders == null){soapHeaders = new ArrayList<SoapHeader>();}try {newHeader = new SoapHeader(new QName("soapHeader"), DOMUtils.readXml(new StringReader(soapHeader)).getDocumentElement());newHeader.setDirection(Direction.DIRECTION_OUT);soapHeaders.add(newHeader);exchange.getIn().setHeader(Header.HEADER_LIST, soapHeaders);} catch (Exception e) {//log error}}

Apache Camel使用Exchange接口,该接口具有检索或更新标头的方法。 soapHeader参数是包含xml模板的字符串。

我们检索当前的标头,并添加一个名为soapHeader的新标头。 由于使用了DOMUtils类,我们将soapHeader属性从字符串转换为XML。

newHeader.setDirection(Direction.DIRECTION_OUT)指令意味着该标头将应用于离开消费者端点或进入生产者端点的请求(即,它适用于通过路由传播的WS请求消息)。

现在让我们创建xml模板并调用addSoapHeader方法:

public void addWSSESecurityHeader(Exchange exchange,String login,String password){String soapHeader = "<?xml version=\"1.0\" encoding=\"utf-8\"?><wsse:Security xmlns:wsse=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\"+ "xmlns:wsu=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd\"><wsse:UsernameToken wsu:Id=\"UsernameToken-50\"><wsse:Username>"+ login+ "</wsse:Username><wsse:Password Type=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText\">"+ password + "</wsse:Password></wsse:UsernameToken></wsse:Security>";//Add wsse security header to the exchangeaddSoapHeader(exchange, soapHeader);}

如我们所见,我们在xml中需要两个名称空间(以使用WS-Security进行处理):

  • http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd
  • http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd

然后,我们可以在xml中使用有趣的标签:

  • wsse:UsernameToken:包括用户名和密码信息
  • wsse:Username:认证所需的用户名
  • wsse:Password:认证所需的密码

接下来,我们只需要调用方法addSoapHeader即可将xml添加到soap标头中。 这是完整的Apache Camel路由的完整代码:

package com.example.test;import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import javax.xml.namespace.QName;
import org.apache.camel.Exchange;
import org.apache.camel.util.CastUtils;
import org.apache.cxf.binding.soap.SoapHeader;
import org.apache.cxf.headers.Header;
import org.apache.cxf.headers.Header.Direction;
import org.apache.cxf.helpers.DOMUtils;public class MyRoute extends RouteBuilder {public void addSoapHeader(Exchange exchange,String soapHeader){List<SoapHeader> soapHeaders = CastUtils.cast((List<?>) exchange.getIn().getHeader(Header.HEADER_LIST));SoapHeader newHeader;if(soapHeaders == null){soapHeaders = new ArrayList<SoapHeader>();}try {newHeader = new SoapHeader(new QName("soapHeader"), DOMUtils.readXml(new StringReader(soapHeader)).getDocumentElement());newHeader.setDirection(Direction.DIRECTION_OUT);soapHeaders.add(newHeader);exchange.getIn().setHeader(Header.HEADER_LIST, soapHeaders);} catch (Exception e) {//log error}}public void addWSSESecurityHeader(Exchange exchange,String login,String password){String soapHeader = "<?xml version=\"1.0\" encoding=\"utf-8\"?><wsse:Security xmlns:wsse=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\"+ "xmlns:wsu=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd\"><wsse:UsernameToken wsu:Id=\"UsernameToken-50\"><wsse:Username>"+ login+ "</wsse:Username><wsse:Password Type=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText\">"+ password + "</wsse:Password></wsse:UsernameToken></wsse:Security>";//Add wsse security header to the exchangeaddSoapHeader(exchange, soapHeader);}@Overridepublic void configure() throws Exception {from("endpointIn").process(new Processor(){@Overridepublic void process(Exchange exchange) throws Exception {addWSSESecurityHeader(exchange, "login","password");}}).to("endointOut") ;}
}

翻译自: https://www.javacodegeeks.com/2014/06/adding-ws-security-over-soap-using-apache-camel.html

camel 调用soap

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/341234.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Typora中插入分页符

由于typora基于html&#xff0c;插入分页符的方法&#xff08;在导出成PDF时生效&#xff09;&#xff1a; <div style"page-break-after:always"></div>

使用Spring Boot Actuator监视Java应用程序

朋友不允许朋友写用户身份验证。 厌倦了管理自己的用户&#xff1f; 立即尝试Okta的API和Java SDK。 在几分钟之内即可对任何应用程序中的用户进行身份验证&#xff0c;管理和保护。 您是否曾与Spring Boot Actuator合作&#xff1f; 这是一个非常有用的库&#xff0c;可帮助您…

【sublime】 按 ctrl+shift+f没有反应(系统:win10+搜狗输入法)

系统&#xff1a; win10 输入法&#xff1a; 搜狗 问题&#xff1a; sublime 按 ctrlshiftf没有反应 原因&#xff1a; sumlime 中 ctrlshiftf 与搜狗繁简切换冲突 解决&#xff1a; A. 右击搜狗输入法状态栏&#xff08;就是那个小条条&#xff09;&#xff0c;选择属性设…

SublimeText3 ctrl+f打开搜索框后怎么关闭

按esc就可以退出了&#xff0c;点那个 find all也会退出

javaone_JavaOne 2014 –有关提交的一些初步分析

javaone这些天时间不多了。 并行发生的事情如此之多&#xff0c;当然&#xff0c;最重要的Java会议就是一切。 JavaOne 2014已经关闭了CfP门&#xff0c;投票正在进行中。 程序委员会几乎没有什么可以谈论的&#xff0c;但是去年跳过了这种分析之后&#xff0c;现在是我寻求许…

Sublime打开与关闭右侧缩略图

启动sublime text 3软件&#xff0c;如图所示&#xff1b; 发现右侧缩略图占据了太大的位置&#xff0c;瞬间感觉整个世界都不好了&#xff1b; 要想关闭这个缩略图&#xff0c;需要到菜单视图里面设置&#xff0c;首先点击菜单栏“view”——“hideMiniMap”&#xff1b;如图所…

Sublime Text 如何查看当前文件的编码格式?

打开preference->setting->输入下面代码 "show_encoding": true,"show_line_endings": true 此时保存该配置文件&#xff0c;就能够看到 sublime 最底下一行会显示文件编码格式了。以上的配置内容在 Perference → Setting─Default 都是 false 的。…

jaxb-xjc.jar_使用xjc在一秒钟内生成您的JAXB类

jaxb-xjc.jar由于JAXB是JDK的一部分&#xff0c;因此它是处理XML文档最常用的框架之一。 它提供了一种从XML文档检索数据并将其存储到Java类的简便方法。 因为几乎每个Java开发人员都已经使用过JAXB&#xff0c;所以我不会解释不同的JAXB批注。 相反&#xff0c;我将重点介绍一…

修改Typora默认的字体为好看秀美的中文字体“华康手札体“

一 下载并安装"华康手札体W5P"字体 &#xff08;1&#xff09;下载方式&#xff1a; 1. 方式一 http://www.downcc.com/font/341067.html2.百度云链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/125Hh-tqWOy1Ht-GvD_P2MQ 提取码&#xff1a;z6ka 复制…

测试Spring Boot有条件的合理方式

如果您或多或少有经验的Spring Boot用户&#xff0c;那么很幸运&#xff0c;在某些时候您可能需要遇到必须有条件地注入特定bean或配置的情况 。 它的机制是很好理解的 &#xff0c;但有时这样的测试条件下&#xff08;以及它们的组合&#xff09;可能会导致混乱。 在这篇文章中…

金山打字通答案

背景 金山打字通练习键盘键位&#xff0c;需要对第一关熟悉键盘知识进行答题。一下整理答案 答案 ABADCBCA

Onetab快速删除所有历史网页

1. 打开网页的控制台&#xff08;F12&#xff09; 2. 控制台粘贴该命令 document.querySelectorAll(div.deleteAllButton).forEach(function(ele, index, list){ele.click();});3. 然后按住回车&#xff08;有 conform 弹框需要确认&#xff09;&#xff0c;等待全部清空

golang的jwt学习笔记

文章目录 初始化项目加密一步一步编写程序另一个参数--加密方式关于StandardClaims 解密解析出来的怎么用关于`MapClaims`上面使用结构体的全代码实战项目关于验证这个项目的前端初始化项目 自然第一步是暗转jwt-go的依赖啦 #go get github.com/golang-jwt/jwt/v5 go get githu…

Ubuntu根目录下各文件夹的功能详细介绍

Ubuntu的根目录下存在着很多的文件夹&#xff0c;但你知道他们都存放着哪些文件呢&#xff1f;这些是深入了解Ubuntu系统必不缺少的知识&#xff0c;本文就关于此做一下介绍吧。 /bin/ 用以存储二进制可执行命令文件。 /sbin/ 许多系统命令的存储位置&#xff0c;/usr/sb…

mock测试使用断言_使用自定义断言丰富测试代码

mock测试使用断言受GeeCON会议期间tkaczanowski演讲的启发&#xff0c;我决定仔细研究AssertJ库的自定义断言。 在我的“骰子”游戏中&#xff0c;我创建了一个“机会”&#xff0c;它是骰子的任何组合&#xff0c;其分数是所有骰子的总和。 这是相对简单的对象&#xff1a; …

如何实现有序列表端内换行

背景 有序列表换行后自动开启下一个标号&#xff0c;让人苦恼。 操作 操作系统换行操作 1. 【Enter】键是硬回车&#xff0c;即段落标记。回车后文字属于下一段落 2. 【shiftEnter】是软回车快捷键。即人工换行符。回车后文字仍属于前一段落&#xff0c;只不过重新换行。 …

Java性能:For-eaching与Streaming

在for循环中向上或向下计数是最有效的迭代方式吗&#xff1f; 有时答案既不是。 阅读这篇文章&#xff0c;了解不同迭代品种的影响。 迭代性能 关于如何以高性能进行迭代有很多观点。 Java中的传统迭代方式是一个for循环&#xff0c;该循环从零开始&#xff0c;然后计数到一些…

好用的截图工具

目录 截图软件介绍 神器2——Snipaste PicPick——自带画图 LightShot——自带图床 功能总结 截图软件介绍 参考推荐5个截图工具&#xff08;超好用&#xff09; - 知乎&#xff0c;列出几个好用的截图工具 神器2——Snipaste 超级好用&#xff0c;QQ的功能Snipaste全都有…

Markdown语法与文本内容冲突的解决方案(软件Typora)

背景 使用Typora输入文字后&#xff0c;其中特殊字符自动识别为Markdown语法 解决方式 在使用markdown书写博客时&#xff0c;有可能会出现文本中的字符是markdown语法&#xff0c;那么markdown翻译器就会误将这些符号也翻译成某种功能&#xff0c;就会出现显示错误的情况。…

如何在Flutter(REST API)中进行API调用

在本文中&#xff0c;我们将探讨如何在波动中进行API调用并使用简单的REST API。 在这里查看我在Flutter上的其他一些帖子&#xff1a; Flutter vs React Native 了解Flutter中的BLoC架构 &#xff08;强烈建议&#xff09; 在Flutter中构建ListView&#xff08;RecyclerVi…