开发CXF客户端通过HTTP Basic Authorization 安全认证的几种办法

Java HTTP客户端深度对比:HttpClient、OkHttp与WebClient选型指南 HTTP客户端是网络通信的核心组件,负责在应用层发起和接收HTTP请求。其工作原理基于客户端-服务器模型,通过建立TCP连接、发送请求报文、接收响应报文来完成数据交换。在技术价值上,一个高效的HTTP客户端能显著提升系统吞吐量、降低延迟,并优化资源利用率。随着微服务架构和云原生技术的普及,服务间通信日益频繁,对HTTP客户端的性能、稳定性和易用性提出了更高要求。常见的应用场景包括微服务间API调用、第三方服务集成、数据爬取以及移动端与后端的数据交互等。本文聚焦于Java生态中主流的HTTP客户端解决方案,深 阅读详情

开发CXF客户端通过HTTP Basic Authorization 安全认证的几种办法,有很多个,但是网上包括英文stackoverflow网站和官方文档全部是错误的。一般的CXF客户端开发方法是首先通过网络获取WSDL文件,然后再发送验证用户名密码调用服务,然而在客户端声明并创建服务实例的时候,如

HelloWorldService ss = new HelloWorldService(wsdlURL, SERVICE_NAME); 

就无法通过Http basic 验证,所以之后的所有用户名和密码设置全部失效。

下面贴出几种CXF客户端通过HTTP Basic Authorization 安全认证的方法代码:

 

 private static final QName SERVICE_NAME = new QName("http://example.org/", "HelloWorldService");

 

    private HelloWorld_HelloWorldPort_Client() {

    }

 

    public static void main(String args[]) throws java.lang.Exception {

 

        URL wsdlURL = HelloWorldService.WSDL_LOCATION;

        if (args.length > 0 && args[0] != null && !"".equals(args[0])) { 

            File wsdlFile = new File(args[0]);

            try {

                if (wsdlFile.exists()) {

                    wsdlURL = wsdlFile.toURI().toURL();

                } else {

                    wsdlURL = new URL(args[0]);

                }

            } catch (MalformedURLException e) {

                e.printStackTrace();

            }

        }

      

		System.setProperty( "proxySet", "true" );    

		System.setProperty( "http.proxyHost", "10.133.96.245" );    

		System.setProperty( "http.proxyPort", "8080" );  

		

		//very important!!!

		wsdlURL=new File("D:/hello.xml").toURI().toURL();

 

		HelloWorldService ss = new HelloWorldService(wsdlURL, SERVICE_NAME);//如果wsdlURL是来自HTTP的网络,则此处无法通过Http Basic 验证,已经出错

        HelloWorld port = ss.getHelloWorldPort();  

		

		

		//1、使用本地wsdl文件,而不是从网络中获取wsdl,则可以正常工作

//		Service service = Service.create(wsdlURL, SERVICE_NAME); 

//		HelloWorld port = (HelloWorld) service.getPort(HelloWorld.class);

//        BindingProvider bp=(BindingProvider)port;

//        bp.getRequestContext().put(

//        	   BindingProvider.USERNAME_PROPERTY, "ross");

//        bp.getRequestContext().put(

//        	   BindingProvider.PASSWORD_PROPERTY, "ross");

		

		//2、以下可正常工作

//		JaxWsProxyFactoryBean clientFactory = new JaxWsProxyFactoryBean();             

//		clientFactory.setAddress("http://localhost:8081/hello"); 

//		clientFactory.setServiceClass(HelloWorld.class); 

//		clientFactory.setUsername("ross"); 

//		clientFactory.setPassword("ross"); 

//		HelloWorld port = (HelloWorld)clientFactory.create();	

		//end

      

        

        //3、使用本地wsdl文件,而不是从网络中获取wsdl,则可以正常工作

//        Client client = ClientProxy.getClient(port);

//        HTTPConduit http = (HTTPConduit) client.getConduit();

//        AuthorizationPolicy authorizationPolicy = new AuthorizationPolicy();

//        authorizationPolicy.setUserName("ross");

//        authorizationPolicy.setPassword("ross");

//        authorizationPolicy.setAuthorizationType("Basic");

//        http.setAuthorization(authorizationPolicy);

        //end

        

        //4、使用本地wsdl文件,而不是从网络中获取wsdl,则可以正常工作

//        Map<String, List<String>> headers = new HashMap<String, List<String>>();

//        headers.put("Authorization", Arrays.asList("Basic cm9zczpyb3Nz"));

//        Client client = ClientProxy.getClient(port);

//        client.getRequestContext().put(Message.PROTOCOL_HEADERS, headers);

        //end

        

        

        

        //5、使用本地wsdl文件,而不是从网络中获取wsdl,则可以正常工作

        Client client = ClientProxy.getClient(port);

        HTTPConduit http = 

            (HTTPConduit) client.getConduit();

        HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();

        httpClientPolicy.setAutoRedirect(true);

        http.setClient(httpClientPolicy);

        http.setAuthSupplier(

                new MyBasicAuthSupplier("mule-realm", "ross", "ross"));

        //end

        

         

        

     // Okay, are you sick of configuration files ?

        // This will show you how to configure the http conduit dynamically

//        Client client = ClientProxy.getClient(port);

//        HTTPConduit http = (HTTPConduit) client.getConduit();

//        HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();

//        httpClientPolicy.setConnectionTimeout(36000);

//        httpClientPolicy.setAllowChunking(false);

//        httpClientPolicy.setReceiveTimeout(32000);

//        httpClientPolicy.setConnection(ConnectionType.CLOSE);

//        http.setClient(httpClientPolicy);

 

        

        

        {

        System.out.println("Invoking sayHi...");

        java.lang.String _sayHi_arg0 = "";

        java.lang.String _sayHi__return = port.sayHi(_sayHi_arg0);

        System.out.println("sayHi.result=" + _sayHi__return);

 

 

        }

 

        System.exit(0);

    }


