JAVA技术:代码实现验证码图片的生成

本文涉及的产品
函数计算FC,每月15万CU 3个月
简介:

Servlet生成验证码图片

1   package  com.logcd.servlet;  
2    
3   import  java.awt.Color;  
4   import  java.awt.Font;  
5   import  java.awt.Graphics2D;  
6   import  java.awt.image.BufferedImage;  
7   import  java.util.Random;  
8   import  javax.imageio.ImageIO;  
9   import  javax.servlet. *
10   import  java.io. *
11   import  javax.servlet.http. *
12   import  javax.servlet.ServletException; 
13   import  javax.servlet.http.HttpServlet; 
14   import  javax.servlet.http.HttpServletRequest; 
15   import  javax.servlet.http.HttpServletResponse; 
16   
17  @SuppressWarnings( " serial "
18   public   class  RandomCode  extends  HttpServlet { 
19   
20       public   void  doGet(HttpServletRequest request, HttpServletResponse response) 
21               throws  ServletException, IOException { 
22   
23           this .doPost(request, response); 
24      } 
25   
26       public   void  doPost(HttpServletRequest request, HttpServletResponse response) 
27               throws  ServletException, IOException { 
28   
29           //  验证码图片的宽度。 
30           int  width  =   70
31           //  验证码图片的高度。 
32           int  height  =   30
33          BufferedImage buffImg  =   new  BufferedImage(width, height,  34                  BufferedImage.TYPE_INT_RGB); 
35          Graphics2D g  =  buffImg.createGraphics(); 
36   
37           //  创建一个随机数生成器类。 38         Random random = new Random(); 39  40          //  设定图像背景色(因为是做背景,所以偏淡) 
41          g.setColor(getRandColor( 200 250 )); 
42          g.fillRect( 0 0 , width, height); 
43           //  创建字体,字体的大小应该根据图片的高度来定。 
44          Font font  =   new  Font( " Times New Roman " , Font.HANGING_BASELINE,  28 );  45           //  设置字体。 
46          g.setFont(font);  47    48           //  画边框。 49         g.setColor(Color.BLACK); 50         g.drawRect(0, 0, width - 1, height - 1); 
51           //  随机产生155条干扰线,使图象中的认证码不易被其它程序探测到。 
52   // g.setColor(Color.GRAY); 
53          g.setColor(getRandColor( 160 , 200 )); 
54           for  ( int  i  =   0 ; i  <   155 ; i ++ ) { 
55               int  x  =  random.nextInt(width); 
56               int  y  =  random.nextInt(height); 
57               int  xl  =  random.nextInt( 12 ); 
58               int  yl  =  random.nextInt( 12 ); 
59              g.drawLine(x, y, x  +  xl, y  +  yl); 
60          } 
61   
62           //  randomCode用于保存随机产生的验证码,以便用户登录后进行验证。 
63          StringBuffer randomCode  =   new  StringBuffer(); 
64   
65           //  设置默认生成4个验证码 
66           int  length  =   4
67           //  设置备选验证码:包括"a-z"和数字"0-9" 68         String base = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; 
69   
70           int  size  =  base.length(); 
71   
72           //  随机产生4位数字的验证码。 
73           for  ( int  i  =   0 ; i  <  length; i ++ ) {  74               //  得到随机产生的验证码数字。 75             int start = random.nextInt(size); 
76              String strRand  =  base.substring(start, start  +   1 ); 
77   
78               //  用随机产生的颜色将验证码绘制到图像中。 
79   //  生成随机颜色(因为是做前景,所以偏深) 80  // g.setColor(getRandColor(1, 100)); 81              
82   // 调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成 
83              g.setColor( new  Color( 20 + random.nextInt( 110 ), 20 + random.nextInt( 110 ), 20 + random.nextInt( 110 ))); 
84   
85              g.drawString(strRand,  15   *  i  +   6 24 ); 
86   
87               //  将产生的四个随机数组合在一起。 
88              randomCode.append(strRand); 
89          } 
90           //  将四位数字的验证码保存到Session中。 
91          HttpSession session  =  request.getSession(); 
92          session.setAttribute( " rand " , randomCode.toString()); 
93   
94           // 图象生效 
95          g.dispose(); 
96   
97           //  禁止图像缓存。 
98          response.setHeader( " Pragma " " no-cache " ); 
99          response.setHeader( " Cache-Control " " no-cache " );
100          response.setDateHeader( " Expires " 0 );
101  
102          response.setContentType( " image/jpeg " );
103  
104           //  将图像输出到Servlet输出流中。105         ServletOutputStream sos = response.getOutputStream();
106          ImageIO.write(buffImg,  " jpeg " , sos);
107          sos.flush();
108          sos.close();
109  
110      }
111  
112      Color getRandColor( int  fc,  int  bc) { //  给定范围获得随机颜色
113          Random random  =   new  Random();
114           if  (fc  >   255 )
115              fc  =   255 ;
116           if  (bc  >   255 )
117              bc  =   255 ;
118           int  r  =  fc  +  random.nextInt(bc  -  fc);
119           int  g  =  fc  +  random.nextInt(bc  -  fc);
120           int  b  =  fc  +  random.nextInt(bc  -  fc);
121           return   new  Color(r, g, b);
122      }
123  
124  }

   配置

1       < servlet >
2           < servlet - name > RandomCode </ servlet - name >
3           < servlet - class > com.logcd.servlet.RandomCode </ servlet - class >
4       </ servlet >
5       < servlet - mapping >
6           < servlet - name > RandomCode </ servlet - name >
7           < url - pattern >/ randomCode </ url - pattern >
8       </ servlet - mapping >

  调用

1   < meta http - equiv = " Content-Type "  content = " text/html; charset=gb2312 "   />  
2   < meta http - equiv = " pragma "  content = " no-cache " />  
3   < meta http - equiv = " cache-control "  content = " no-cache " />  
4   < meta http - equiv = " expires "  content = " 0 " />  
5   
6   < iframe src = " http://127.0.0.1/js_test/randomCode "  id = " codeFrame "  name = " codeFrame "  frameborder = " no "  border = " 0 "  marginwidth = " 0 "  
7       marginheight = " 0 "  scrolling = " no "  allowtransparency = " yes "  height = " 35 "  width = " 102 " ></ iframe >  
8        < a href = " javascript:void(0); "  onclick = " refreshCode(); " > 看不清,换一张 </ a >  
9       < br >  
10       < span id = " codeImg " >< img border = 0  src = " randomCode " ></ span >
11       < a href = " javascript:void(0); "  onclick = " reloadCode() " > 看不清,再换一张 </ a >
1  function $(id){ 
2       return  document.getElementById(id); 
3  } 
4   
5   /** 刷新iframe* */  
6  function refreshCode(){ 
7      window.frames[ " codeFrame " ].location.reload(); 
8  } 
9  
10   /** 替换图片* */
11  function reloadCode(){
12      $( " codeImg " ).innerHTML  =   " <img border=0 src='randomCode'> " ;
13  }









本文转自 wws5201985 51CTO博客,原文链接:http://blog.51cto.com/wws5201985/735595,如需转载请自行联系原作者
相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
目录
相关文章
|
1月前
|
JavaScript NoSQL Java
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
196 96
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
|
9天前
|
消息中间件 Java 应用服务中间件
JVM实战—1.Java代码的运行原理
本文介绍了Java代码的运行机制、JVM类加载机制、JVM内存区域及其作用、垃圾回收机制,并汇总了一些常见问题。
JVM实战—1.Java代码的运行原理
|
18天前
|
传感器 监控 Java
Java代码结构解析:类、方法、主函数(1分钟解剖室)
### Java代码结构简介 掌握Java代码结构如同拥有程序世界的建筑蓝图,类、方法和主函数构成“黄金三角”。类是独立的容器,承载成员变量和方法;方法实现特定功能,参数控制输入环境;主函数是程序入口。常见错误包括类名与文件名不匹配、忘记static修饰符和花括号未闭合。通过实战案例学习电商系统、游戏角色控制和物联网设备监控,理解类的作用、方法类型和主函数任务,避免典型错误,逐步提升编程能力。 **脑图速记法**:类如太空站,方法即舱段;main是发射台,static不能换;文件名对仗,括号要成双;参数是坐标,void不返航。
45 5
|
1月前
|
JavaScript 安全 Java
智慧产科一体化管理平台源码,基于Java,Vue,ElementUI技术开发,二开快捷
智慧产科一体化管理平台覆盖从备孕到产后42天的全流程管理,构建科室协同、医患沟通及智能设备互联平台。通过移动端扫码建卡、自助报道、智能采集数据等手段优化就诊流程,提升孕妇就诊体验,并实现高危孕产妇五色管理和孕妇学校三位一体化管理,全面提升妇幼健康宣教质量。
52 12
|
1月前
|
缓存 Java 应用服务中间件
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
187 5
|
15天前
|
存储 监控 数据可视化
SaaS云计算技术的智慧工地源码,基于Java+Spring Cloud框架开发
智慧工地源码基于微服务+Java+Spring Cloud +UniApp +MySql架构,利用传感器、监控摄像头、AI、大数据等技术,实现施工现场的实时监测、数据分析与智能决策。平台涵盖人员、车辆、视频监控、施工质量、设备、环境和能耗管理七大维度,提供可视化管理、智能化报警、移动智能办公及分布计算存储等功能,全面提升工地的安全性、效率和质量。
|
21天前
|
缓存 Java 物联网
CRaC技术助力ACS上的Java应用启动加速
容器计算服务借助ACS的柔性算力特性并搭配CRaC技术极致地提升Java类应用的启动速度。
|
2月前
|
SQL Java 数据库连接
如何在 Java 代码中使用 JSqlParser 解析复杂的 SQL 语句?
大家好,我是 V 哥。JSqlParser 是一个用于解析 SQL 语句的 Java 库,可将 SQL 解析为 Java 对象树,支持多种 SQL 类型(如 `SELECT`、`INSERT` 等)。它适用于 SQL 分析、修改、生成和验证等场景。通过 Maven 或 Gradle 安装后,可以方便地在 Java 代码中使用。
521 11
|
2月前
|
JSON Java 数据挖掘
利用 Java 代码获取淘宝关键字 API 接口
在数字化商业时代,精准把握市场动态与消费者需求是企业成功的关键。淘宝作为中国最大的电商平台之一,其海量数据中蕴含丰富的商业洞察。本文介绍如何通过Java代码高效、合规地获取淘宝关键字API接口数据,帮助商家优化产品布局、制定营销策略。主要内容包括: 1. **淘宝关键字API的价值**:洞察用户需求、优化产品标题与详情、制定营销策略。 2. **获取API接口的步骤**:注册账号、申请权限、搭建Java开发环境、编写调用代码、解析响应数据。 3. **注意事项**:遵守法律法规与平台规则,处理API调用限制。 通过这些步骤,商家可以在激烈的市场竞争中脱颖而出。
|
24天前
|
存储 监控 Java
【Java并发】【线程池】带你从0-1入门线程池
欢迎来到我的技术博客!我是一名热爱编程的开发者,梦想是编写高端CRUD应用。2025年我正在沉淀中,博客更新速度加快,期待与你一起成长。 线程池是一种复用线程资源的机制,通过预先创建一定数量的线程并管理其生命周期,避免频繁创建/销毁线程带来的性能开销。它解决了线程创建成本高、资源耗尽风险、响应速度慢和任务执行缺乏管理等问题。
155 60
【Java并发】【线程池】带你从0-1入门线程池