CXF WebService 授权&动态调用
SpringBoot WebService 源代码:https://gitee.com/VipSoft/VipWebService
服务端添加拦截器
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 java.util.List;
import org.apache.cxf.binding.soap.SoapHeader;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.w3c.dom.Element;
import javax.xml.soap.SOAPException; @Component
public class WsAuthInterceptor extends AbstractPhaseInterceptor<SoapMessage> {
private static final String USERNAME = "root";
private static final String PASSWORD = "admin"; public WsAuthInterceptor() {
// 定义在哪个阶段进行拦截
super(Phase.PRE_PROTOCOL);
} @Override
public void handleMessage(SoapMessage soapMessage) throws Fault {
List<Header> headers = soapMessage.getHeaders();
String username = null;
String password = null;
if (headers == null || headers.isEmpty()) {
throw new Fault(new IllegalArgumentException("找不到Header,无法验证用户信息"));
}
// 获取用户名,密码
for (Header header : headers) {
SoapHeader soapHeader = (SoapHeader) header;
Element e = (Element) soapHeader.getObject();
username = e.getAttribute("username");
password = e.getAttribute("password");
if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) {
throw new Fault(new IllegalArgumentException("用户信息为空"));
}
}
// 校验用户名密码
if (!(USERNAME.equals(username) && PASSWORD.equals(password))) {
SOAPException soapExc = new SOAPException("认证失败");
System.err.println("用户认证信息错误");
throw new Fault(soapExc);
}
}
}
@Bean
public Endpoint endpoint() {
EndpointImpl endpoint = new EndpointImpl(springBus(), demoService()); //绑定要发布的服务
endpoint.publish("/api"); // 暴露webService api,用在资源访问
endpoint.getInInterceptors().add(wsAuthInterceptor);
return endpoint;
}
--------
客户端调用
SOAP UI
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://service.his.iron.com">
<soapenv:Header>
<Author username="root" password="admin"></Author>
</soapenv:Header>
<soapenv:Body>
<ser:sayHello>
<!--Optional:-->
<arg>Test</arg>
</ser:sayHello>
</soapenv:Body>
</soapenv:Envelope>
WebService 动态调用
@Override
public String soapDynamicTest(String ip) {
//创建动态客户端
JaxWsDynamicClientFactory factory = JaxWsDynamicClientFactory.newInstance();
// Client client = factory.createClient("http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx?wsdl");
Client client = factory.createClient("http://192.168.1.216:9090/ws/api?wsdl");
// 需要密码的情况需要加上用户名和密码
//client.getOutInterceptors().add(new ClientAuthInterceptor("USER_NAME","PASS_WORD"));
HTTPConduit conduit = (HTTPConduit) client.getConduit();
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
httpClientPolicy.setConnectionTimeout(2000); //连接超时
httpClientPolicy.setAllowChunking(false); //取消块编码
httpClientPolicy.setReceiveTimeout(120000); //响应超时
conduit.setClient(httpClientPolicy);
client.getOutInterceptors().add(new ClientCheckInterceptor()); try{
Object[] objects = new Object[0];
// invoke("方法名",参数1,参数2,参数3....);
// objects = client.invoke("getCountryCityByIp", ip);
objects = client.invoke("sayHello", ip);
System.out.println("返回数据:" + objects[0]);
// return ((ArrayOfString) objects[0]).getString().toString();
return objects[0].toString();
}catch (Exception e){
e.printStackTrace();
}
return "";
}
ClientCheckInterceptor.java
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; import javax.xml.namespace.QName;
import java.util.List; public class ClientAuthInterceptor extends AbstractPhaseInterceptor<SoapMessage> {
private static final String USERNAME = "root";
private static final String PASSWORD = "admin";
public ClientCheckInterceptor() {
super(Phase.PREPARE_SEND);
}
@Override
public void handleMessage(SoapMessage message) throws Fault {
List<Header> headers = message.getHeaders();
Document document = DOMUtils.createDocument();
Element authorEle = document.createElement("author");
authorEle.setAttribute("username", USERNAME);
authorEle.setAttribute("password", PASSWORD);
headers.add(new Header(new QName(""), authorEle));
}
}
CXF WebService 授权&动态调用的更多相关文章
- C#调用WebService服务(动态调用)
原文:C#调用WebService服务(动态调用) 1 创建WebService using System; using System.Web.Services; namespace WebServi ...
- WebService – 2.动态调用WebService
在本节课程中,将演示如何通过程序动态添加.调用.编译.执行WebService并返回结果. WebService动态调用示意图 WebService相关知识 代码文档对象模型CodeDom的使用 编程 ...
- Webservice客户端动态调用服务端功能方法
一.发布WebService服务 方式一:在服务端生成wsdl文件,下方客户端直接引用即可 优点:针对要发布的方法生成一个wsdl文件即可,无需多余配置. 缺点:每次服务端方法发生改变都需 ...
- cxf Webservice 使用httpClient 调用
package com.wistron.wh.swpc.portal.uitl; import java.io.BufferedInputStream;import java.io.File;impo ...
- C# .NET 动态调用webservice的三种方式
转载自 百度文库 http://wenku.baidu.com/link?url=Q2q50wohf5W6UX44zqotXFEe_XOMaib4UtI3BigaNwipOHKNETloMF4ax4W ...
- Java动态调用webService,axis2动态调用webService
Java动态调用webService axis2动态调用webService >>>>>>>>>>>>>>>& ...
- Web Service学习笔记:动态调用WebService
原文:Web Service学习笔记:动态调用WebService 多数时候我们通过 "添加 Web 引用..." 创建客户端代理类的方式调用WebService,但在某些情况下我 ...
- SOA 下实现分布式 调用 cxf+ webService +动态调用
近期项目间隙 自学了 webservice 一下 是我写的 一个demo 首先我们在web.xml 里配置如下 <servlet> <servlet-name>CXFS ...
- 转载 CXF动态调用webservice
/** * * @param wsdlUrl wsdl的地址:http://localhost:8001/demo/HelloServiceDemoUrl?wsdl * @param methodNa ...
- cxf动态调用webservice设置超时,测试线程安全
Java代码 import java.util.Random; import java.util.concurrent.ArrayBlockingQueue; import java.util.con ...
随机推荐
- oceanbase 数据库SQL优化 (把你的脑袋当成CBO)
OB一哥们找我优化条SQL,反馈在OceanBase存储过程执行时间很慢,需要626秒才能出结果,安排. INSERT INTO insurance_stat_sx (id, stat_date, c ...
- Lyndon 分解
介绍 [模板]Lyndon 分解 #include<cstdio> #include<cstring> char s[5000005]; int main(){ scanf(& ...
- MySQL大表设计
存储大规模数据集需要仔细设计数据库模式和索引,以便能够高效地支持各种查询操作.在面对数亿条数据,每条数据包含数百个字段的情况下,以下是我能想到的在设计数据库的时候需要注意的内容,不足之处欢迎各位在评论 ...
- Walrus 0.4发布:单一配置、多态运行,体验下一代应用交付模型
今天,我们高兴地宣布云原生统一应用平台 Walrus 0.4 正式发布,这是一个里程碑式的版本更新.新版本采用了全新的应用模型--仅需进行单一配置,即可在多种模态的基础设施及环境中运行包括应用服务及周 ...
- MySQL-char与 varchar 的区别?
版权声明:原创作品,谢绝转载!否则将追究法律责任. ----- 作者:kirin 1.共同点: 都是字符串类型 2.不同点: ①.char类型是定长数据类型.,对于数据插入的速度比较块,在有大量插入需 ...
- 【结对作业】 第一周 | 学习体会day05
实现了单条地铁线路的直达 进行了页面的优化,实现了侧边栏功能 并且对第二天(今天)的任务进行了规划.
- .net下优秀的日志框架Serilog,你用上了吗?强烈推荐
在 .NET 开发中,Serilog 是一款广受欢迎的日志库,它提供了强大的日志记录功能,具有丰富的特性和高度的可扩展性.Serilog 的优秀之处包括: 可扩展性: Serilog 可以轻松扩展以满 ...
- 实践篇:1 虚拟机使用rmp方式安装部署GitLab-ce
01 环境准备 电脑:MAC Air 虚拟机:VMware Fusion 12.2.3 Linux环境:CentOS 7 02 rpm方式安装部署GitLab服务 步骤1:centos 7 安装wge ...
- RV1126 快速启动
一.硬件信息 RV1126/RV1109 系列芯⽚内置硬件解压缩模块 -- decom,可以极⼤得提升系统启动速度 RV1126/RV1109 内置⼀个 MCU,MCU 在 SoC 上电后就会快速启动 ...
- IDEA 激活码全家桶 webStorm亲测可用【更新日期2021.11.30】
3MRUAPM31O-eyJsaWNlbnNlSWQiOiIzTVJVQVBNMzFPIiwibGljZW5zZWVOYW1lIjoi5rC45LmF5r+A5rS7IHd3d8K3YWppaHVvw ...