使用

// 5、使用本地wsdl文件,而不是从网络中获取wsdl,则可以正常工作

		Client client = ClientProxy.getClient(port);

		HTTPConduit http =

		(HTTPConduit) client.getConduit();

		HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();

		httpClientPolicy.setAutoRedirect(true);

		http.setClient(httpClientPolicy);

		http.setAuthSupplier(

		new MyBasicAuthSupplier());


MyBasicAuthSupplier 類實現HttpAuthSupplier接口

public class MyBasicAuthSupplier implements HttpAuthSupplier{
	 MyBasicAuthSupplier(){
	 }
	        
	  /* This is a helper method to build the security header */
	  private String createUserPass(String usr, String pwd)
	  {
	    String userpass = usr + ":" + pwd;
	    String token = Base64Utility.encode(userpass.getBytes());
	    return "Basic " + token;
	  }

	@Override
	public String getAuthorization(AuthorizationPolicy arg0, URL arg1,
			Message arg2, String arg3) {
		String username = "username";
	    String password = "password";
	    return createUserPass(username, password);
	}

	@Override
	public boolean requiresRequestCaching() {
		// TODO Auto-generated method stub
		return false;
	}

}


 

SOAP与RESTful服务通信的本质差异与工程选型指南 Web Services 是现代分布式系统解耦协作的基础范式,其核心在于如何在异构系统间建立可信、可演进的通信契约。SOAP 以 WSDL 为法律文本,依托 XML 和 WS-Security 实现强类型、强安全、事务一致的远程调用,适用于金融清算、跨企业B2B等强契约场景;RESTful 则基于 HTTP 动词语义与资源建模,强调无状态、松耦合与渐进演化,是微服务与云原生架构的事实标准。二者差异不在格式(XML/JSON),而在契约绑定层级、错误传播机制与运维治理逻辑。理解 restful api 的幂等 阅读详情

相关推荐

使用Java通过CXF发布HTTPS Web服务的完整指南

Web服务是基于Web技术的一种服务架构,它允许不同系统之间的通信和数据交换。现代Web服务通常遵循简单对象访问协议(SOAP)或代表性状态传输(REST)原则,为异构环境提供了灵活的通信手段。Apache CXF是一个强大的开源服务框架,用于构建和开发服务导向架构(SOA)环境中的Web服务。CXF起源于Object Oriented Systems公司开发的 Celtix 和 Codehaus的 XFire,最终在2007年归入Apache软件基金会,成为如今广泛使用的开源项目。

weixin_42608299的博客 870

HttpClient访问的策略Policy

