java生成验证码

Java生成图片验证码 通过原生Java实现验证码的生成 前言:要看懂本文,你至少得会一些基础JavaScript,JavaWeb,JSP才可以。 1、图片验证码生成的工具类(生成的验证码为字母和数字的随机组合,区分大小写) import java.awt.*; import java.awt.image.BufferedImage; import java.util.Random; /** * 验证码生成器 */ public class VerificationCodeGenerator { //图片宽 阅读详情

JAVA代码:

AuthImage类:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import java.io.IOException; 
 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.servlet.http.HttpSession;
 
/**
  * <p><b>AuthImage Description:</b> (验证码)</p>
  * <b>DATE:</b> 2016年6月2日 下午3:53:12
  */
public class AuthImage extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet { 
     static final long serialVersionUID = 1L; 
   
     public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
         response.setHeader( "Pragma" , "No-cache" ); 
         response.setHeader( "Cache-Control" , "no-cache" ); 
         response.setDateHeader( "Expires" , 0 ); 
         response.setContentType( "image/jpeg" ); 
           
         //生成随机字串 
         String verifyCode = VerifyCodeUtils.generateVerifyCode( 4 ); 
         //存入会话session 
         HttpSession session = request.getSession( true ); 
         //删除以前的
         session.removeAttribute( "verCode" );
         session.setAttribute( "verCode" , verifyCode.toLowerCase()); 
         //生成图片 
         int w = 100 , h = 30 ; 
         VerifyCodeUtils.outputImage(w, h, response.getOutputStream(), verifyCode); 
   
     } 
}

VerifyCodeUtils类,生成图片流

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.Random;
 
import javax.imageio.ImageIO;
/**
  * <p><b>VerifyCodeUtils Description:</b> (验证码生成)</p>
  * <b>DATE:</b> 2016年6月2日 下午3:53:34
  */
public class VerifyCodeUtils{
     
     //使用到Algerian字体,系统里没有的话需要安装字体,字体只显示大写,去掉了1,0,i,o几个容易混淆的字符
     public static final String VERIFY_CODES = "23456789ABCDEFGHJKLMNPQRSTUVWXYZ" ;
     private static Random random = new Random();
 
 
     /**
      * 使用系统默认字符源生成验证码
      * @param verifySize    验证码长度
      * @return
      */
     public static String generateVerifyCode( int verifySize){
         return generateVerifyCode(verifySize, VERIFY_CODES);
     }
     /**
      * 使用指定源生成验证码
      * @param verifySize    验证码长度
      * @param sources   验证码字符源
      * @return
      */
     public static String generateVerifyCode( int verifySize, String sources){
         if (sources == null || sources.length() == 0 ){
             sources = VERIFY_CODES;
         }
         int codesLen = sources.length();
         Random rand = new Random(System.currentTimeMillis());
         StringBuilder verifyCode = new StringBuilder(verifySize);
         for ( int i = 0 ; i < verifySize; i++){
             verifyCode.append(sources.charAt(rand.nextInt(codesLen- 1 )));
         }
         return verifyCode.toString();
     }
     
     /**
      * 生成随机验证码文件,并返回验证码值
      * @param w
      * @param h
      * @param outputFile
      * @param verifySize
      * @return
      * @throws IOException
      */
     public static String outputVerifyImage( int w, int h, File outputFile, int verifySize) throws IOException{
         String verifyCode = generateVerifyCode(verifySize);
         outputImage(w, h, outputFile, verifyCode);
         return verifyCode;
     }
     
     /**
      * 输出随机验证码图片流,并返回验证码值
      * @param w
      * @param h
      * @param os
      * @param verifySize
      * @return
      * @throws IOException
      */
     public static String outputVerifyImage( int w, int h, OutputStream os, int verifySize) throws IOException{
         String verifyCode = generateVerifyCode(verifySize);
         outputImage(w, h, os, verifyCode);
         return verifyCode;
     }
     
     /**
      * 生成指定验证码图像文件
      * @param w
      * @param h
      * @param outputFile
      * @param code
      * @throws IOException
      */
     public static void outputImage( int w, int h, File outputFile, String code) throws IOException{
         if (outputFile == null ){
             return ;
         }
         File dir = outputFile.getParentFile();
         if (!dir.exists()){
             dir.mkdirs();
         }
         try {
             outputFile.createNewFile();
             FileOutputStream fos = new FileOutputStream(outputFile);
             outputImage(w, h, fos, code);
             fos.close();
         } catch (IOException e){
             throw e;
         }
     }
     
