SOAP WebService实现WS-Security用户身份认证时间戳验证

ApacheCXF框架API实现了WS-Security协议,其中包括xml签名、用户令牌、时间戳等;

 

实现目标:在SOAP WebService的服务端实现客户端身份认证、时间戳形式的安全机制;(密钥加密及签名方式认证待续)

运行环境:apache-cxf-3.1.6、jdk1.7、tomcat7.0.68

 

cxf框架和spring高度集成,示例安全机制服务端基于spring框架,客户端调用可以使用或不使用spring框架;

对于客户端用户密码验证主要通过cxf框架的WSS4J拦截器实现,base64加密、解密过程本身由框架实现,用户只需要在服务端和客户端的拦截器实现方法中设置原始的用户名密码即可。

客户端发出请求前(请求出)拦截设置加密密码,服务端接收(请求入)后拦截解密验证密码。

 

服务端web.xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
	id="WebApp_ID" 
	version="3.0">
  <display-name>cxfjaxwssecurityserver1</display-name>  
	<context-param>
	      <param-name>contextConfigLocation</param-name>
	      <param-value>WEB-INF/beans.xml</param-value>
	</context-param>  
    <listener>
        <listener-class>                        org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>
      <servlet>
        <description>Apache CXF Endpoint</description>
        <display-name>cxf</display-name>
        <servlet-name>cxf</servlet-name>
        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>cxf</servlet-name>
        <url-pattern>/services/*</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>60</session-timeout>
    </session-config>  

</web-app>

 

服务端spring bean配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans 
	xmlns="http://www.springframework.org/schema/beans" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns:jaxws="http://cxf.apache.org/jaxws" 
	xmlns:soap="http://cxf.apache.org/bindings/soap" 
	xmlns:util="http://www.springframework.org/schema/util"
	xsi:schemaLocation=" 
	http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans.xsd 
	http://cxf.apache.org/bindings/soap 
	http://cxf.apache.org/schemas/configuration/soap.xsd 
	http://cxf.apache.org/jaxws 
	http://cxf.apache.org/schemas/jaxws.xsd 
	http://www.springframework.org/schema/util 
    http://www.springframework.org/schema/util/spring-util.xsd">	
	
   	
	<import resource="classpath:META-INF/cxf/cxf.xml"/>
   	<import resource="classpath*:META-INF/cxf/cxf-extension-*.xml" />  
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>     
  
	<bean id="logIn" class="org.apache.cxf.interceptor.LoggingInInterceptor" />
	<bean id="logOut" class="org.apache.cxf.interceptor.LoggingOutInterceptor" />
	<bean id="saajIn" class="org.apache.cxf.binding.soap.saaj.SAAJInInterceptor" />
	
	<bean id="mypasswdcallback" class="cxf.jaxws.basic.server.PasswdCallback"/>
	
	<bean id="wss4jin" class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">
		<constructor-arg>
			<map>
				<entry key="action" value="UsernameToken Timestamp"></entry>
				<entry key="passwordType" value="PasswordDigest"/>
				<entry key="passwordCallbackRef" >
					<ref  bean="mypasswdcallback"/>
				</entry>
			</map>			
		</constructor-arg>		
	</bean>
    
    <jaxws:endpoint id="bookinfoservice" address="/bookinfo" implementor="cxf.jaxws.basic.server.BookServiceImpl" > 		
		<jaxws:outInterceptors>
			<ref bean="logOut"/>			
		</jaxws:outInterceptors>
		
		<jaxws:inInterceptors>		
			<ref bean="logIn"/>
			<ref bean="saajIn"/>
			<ref bean="wss4jin"/>		
  	 	</jaxws:inInterceptors>
    
    </jaxws:endpoint>
  

</beans>

 服务端拦截器:

public class PasswdCallback implements CallbackHandler {

	@Override
	public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
		
		
		WSPasswordCallback pc = (WSPasswordCallback ) callbacks[0];
		
		if(pc.getIdentifier().equals("administrator")){
			pc.setPassword("merrick");
		}else{
			System.err.println("Password verified failed.");
		}
		

	}

}

 Webservice接口类、实现类、实体类:

@WebService( name="BookService", portName="BookServicePort")
public interface BookService {
	
	@WebMethod
	public String getOneBookInfo(DTOBean param);
	
	@WebMethod BookEntity getBookinfoEntity(DTOBean param);

}



public class BookServiceImpl implements BookService {
	
	@Resource
    WebServiceContext wsContext;

	@Override
	public String getOneBookInfo(DTOBean param) {

		String bookinfo = "<<A Tale of two citiest>>,2001,English";
		System.out.println("---Invoking getOneBookInfo, DTOBean: "+ param.getId() + "," + param.getName());
		
		return bookinfo;
	}

	@Override
	public BookEntity getBookinfoEntity(DTOBean param) {
		
		BookEntity be = new BookEntity();

		be.setAuthor("Mark Twen");
		be.setFirstpub("1778");
		be.setName("Tom's house");
		
		System.out.println("---Invoking getBookinfoEntity, DTOBean: "+ param.getId() + "," + param.getName());
		
		
		return be;
	}



}

 

public class BookEntity {
	
	String name;
	String author;
	String firstpub;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAuthor() {
		return author;
	}
	public void setAuthor(String author) {
		this.author = author;
	}
	public String getFirstpub() {
		return firstpub;
	}
	public void setFirstpub(String firstpub) {
		this.firstpub = firstpub;
	}

}

 客户端拦截器:

public class ClientPasswdCallback implements CallbackHandler {
	
	private Map<String,String> passwds = new HashMap<String,String>();
	
	public ClientPasswdCallback() {
		passwds.put("administrator", "merrick");
		
	}

	@Override
	public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {//交给wss4j API去加密(ws-security的实现,用户令牌验证)


		for (int i = 0; i < callbacks.length; i++) {
			WSPasswordCallback wsp = (WSPasswordCallback)callbacks[i];
			
			String pas = passwds.get(wsp.getIdentifier());
			
			if(pas!=null){
				wsp.setPassword(pas);
				return;
			}
		}
		

	}

}

WebService 客户端调用(无框架方式、spring方式)(客户端略):

(webservice客户端可根据WebService的wsdl url,采用cxf的wsdl2java工具生成)

	public static void clientwith_UserTokenAuth() throws Throwable {//success
/**
 * 带用户令牌验证的客户端
 * Spring配置
 * **/
		ApplicationContext  context = new ClassPathXmlApplicationContext(
                new String[] { "autoclient/test/client2.xml" });
		
	//	BookServiceImplService sv = new BookServiceImplService(u);
		BookService client = (BookService) context.getBean("client");
		
		DtoBean b = new DtoBean();
		b.setId(1);
		b.setName("a");	 
	//	
		
		String response = client.getOneBookInfo(b);
		
        System.out.println("Response: " + response);
        
        BookEntity response2 = client.getBookinfoEntity(b);
        
        System.out.println("Response: " + response2.getAuthor() + ", " + response2.getName() +", "+ response2.getFirstpub());		
	}
	/***无框架方式*/
	public static void clientwith_UserTokenAuth_withoutSpring() throws Throwable {//success
		Map<String, Object> outProps = new HashMap<String, Object>();
		
		outProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN +" "+ WSHandlerConstants.TIMESTAMP);//令牌+时间戳
		outProps.put(WSHandlerConstants.USER,	"administrator" );
		outProps.put(WSHandlerConstants.PASSWORD_TYPE,	WSConstants.PW_DIGEST );
		outProps.put(WSHandlerConstants.PW_CALLBACK_CLASS, "autoclient.test.ClientPasswdCallback");		
		
		JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
		factory.setServiceClass(cxfclient.jaxws.auto.BookService.class);
		// 设置ws访问地址
		factory.setAddress("http://localhost:8080/cxfjaxwssecurityserver1/services/bookinfo");
		factory.getOutInterceptors().add(new WSS4JOutInterceptor(outProps));
		//addAll(list);
		cxfclient.jaxws.auto.BookService service = (cxfclient.jaxws.auto.BookService) factory.create();
		DtoBean b = new DtoBean();
		b.setId(1);
		b.setName("a");	 
		String response = service.getOneBookInfo(b);		
		System.out.println(response);
	}

 

