import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Random; import javax.imageio.ImageIO; public class Test { /**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
//用于随机生成验证码的字符串集
String[] strs = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R"
,"S","T","U","V","W","X","Y","Z","a","b","c","d","e","f","g","h","i","j"
,"k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","0","1"
,"2","3","4","5","6","7","8","9"};
//随机生成干扰线的纵坐标y1和y2
Random y1Random = new Random();
Random y2Random = new Random();
int y1 = y1Random.nextInt(31);
int y2 = y2Random.nextInt(31); //随机生成用于组成验证码的字符串所在集的下标值
Random code1Random = new Random();
Random code2Random = new Random();
Random code3Random = new Random();
Random code4Random = new Random();
int code1Index = code1Random.nextInt(62);
int code2Index = code2Random.nextInt(62);
int code3Index = code3Random.nextInt(62);
int code4Index = code4Random.nextInt(62); //随机生成rgb颜色
Random rRandom = new Random();
Random gRandom = new Random();
Random bRandom = new Random();
int r = rRandom.nextInt(256);
int g = gRandom.nextInt(256);
int b = bRandom.nextInt(256);
Color color = new Color(r, g, b); //拼接成完整字符串
String codeString = strs[code1Index] + strs[code2Index] + strs[code3Index] + strs[code4Index]; //定义一个宽70像素,高30像素的jpg图片
BufferedImage bi = new BufferedImage(70, 30, BufferedImage.TYPE_INT_RGB);
//定义graphis绘画对象
Graphics2D graphics2d = bi.createGraphics();
graphics2d.setBackground(Color.WHITE);
graphics2d.setColor(color);
graphics2d.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 20));
graphics2d.clearRect(0, 0, 70, 30);
       //绘制干扰线
graphics2d.drawLine(0, y1, 70, y2); //居中绘制字符串
FontMetrics fontMetrics = graphics2d.getFontMetrics();
int stringWidth = fontMetrics.stringWidth(codeString);
int stringAscent = fontMetrics.getAscent();
int xCode = 70 / 2 - stringWidth / 2;
int yCode = 30 / 2 + stringAscent / 2;
graphics2d.drawString(codeString, xCode, yCode); //输出图片
File file = new File("C:\\Users\\zhengbing\\Desktop\\image.jpg");
ImageIO.write(bi, "jpeg", file);
} }

最后可以返回校验字符串codeString,来达到验证的功能

使用AWT组件实现验证码功能的更多相关文章

  1. 一步一步实现web程序信息管理系统之三----登陆业务逻辑实现(验证码功能+参数获取)

    本篇紧接着上一篇文章[一步一步实现web程序信息管理系统之二----后台框架实现跳转登陆页面] 验证码功能 一般验证码功能实现方式为,前端界面访问一个url请求,后端服务代码生成一个图片流返回至浏览器 ...

  2. .NET Core实战项目之CMS 第十六章 用户登录及验证码功能实现

    前面为了方便我们只是简单实现了基本业务功能的增删改查,但是登录功能还没有实现,而登录又是系统所必须的,得益于 ASP.NET Core的可扩展性因此我们很容易实现我们的登录功能.今天我将带着大家一起来 ...

  3. Servlet案例3:验证码功能

    这里介绍简单的验证码功能 动态生成图片 一个简单的页面: <!DOCTYPE html> <html> <head> <meta charset=" ...

  4. S2SH框架中的无刷新验证码功能实现

    暑假期间在实验室做使用S2SH框架的项目,其中登录和注册需要验证码,实现了一个没有实现刷新验证码功能的简单版本,代码如下: 1 package com.sem.action; 2 3 import j ...

  5. java实现验证码功能

    java实现验证码功能 通过java代码实现验证码功能的一般思路: 一.通过java代码生成一张验证码的图片,将验证码的图片保存到项目中的指定文件中去,代码如下: package com.util; ...

  6. Java AWT组件开发和Swing界面编程

    一.AWT组件开发 1.AWT AWT是抽象窗口工具箱的缩写,它为编写图形用户界面提供了用户接口,通过这个接口就可以继承很多方法,省去了很多工作.AWT还能使应用程序更好地同用户进行交互. AWT中的 ...

  7. JavaFX+SpringBoot+验证码功能的小型薪酬管理系统

    2020.07.22更新 1 概述 1.1 简介 一个简单的小型薪酬管理系统,前端JavaFX+后端Spring Boot,功能倒没多少,主要精力放在了UI和前端的一些逻辑上面,后端其实做得很简单. ...

  8. java-GUI编程之AWT组件

    AWT中常用组件 基本组件 组件名 功能 Button Button Canvas 用于绘图的画布 Checkbox 复选框组件(也可当做单选框组件使用) CheckboxGroup 用于将多个Che ...

  9. dd——留言板再加验证码功能

    1.找到后台-核心-频道模型-自定义表单 2.然后点击增加新的自定义表单 diyid 这个,不管他,默认就好 自定义表单名称 这个的话,比如你要加个留言板还是投诉建议?写上去呗 数据表  这个不要碰, ...

随机推荐

  1. C++——并发编程

    一.高级接口:async()和Future 1.1 async()和Future的第一个用例 假设需要计算两个操作数的总和,而这两个操作数是两个函数的返回值.寻常加法如下: func1() + fun ...

  2. hibernate的离线关联(多级)查询

    如果实体对象中没有关联对象的情况使用DetachedCriteria进行查询是一件很简单的事情. 假设要通过stuName查询一个学生Student记录,可以如下: Java代码 DetachedCr ...

  3. 数据分析学习(zhuan)

    http://www.zhihu.com/question/22119753 http://www.zhihu.com/question/20757000 ********************** ...

  4. linux 安装 easygui

    如果遇到问题也查找不到资料时,可以认真阅读安装文件下的README说明,或许可以得到帮助. 本次环境为redhat 6.4.python2.7.9 linux 图形化显示需要安装一些依赖包,比如lib ...

  5. 项目开发中遇到的extjs常见问题

    事件触发机制 l 给某一个控件添加事件. obj.addEvents( {search : true }); l 给某一个事件添加处理函数 n 给一个对象或变量添加监听及对应得处理,可以在创建时,通过 ...

  6. 使用ICMP协议Ping网络主机

    #coding:utf-8 #!/usr/bin/env python import os import argparse import socket import struct import sel ...

  7. armp启动

    1.启动apahcehttpd.exe -k starthttpd.exe -k restart 重启httpd.exe -k install 安装 2.php启动apache.conf文件添加:Lo ...

  8. VI经典插件ctags

    Vi经典插件ctags(转) (为了提高工作效率,必须学会使用一些工具) . 查看 key 相关信息说明的命令 :help keycodes ============================= ...

  9. js解码

    如代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...

  10. java(课程设计之记事本界面部分代码公布)

    代码:涉及记事本的一些界面......!! /* *java课程设计之记事本(coder @Gxjun) * 编写一个记事本程序 * 要求: * 用图形用户界面实现. * 能实现编辑.保存.另存为.查 ...