     /**
      * 输出指定验证码图片流
      * @param w
      * @param h
      * @param os
      * @param code
      * @throws IOException
      */
     public static void outputImage( int w, int h, OutputStream os, String code) throws IOException{
         int verifySize = code.length();
         BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
         Random rand = new Random();
         Graphics2D g2 = image.createGraphics();
         g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
         Color[] colors = new Color[ 5 ];
         Color[] colorSpaces = new Color[] { Color.WHITE, Color.CYAN,
                 Color.GRAY, Color.LIGHT_GRAY, Color.MAGENTA, Color.ORANGE,
                 Color.PINK, Color.YELLOW };
         float [] fractions = new float [colors.length];
         for ( int i = 0 ; i < colors.length; i++){
             colors[i] = colorSpaces[rand.nextInt(colorSpaces.length)];
             fractions[i] = rand.nextFloat();
         }
         Arrays.sort(fractions);
         
         g2.setColor(Color.GRAY); // 设置边框色
         g2.fillRect( 0 , 0 , w, h);
         
         Color c = getRandColor( 200 , 250 );
         g2.setColor(c); // 设置背景色
         g2.fillRect( 0 , 2 , w, h- 4 );
         
         //绘制干扰线
         Random random = new Random();
         g2.setColor(getRandColor( 160 , 200 )); // 设置线条的颜色
         for ( int i = 0 ; i < 20 ; i++) {
             int x = random.nextInt(w - 1 );
             int y = random.nextInt(h - 1 );
             int xl = random.nextInt( 6 ) + 1 ;
             int yl = random.nextInt( 12 ) + 1 ;
             g2.drawLine(x, y, x + xl + 40 , y + yl + 20 );
         }
         
         // 添加噪点
         float yawpRate = 0 .05f; // 噪声率
         int area = ( int ) (yawpRate * w * h);
         for ( int i = 0 ; i < area; i++) {
             int x = random.nextInt(w);
             int y = random.nextInt(h);
             int rgb = getRandomIntColor();
             image.setRGB(x, y, rgb);
         }
         
         shear(g2, w, h, c); // 使图片扭曲
 
         g2.setColor(getRandColor( 100 , 160 ));
         int fontSize = h- 4 ;
         Font font = new Font( "Algerian" , Font.ITALIC, fontSize);
         g2.setFont(font);
         char [] chars = code.toCharArray();
         for ( int i = 0 ; i < verifySize; i++){
             AffineTransform affine = new AffineTransform();
             affine.setToRotation(Math.PI / 4 * rand.nextDouble() * (rand.nextBoolean() ? 1 : - 1 ), (w / verifySize) * i + fontSize/ 2 , h/ 2 );
             g2.setTransform(affine);
             g2.drawChars(chars, i, 1 , ((w- 10 ) / verifySize) * i + 5 , h/ 2 + fontSize/ 2 - 10 );
         }
         
         g2.dispose();
         ImageIO.write(image, "jpg" , os);
     }
     
     private static Color getRandColor( int fc, int bc) {
         if (fc > 255 )
             fc = 255 ;
         if (bc > 255 )
             bc = 255 ;
         int r = fc + random.nextInt(bc - fc);
         int g = fc + random.nextInt(bc - fc);
         int b = fc + random.nextInt(bc - fc);
         return new Color(r, g, b);
     }
     
     private static int getRandomIntColor() {
         int [] rgb = getRandomRgb();
         int color = 0 ;
         for ( int c : rgb) {
             color = color << 8 ;
             color = color | c;
         }
         return color;
     }
     
     private static int [] getRandomRgb() {
         int [] rgb = new int [ 3 ];
         for ( int i = 0 ; i < 3 ; i++) {
             rgb[i] = random.nextInt( 255 );
         }
         return rgb;
     }
 
     private static void shear(Graphics g, int w1, int h1, Color color) {
         shearX(g, w1, h1, color);
         shearY(g, w1, h1, color);
     }
     