(一)Policy知识体系图(二)代码案例分析(1)Retry()函数public static int TestRetry() { int b = 0; var policy = Policy.Handle<DivideByZeroException>().Retry(3, (ex, i) => { Console.WriteLine(...

LHL62411570的专栏 579

2.CXF安全访问之Http Basic Auth(一)

NULL 博文链接:https://wangwengcn.iteye.com/blog/1879381

cxf和HttpClient调用WebService,并设置超时时间

    最近项目上要调用其他系统的WebService(Axis搭建),由于接收数据较大耗时4分钟左右,所以要设置超时时间,而且系统中已有jar包的原因,导致许多方法都不能用,最终用HttpClient。 方法一:使用JaxWsDynamicClientFactory调用WebService public static Object call(String wsdl,String m...

thewangzl的专栏 3628

CXF 调用ASP服务器端通过用户名密码验证

java CXF客户端请求ERP SAP webservice通过用户名和密码验证功能!

BasicAuth的Java服务端实现

Java 实现HTTP BasicAuth服务端代码,压缩包为Eclipse工程,导入即可运行

超时与重试机制

网上发现这篇好文章,这里记录学习。 介绍 在实际开发过程中,笔者见过太多故障是因为超时没有设置或者设置的不对而造成的。而这些故障都是因为没有意识到超时设置的重要性而造成的。如果应用不设置超时,则可能会导致请求响应慢,慢请求累积导致连锁反应,甚至应用雪崩。而有些中间件或者框架在超时后会进行重试(如设置超时重试两次),读服务天然适合重试,但写服务大多不能重试(如写订单,如果写服务是幂等...

zzhongcy的专栏 8328

IS-IS协议深度解析(二):LSDB同步机制与骨干网实战部署

本文深度解析IS-IS协议的LSDB同步机制与骨干网实战部署。详细阐述了DIS角色如何通过CSNP/PSNP报文高效管理链路状态数据库同步,并与OSPF DR机制进行对比。重点介绍了Level-2骨干网作为逻辑高速公路系统的工作原理,以及通过ATT比特位实现跨区域路由的自动化。最后提供了高可靠性骨干网的实战配置要点与验证方法。

kite3的博客 644

HTTP 调用 WebService、CXF 动态调用 WebService

概述   Web Service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的交互操作的应用程序。   Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据Web Service规范实...

weixin_42256765的博客 3723

在Pycharm中配置Pyqt5工具(2023年新版教程)

在Pycharm中配置Pyqt5相关的三个工具:QtDesigner、PyUIC、PYRCC

网络技术和Python 2万+

基于STM32F407与AD9910/AD9959的高频可调DDS信号源设计与实战

本文详细介绍了基于STM32F407微控制器与AD9910/AD9959高性能DDS芯片的高频可调信号源设计与实现。文章从DDS原理入手,阐述了双芯片方案的优势,并重点分享了高频电路设计中的电源、PCB布局布线等关键硬件设计技巧与避坑指南。同时,提供了通过SPI配置DDS芯片及利用Matlab生成任意波形的软件驱动方法,旨在帮助开发者打造一个覆盖10Hz至4200MHz的实用信号发生器。

weixin_36184718的博客 120

SpringBoot + CXF快速实现SOAP WebService(支持Basic Auth)

讲真,SOAP跟现在流行的RESTful WebService比起来显得很难用。冗余的XML文本信息太多,可读性差,它的请求信息有时很难手动构造,不太好调试。不过说归说,对某些企业用户来说SOAP的使用率仍然是很高的。 一、需求背景 接手维护的一个项目,最近客户想开放项目中的功能给第三方调用,而且接入方指定必须是SOAP接口。这项目原来的代码我看着头疼,也不想再改了,除非推倒重写。客户...

Calvin的博客 1660

[机器学习] 第二章 模型评估与选择 2.ROC:roc_curve原理及源代码详解

代码见:https://github.com/Carrie-Yi/machine_learning/tree/main/roc_curve

心宝的博客 1493

请求首部字段详解-四大首部字段之一

我在分享一下,四大请求首部字段之一,我在之前的一篇文章–《常见Http首部字段》写道了常见的首部字段,里面包含4种常见的请求首部字段,但是我并没有详细的解释这些字段,咱们大家都是讲究的人,既然写了咱们就写的明明白白的,我在《通用首部字段详解–四大首部字段之一》中详解了通用首部字段,今天我们就看看在四大首部字段中字段最多的请求首部字段(19个), 请求首部字段,顾名思义就知道,使用在请求方,那只能携...

qq_28703699的博客 308

Python实现多元线性回归(Multiple Linear Regression)

多元线性回归是一种用于建立多个自变量与因变量之间关系的统计学方法。在多元线性回归中,我们可以通过多个自变量来预测一个因变量的值。每个自变量对因变量的影响可以用回归系数来表示。

优快云 精品推荐 4331

【R语言】基于Biomod2集成平台探究物种分布区的构建流程(SDMs)

我为什么想要写这个内容呢?其实我已经想了很久了,但是一直没有把所有的代码给理清楚,此外这将是我之后研究的主要方向。本博客讲述了如何基于Biomod2集成平台构建物种分布模型的全流程,以及我在使用该模型时的一些心得,同时还有我提供的一些小福利(一键处理代码),可以十分快捷的帮助你完成SDMs的构建,写出你的中英文论文。

amyniez的博客,欢迎交流讨论 3889

java关于设置webservice连接超时和请求超时

以下记录常用的webservice超时配置 1、CXF Client client = ClientProxy.getClient(port); HTTPConduit http = (HTTPConduit) client.getConduit(); HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy(); // 设...

Jeff的专栏 5747

华为OD技术面真题 - Python开发 - 2

汇总华为OD技术面八股Python八股,高频技术真题并提供详细解答。

qq_45776114的博客 910

关于HttpClient重试策略的研究

https://www.cnblogs.com/kingszelda/p/8886403.html 一、背景 由于工作上的业务本人经常与第三方系统交互,所以经常会使用HttpClient与第三方进行通信。对于交易类的接口,订单状态是至关重要的。 这就牵扯到一系列问题: HttpClient是否有默认的重试策略?重试策略原理?如何禁止重试? 接下来,本文将从源码中探讨这些问题。源码下载地址:http://hc.apache.org/downloads.cgi,版本是4.5.5。 ...

yygr的博客 1370

Unreal5从入门到精通 专栏目录

欢迎来到“UE5从入门到精通”专栏!在这里,我们将带您踏上一段精彩的旅程,深入探索虚幻引擎5(Unreal Engine 5)的无限可能。不论您是游戏开发的新手,还是希望提升技能的开发者,这里都有适合您的内容。基础知识:了解虚幻引擎5的界面、功能和基本操作,为您的学习打下坚实的基础。项目实战:通过实际项目案例,帮助您从理论走向实践,真实体验游戏开发的每个环节。高级技巧:分享各种高级功能和技巧,包括蓝图、C++编程、材质编辑、光照和渲染等,让您能够创作出更具专业水准的作品。

TxNet 2987

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

cfx使用https配置

1、服务端启用ssl连接 先使用keytool工具生成服务端证书,如: keytool -genkey  -keyalg RSA -alias xxx.xx -keystore catest.keystore 然后生成客户信息证书,并导入信任的证书,如: keytool -import -alias xxx.xx -keystore client.keystore 最后向tom

2277

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

HttpClient 如何设置超时时间

HttpClient 如何设置超时时间 - 经典鸡翅 - 博客园

keep12moving的博客 2355

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

针对cxf实现webservice服务访问的basic认证方式的实现

最近,写一个接口功能,对方系统为了实现接口的访问安全,使用了接口访问认证的方式:basic认证方式;查阅了资料,webservice中客户端代码中实现basic的认证方式的实现逻辑,实现方案如下:在生成的webservice客户端调用中插入如下代码: // 添加basc 认证 IhelloService service = new HelloServiceImplService().getHelloServiceImplPort(); BindingProvider bp = (BindingProvide

weixin_42863291的博客 1533

Java开发必知:WebService客户端调用的5种常见方式

之前系统中使用到了webservice进行第三方通信,这里总结一下常见的5种客户端调用方式。 在此之前我们先简单搭建一个webservice服务端项目,发布一个webservice服务。我这里使用springboot快速搭建一个,项目结构如下: 创建一个springboot项目,导入maven依赖: <dependency> <groupId>org.proje...

Coder-文小白的博客 9944

使用cxf发布webservice接口,以及调用webservice接口

使用cxf发布webservice接口,以及调用webservice接口

咸鱼想睡觉 2091
上一篇: Client端使用CXF访问WebService
下一篇: Implementing an authentication supplier
Johnny__Tang
博客等级 码龄18年 9粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值