客户端安全机制带框架方式调用,spring配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns:jaxws="http://cxf.apache.org/jaxws"
	xmlns:soap="http://cxf.apache.org/bindings/soap" 
	xsi:schemaLocation="
             http://www.springframework.org/schema/beans
             http://www.springframework.org/schema/beans/spring-beans.xsd
           	http://cxf.apache.org/bindings/soap 
			http://cxf.apache.org/schemas/configuration/soap.xsd 
             http://cxf.apache.org/jaxws 
             http://cxf.apache.org/schemas/jaxws.xsd">	

	
	<bean id="logIn"  class="org.apache.cxf.interceptor.LoggingInInterceptor" />
	<bean id="logOut" class="org.apache.cxf.interceptor.LoggingOutInterceptor" />
	<bean id="saajOut" class="org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor" />
	
	<bean id="wss4jout" class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor">
		<constructor-arg>
			<map>
				<entry key="action" value="UsernameToken Timestamp" />
				<entry key="passwordType" value="PasswordDigest" />
				<entry key="user" value="administrator" />
				<entry key="passwordCallbackClass" value="autoclient.test.ClientPasswdCallback"/>			
			</map>		
		</constructor-arg>
	</bean>

	<jaxws:client id="client" 
		serviceClass="cxfclient.jaxws.auto.BookService" 
		address="http://localhost:8080/cxfjaxwssecurityserver1/services/bookinfo">
	
		<jaxws:inInterceptors>		
			<ref bean="logIn"/>
		</jaxws:inInterceptors>
	
		<jaxws:outInterceptors>
			<ref bean="logOut"/>	
			<ref bean="saajOut"/>	
			<ref bean="wss4jout"/>		
		</jaxws:outInterceptors>
	
	</jaxws:client>    
    