     private static void shearX(Graphics g, int w1, int h1, Color color) {
 
         int period = random.nextInt( 2 );
 
         boolean borderGap = true ;
         int frames = 1 ;
         int phase = random.nextInt( 2 );
 
         for ( int i = 0 ; i < h1; i++) {
             double d = ( double ) (period >> 1 )
                     * Math.sin(( double ) i / ( double ) period
                             + ( 6 .2831853071795862D * ( double ) phase)
                             / ( double ) frames);
             g.copyArea( 0 , i, w1, 1 , ( int ) d, 0 );
             if (borderGap) {
                 g.setColor(color);
                 g.drawLine(( int ) d, i, 0 , i);
                 g.drawLine(( int ) d + w1, i, w1, i);
             }
         }
 
     }
 
     private static void shearY(Graphics g, int w1, int h1, Color color) {
 
         int period = random.nextInt( 40 ) + 10 ; // 50;
 
         boolean borderGap = true ;
         int frames = 20 ;
         int phase = 7 ;
         for ( int i = 0 ; i < w1; i++) {
             double d = ( double ) (period >> 1 )
                     * Math.sin(( double ) i / ( double ) period
                             + ( 6 .2831853071795862D * ( double ) phase)
                             / ( double ) frames);
             g.copyArea(i, 0 , 1 , h1, 0 , ( int ) d);
             if (borderGap) {
                 g.setColor(color);
                 g.drawLine(i, ( int ) d, i, 0 );
                 g.drawLine(i, ( int ) d + h1, i, h1);
             }
 
         }
 
     }
     public static void main(String[] args) throws IOException{
         File dir = new File( "F:/verifies" );
         int w = 200 , h = 80 ;
         for ( int i = 0 ; i < 50 ; i++){
             String verifyCode = generateVerifyCode( 4 );
             File file = new File(dir, verifyCode + ".jpg" );
             outputImage(w, h, file, verifyCode);
         }
     }
}

 

web.xml写法

?
1
2
3
4
5
6
7
8
9
<!-- 登录验证码 -->
  <servlet> 
     <servlet-name>AuthImage</servlet-name> 
     <servlet- class >com.toft.widgets.login.AuthImage</servlet- class > 
     </servlet> 
     <servlet-mapping> 
     <servlet-name>AuthImage</servlet-name> 
     <url-pattern>/authImage</url-pattern> 
  </servlet-mapping>

JSP 页面写法,有刷新操作

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!-- 验证码 -->
<tr>
    <td nowrap width= "437" ></td>
     <td>
         <img id= "img" src= "${ctx}/authImage" />
         <a href= '#' onclick= "javascript:changeImg()" style= "color:white;" ><label style= "color:white;" >看不清?</label></a>
     </td>
  </tr>
  
  
  <!-- 触发JS刷新-->
  <script type= "text/javascript" >
     function changeImg(){
         var img = document.getElementById( "img" ); 
         img.src = "${ctx}/authImage?date=" + new Date();;
     }
</script>
别光看原理图了!手把手教你用Altium Designer搞定STM32F411最小系统的PCB布局(附电源/晶振/复位电路实战) 本文详细介绍了使用Altium Designer进行STM32F411最小系统PCB布局的实战技巧,涵盖电源分配网络优化、高速信号布线及系统级布局策略。通过规范的工程结构建立、关键设计规则预设和核心电路模块布局,帮助工程师提升PCB设计效率与信号完整性。特别针对STM32最小系统的电源、晶振和复位电路提供了专业解决方案。 阅读详情

相关推荐

在MacBook M1/M2上,手把手教你打包包含嵌入模型的RagFlow Docker镜像(避坑指南)

本文详细指导如何在MacBook M1/M2上构建ARM64架构的RagFlow Docker镜像,涵盖环境准备、依赖处理、镜像构建及性能优化全流程。特别针对Apple Silicon芯片的兼容性问题提供解决方案,帮助开发者高效完成本地开发环境搭建。

weixin_26908317的博客 242

java生成图形验证码

随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)、博主微信(guyun297890152)、QQ技术交流群(183198395)。 首先,需要生成验证码字符串,方式很多,下面提供一种,根据指定源的方式来生成验证码 /** * 使用系统默认字符源生成验证码 * * @param verifySize * ...

孤云博客 4981

django drf 框架知识点(一)——serializer序列化器_用法全解

【django drf】序列化器:别名设置,全部参数序列化,自定义字段,只读只写,部分更新

qq_59344127的博客 1338

VerifyCodeUtil工具类Java-验证码图片生成器-用于验证码图片生成-适用于任何界面显示

1.原理分析:通过Java的画布组件按照特定规则画出图片,在显示到界面上去。 效果如图所示: 2.我的验证码生成器 代码: package alian.utils; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import jav...

alian 2568

机器视觉最全面试题总结

空洞卷积(Atrous Convolution)也叫做膨胀卷积、扩张卷积,最初的提出是为了解决图像分割在用下采样(池化、卷积)增加感受野时带来的特征图缩小,后再上采样回去时造成的精度上的损失。空洞卷积通过引入了一个扩张率的超参数,该参数定义了卷积核处理数据时各值的间距。可以在增加感受野的同时保持特征图的尺寸不变,从而代替下采样和上采样a. 是普通的卷积过程(dilation rate = 1),卷积后的感受野为3b. 是dilation rate = 2的空洞卷积,卷积后的感受野为5。

@bangbang的博客 9210

CMake安装grpc生成gRPCTargets.cmake文件

以下是安装语句: cd grpc_folder git submodule update --init cmake .. make -j 4 sudo make install 然而编写依赖gRPC的程序,发现无法调用gRPC的CMake文件,错误提示如下所示: include could not find load file: /usr/local/lib/cmake/g...

2329

java实现验证码

转自:http://www.cnblogs.com/jianlun/articles/5553452.html AuthImage类: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

zhuoni的博客 405

WPF数据绑定Binding对数据的转换与效验(四)

Binding的作用就是架在Source与Target之间的桥梁,数据可以在这座桥梁的帮助下来流通。就像现实世界中的桥梁会设置一些关卡进行安检一样,Binding这座桥上也可以设置关卡对数据的有效性进行检验,不仅如此,当Binding的两端要求使用不同的数据类型时,我们还可以为数据设置转换器。Binding用于数据有效性检验的关卡是它的ValidationRules属性,用于数据类型转换的关卡是它的Converter属性。

qq_30725967的博客 1630

VerifyCodeUtil 验证码工具类的使用

java 验证码工具类的使用

Lzysnd的博客 1461

STM32 HAL SDADC DMA

由于项目需要使用STM32F373单片机的SDADC功能对电位计进行检测,网上资料比较少,踩了很多坑,下面进行总结。

weixin_44597885的博客 1196

C#中通过Mapster实现轻量级高效对象映射器:从零到精通

本文介绍了.NET生态中高性能对象映射库Mapster的完整使用指南。从基础安装(通过NuGet包)到快速入门示例,展示了如何实现简单对象映射。进一步讲解了自定义映射规则、命名不一致属性的处理方式,以及如何在ASP.NET Core中集成Mapster服务。针对复杂场景,详细解析了嵌套对象映射的配置技巧,并提供了性能优化方案(如预编译映射器)和调试技巧(启用调试模式、捕获映射异常)。通过完整的代码实践,帮助开发者高效解决从基础到高级的对象映射需求。

墨夶的博客 742

验证码生成与验证

​---controller /**       * 生成验证码       */      @RequestMapping(value = "showVerifyCode", produces = "image/jpeg")      public void showVerifyCode(HttpServletRequest request, HttpS

gghhz的博客 501

Allegro如何用自带的功能将线段变成铜皮操作指导

在做PCB设计的时候,有时根据设计需要将线段变成铜皮,可以借助辅助工具来实现这一操作,但是Allegro自身也自带这个功能,如下图。勾选Delete original objects。如何用自带的功能将线段变成铜皮操作指导。勾选Convert to shape,需要把这段走线变成铜皮。

weixin_54787054的博客 2946

java 验证码生成_Java生成验证码并进行验证

一、实现思路使用BufferedImage用于在内存中存储生成的验证码图片使用Graphics来进行验证码图片的绘制,并将绘制在图片上的验证码存放到session中用于后续验证最后通过ImageIO将生成的图片进行输出通过页面提交的验证码和存放在session中的验证码对比来进行校验二、生成验证码页面通过访问servlet来生成验证码,servlet中的代码如下:package org.test;...

weixin_31067561的博客 1055

jre9下载 jdk9

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

Statistics and Machine Learning Toolbox

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

java生成验证码登录,生成验证码

这里写了一个生成验证码的demo 前台可以访问该servlet页面显示验证码 验证码 后台存的session名称为vCode 判断验证码是否正确时可以直接调用 前台通过 这里你就自己引入jq吧 <img src="ValidateCodeServle" id="src"> <a onclick="code()">看不清楚,换一张</a> <script...

不负好时光的博客 1109

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Java 生成 验证码图片

如何用JAVA生成随机验证码图片

刘伟佳的博客 9371

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

java 生成校验验证码_java生成验证码并进行验证

一实现思路使用BufferedImage用于在内存中存储生成的验证码图片使用Graphics来进行验证码图片的绘制,并将绘制在图片上的验证码存放到session中用于后续验证最后通过ImageIO将生成的图片进行输出通过页面提交的验证码和存放在session中的验证码对比来进行校验二、生成验证码页面通过访问servlet来生成验证码,servlet中的代码如下package org.test;im...

weixin_35143292的博客 1216

java程序生成验证码

java程序生成验证码 验证码工具类 package cn.mldn.lxh.xmz.common; import javax.imageio.ImageIO; import java.awt.*; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import java.io.IOExceptio

weixin_43477950的博客 371

Java 实现生成验证码以及验证

代码包含生成验证码,验证验证码,以及验证码的失效时间 标题代码包含生成验证码,验证验证码,以及验证码的失效时间生成验证码和验证验证码的Controller生成验证码类 生成验证码和验证验证码的Controller package com.example.security.zmain.generateImg; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.a

WXN的博客 1012

Java随机生成验证码

/1.可以把所有的大写字母,小写字母都放到一个数组当中。内容:可以是小写字母,也可以是大写字母,还可以是数字。//在ASCII码表中A---65。//再让最后一个元素跟前面的随机位置的元素进行交换。其中数字只有1位,但是可以出现在任意的位置。//思考,我们把7放到前面,修改了字符串的内容。//3.生成一个0~9之间的随机数拼接到最后。//交换完毕之后再变成字符串就可以了。//把生成的验证码先变成一个字符数组。//利用ASCII码表。//2.从数组中随机获取4次。//定义方法将数字放置在随机位置中。

weixin_72700368的博客 2167

java图形验证码如何生成_Java 图形验证码的生成和验证

1. 导入第三方包,主要用来生成图形验证码cn.hutoolhutool-all4.6.82. 获取生成的图形验证码图片流,验证图片验证码package com.JXWorkApi.controller;import cn.hutool.captcha.CaptchaUtil;import cn.hutool.captcha.ShearCaptcha;import com.JXWork.resul...

weixin_30599809的博客 1149

Java 后台生成验证码

Java 后台生成图片验证码 开发工具与关键技术:java、 elipse2019、jdk1.8 作者:Amewin 撰写时间:2019年8月17日 介绍 由于很多是时候,我们需要在后台生成验证码,用于前台登陆使用,之所以为什么写在后台是因为相对于前台 生成较于安全。 验证码这块 我在Web ASP.NET 也有所涉及,在这里,我只提供工具类,相关的调用请自行结合框架使用。 /** ...

Amewin的博客 1078

java生成验证码工具类_Java生成图形验证码工具类

生成验证码效果ValidateCode.java 验证码生成类package cn.dsna.util.images;import java.awt.Color;import java.awt.Font;import java.awt.Graphics2D;import java.awt.image.BufferedImage;import java.io.FileOutputStream;imp...

weixin_33640562的博客 693

Java生成验证码图片

 Java生成验证码图片网络上存在的两种生成验证码的方法:1. ImageIO.write(); ImageIO.write(image4, "PNG", out); 缺点:太慢,生成很小的图片,需要800-2000毫秒;2. JPEGImageEncoder encoder.encode();//        JPEGImageEncoder encoder = JPEGCodec.cre

bohemia的专栏 4989

Java图片验证码简单生成

生成验证码图片主要通过Java AWT中的Graphics对象画图操作,实际操作中,Controller接口可以接收前端随机参数,并保存该参数和生成的验证码的缓存关系,当提交表单时,用于校验表单中的随机码和验证码。 下面通过单元测试简单调试验证码图片的生成。 package com.study.demo.util; import org.junit.Test; import javax.ima...

小熙的博客 5万+

java验证码生成代码_java实现简单验证码生成

本文实例为大家分享了java验证码生成的具体代码,供大家参考,具体内容如下简单验证码java实现--servlet类生成 验证码img,并写入session老师给的源码,在此做个记录,简单验证码,java绘图在此鸣谢并附上源码:.//package app61;import java.io.*;import java.util.*;import com.sun.image.codec.jpeg.*...

weixin_34475062的博客 714
上一篇: KeyListener
下一篇: http
java_5666666
博客等级 码龄9年 6粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值