</beans>

 

 

WEBService-SOAP协议 SOAP协议 0:开始: 最近需要处理老项目重构。 旧的webservice使用axis2 +springframework框架.现在需更新为 CXF+springBoot 框架。 在操作之前需要对soap协议进行简单了解 1.概念: 官方 : 简单对象访问协议是交换数据的一种协议规范,是一种轻量的、简单的、基于XML(标准通用标记语言下的一个子集)的协议,它被设计成在WEB上交换结构化的和固化的信息。 理解: 用xml的形式(io/String)传输数据的一种协议。一个soap协议本身是一个xml文档,以 阅读详情

相关推荐

C#调用WebService最新实践:.NET 6+下替代Add Service Reference的方案

WebService是一种基于SOAP协议的早期Web服务标准,广泛应用于政务、金融等需强契约约束的系统集成场景。其核心原理是通过WSDL描述服务接口,经XML序列化实现跨平台通信。在.NET Core 3.1及更高版本中,传统`System.Web.Services`已废弃,`dotnet-svcutil`成为生成强类型客户端的标准工具,它依托`System.ServiceModel`与`XmlSerializer`保障对老旧ASMX接口的兼容性。该技术具备轻量、可控、可异步、免配置等工程优势,适用于老系

weixin_30225755的博客 347

WebService发布basic auth验证以及测试连接

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33991418的博客 2014

Win10网络图标消失,网络图标变成灰色,打开网络设置闪退等问题解决

介绍 主要解决如下问题 网络图标消失 常用方法配置中出现的网络图标变成灰色没有办法打开 打开网络和Internet闪退 错误提示`网络发现已关闭。网络计算机和设备不可见。请启动网络和共享中心的网络发现。 连不上网,诊断结果为 依赖服务或组无法启动 这个问题大概率通过重装系统不能解决,请大家谨慎测试之后最后选择重装这个路线。 方法1:这一步一定要做(卸载三方软件) 把360安全卫士,软件管家这些东西都卸载掉。 我的问题一开始就是这个软件引起的,可能他检测到我还给台式机配了无线网卡,然后就把有线网络的一些

呆呆象呆呆的博客 3万+

对于Webservice SOAP请求中,需要进行Basic认证和动态获取用户名密码办法

import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.net.Authenticator; import java.net.PasswordAuthentication; /** * @author lihuaiyu * @date 2018/1/15 * Email : 18633533023@163....

lihuaiyu1234的博客 8505

告别MRT!用ArcGIS脚本批量处理MODIS数据,从HDF到NDVI/ET成品图全流程(附Python代码)

本文详细介绍了使用ArcGIS Python脚本自动化处理MODIS数据的全流程,从HDF文件提取到生成NDVI/ET成品图。通过优化子数据集提取、智能镶嵌策略和投影转换等核心步骤,大幅提升处理效率,告别传统MRT工具的手工操作。附带的Python代码可直接应用于实际项目,特别适合批量处理大规模遥感数据。

weixin_30872337的博客 219

个人信息保护合规审计人员(中级)能力测试试卷

本文是关于个人信息保护合规审计的考试指南,包含选择题、判断题、简答题和案例分析题。选择题考察《个人信息保护法》的关键条款,如敏感信息处理、跨境传输、委托处理等合规要求。判断题测试对个人信息处理规则的理解,如撤回同意、公开信息处理等。简答题要求阐述审计流程、个人权利、委托处理义务等内容。案例分析题以互联网企业为例,分析违规行为并提出整改建议,涉及数据收集、第三方共享、自动化决策等问题。全文旨在帮助中级审计人员掌握个人信息保护的法律规定和审计实务,提升合规审计能力。

qq_41525079的博客 547

java身份认证_Java Web Service客户端基本身份验证

Java Web Service客户端基本身份验证我在Glassfish之上创建了一个JAX-WS Web服务,它需要基本的HTTP身份验证。现在,我想为该Web服务创建一个独立的Java应用程序客户端,但是我不知道如何传递用户名和密码。它可以与Eclipse的Web Service资源管理器一起使用,并检查连接线,我发现了这一点:POST /SnaProvisioning/SnaProvisio...

weixin_35473090的博客 938

STM32F103模拟SSI时序解析:实现高精度绝对式编码器位置读取

本文详细解析了如何在STM32F103微控制器上通过软件模拟SSI协议时序,实现高精度绝对式编码器的位置读取。文章从项目驱动出发,深入剖析了SSI通信原理、硬件电平转换连接、核心软件模拟代码实现及关键时序参数调试方法,并提供了使用示波器进行波形对齐与优化的实战指南,为成本敏感型工业控制与机器人项目提供了高性价比的解决方案。

weixin_29196315的博客 141

java soap协议认证,具有NTLM身份验证的SOAP Web服务的Java客户端

I spent many days and nights trying to find a proper Java framework that could connect to Microsoft Dynamics CRM which uses Negotiate/NTLM authentication. I tried all existing suggestions on Stackover...

weixin_36210213的博客 276

华为OD面试八股真题 - 操作系统 - 1

华为OD技术面,操作系统相关八股真题提供详细解答,这篇博客主要涉及于进程和线程相关知识点

qq_45776114的博客 1634

YOLOv8融合HAttention:激活更多像素的注意力机制科研实践指南

HAttention通过层级化像素激活与融合的设计,为YOLOv8的像素级特征利用能力带来了质的飞跃。从原理理解到代码实现,再到集成调优,每一步都是科研中“解决像素信息遗漏难题”的具体实践。如果你在实验中发现某类细节或大尺度目标的检测仍有不足,可以尝试结合数据增强(如随机裁剪、多尺度训练)来强化模型对像素特征的学习能力。科研的价值在于不断挖掘技术的潜力,希望这份指南能真正帮你在目标检测的像素级特征利用领域找到新的突破点,祝你在科研探索中持续收获创新与成长。

FJN110的博客 106

WEBSERVICE中的SOAP安全认证

服务器端(包括设计器生成的代码)Imports SystemImports System.Web.ServicesImports System.Web.Services.Protocols _ _Public Class soapserviceInherits System.Web.Services.WebServicePublic Class MySoapHeaderInherits So

kevin521的专栏 1248

最小二乘拟合圆:使用拉格朗日乘子法

在本文中,我们将探讨如何使用拉格朗日乘子法来进行最小二乘拟合,并将其应用于拟合一个空间圆。首先,我们需要定义问题。给定一组二维或三维数据点,我们的目标是找到一个圆,使得这些数据点到圆的距离的平方和最小。为了找到最小值,我们需要计算拉格朗日函数的偏导数,并令其等于零。通过解决优化问题,我们可以找到最佳拟合的圆,以最小化数据点到圆的距离的平方和。其中,(x, y) 是圆心的坐标,r 是圆的半径,(xi, yi) 是数据点的坐标。其中,g(x, y, r) = 0 是约束条件,C 是常数,λ 是拉格朗日乘子。

TechProX的博客 475

java webservice用户验证_java webservice 用户验证 (服务端 + 客户端)

说明:在网上找了一堆 handler验证的东东,试验了一下,没成功。现在换了一种方式:在 tomcat的配置文件中添加用户角色和用户信息然后在 webservice的项目配置文件中增加对应的角色。从而达到 用户验证的目的。开发环境: MyEclipse 10, Tomcat 7参考:http://www.fengfly.com/plus/view-210099-1.html先晒一下效果图:以下是具...

weixin_35089715的博客 702

即梦(Dreamina)技术浅析(六):多模态生成模型

多模态生成模型的目标是结合不同模态的数据(如文本和图像),生成新的视觉内容。其核心思想是利用文本描述引导图像或视频的生成过程,使得生成结果能够准确反映用户的意图。

m0_75253143的博客 1335

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

webService----wss4j+cxf实现WS-Security(基于UsernameToken)

分享一下wss4j+cxf基于UsernameToken的安全验证。名词解释:             cxf         : apache下的一个开源项目,用于发布webservice。      WSS4J  : Web Services Security for Java.  废话少说,直接上代码。    1. 首先,需要导入cxf中的所有jar包,及wss4j中的所有jar包与l...

mxdxm8899的专栏 925

Camera2Demo

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

Webservice实现WS-Security(XFire)

[color=blue]关键字:[/color]基于XFire实施WS-Security 说明:附件是带有截图的完整文章,很高兴分享给大家。 概述 Web Service是安全的吗?鉴于安全性涉及诸多方面(例如身份验证和授权、数据隐私和完整性等),而 SOAP 规范中根本没有提及安全性这一事实,所以我们不难理解人们为什么认为答案是 否定的。 很少有不需要某种形式的安...

赵士杰的博客 348

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

使用https访问带有SOAP协议头用户验证的webservice接口

使用https访问带有SOAP协议头用户验证的webservice接口 1,添加所需jar包 https://download.csdn.net/download/weixin_42846140/13128960 2,相关代码 调用接口的方法,接口是参数是xml格式 /** * 根据参数请求接口对于方法 * @param methodName 请求的方法名 * @param requestXml 请求参数 * @return */ public static String getExp

weixin_42846140的博客 857

onvif server端鉴权函数

另外,客户端发过来的密码是加密的,具体是怎么加密的请参阅官方文档,这里直接用相应的函数实现与后端密码对比。鉴权的原理:根据客户端发过来的账号密码,监测是否与服务端设置的账号密码是否正确。客户端测试软件:ONVIF Device Manager V2.2.250。客户端写错账号,或者不填,或者写错密码,都是可以提示错误的。

zanglengyu的专栏 1202

Onvif用户验证之gSOAP插件wsseapi调用实现

一、  原理 Onvif中实现用户验证的方式主要使用用户名令牌认证(Usernametoken Authentication,以下简称usernametoken方式)。Usernametoken方式与basic方式不同的地方,在于后者会把用户名和密码以摘要(digest)的形式,置于HTTP信息头,而前者则把用户名以明文的形式、密码以明文或者摘要的形式,嵌入到一段XML文本中,再置于SOAP消息

tongxinxiao的专栏 1万+

ONVIF Server 鉴权实现代码(服务端)

ONVIF鉴权实现代码 生成gSOAP框架代码,这个网上有很多教程,需要加入很多文件,并且需要openssl库。加入需要鉴权的文件和openssl库以后,只需要加每个接口中加入鉴权操作的代码,调用的时候就能实现鉴权。 ONVIF的鉴权分两种: HTTP Digest 和 WS-Username Token 在ONVIF Device Test Tool上可以对两种鉴权分别进行测试。 authenticate.h #ifndef __AUTHENTICATE_H__ #define __AUTHENTICAT

duapple的博客 3680

Java笔记-基于Spring Boot的SOAP双向SSL认证及WS-Security

这里服务端开放了简单的SOAP的API,但是想获取数据时需要双向SSL以及WS-Security签名。 其中对应的xsd文件如下: <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://spring.io/guides/gs-producing-web-service" targetNamespace="http://spring.io/guides/gs-producing-web

IT1995的博客 2400

如何使用soapUI发送包含wss认证请求

什么是wss认证?wss全称是WebService Security。对于wss认证详细参考以下链接: https://www.oasis-open.org/committees/download.php/16782/wss-v1.1-spec-os-UsernameTokenProfile.pdfhttps://www.oasis-open.org/committees/download.php/16782/wss-v1.1-spec-os-UsernameTokenProfile.pdf ...

青春有块盒子的地 2461

带有鉴权字段的onvif框架代码生成

一、生成带有鉴权字段的onvif框架代码        之前已在ubuntu12.04LTS上安装了gSOAP2.8.19. 注意使用此流程生成完全框架的时候需要gsoap已经安装在了linux系统中否则会出现一些奇怪的问题,故再使用的时候需先安装gsoap        新建一个文件夹,从gSOAP2.8.19的安装目录中找到typemap.dat将其与从http://www.onv

Gaoy9303的博客 2139

java Service类设置webservice 基本认证(Basic Authentication)

基本认证是一种简单的认证方式,客户端将用户名和密码以 Base64 编码的形式放在请求头中发送给服务器。

lxz458912769的博客 369

cxf+spring实现ws-security的数字证书验证方式

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34416649的博客 189
上一篇: 自定义struts2 plugin(jasper-plugin扩展)
下一篇: SOAP WebService以CXF实现WS-Security之xml签名及加密
johnsearcher
博客等级 码龄17年 0粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值