验证码的出现在一定程度上降低了程序被攻击的风险,也使得我们的软件安全性得到有效提高。Java发展至今,网上也出现了各种各样的验证码:有图像验证码,字符验证码,还有用于计算的验证码等等。接下来为大家介绍几个原始验证码的写法。效果如下:

第一款是基本的验证码,就背景颜色和字体颜色随机的。第二款是每个字符都是不同的颜色。第三款是每个字符都有不同的倾斜角度。

验证码的实现原理:前端页面发送请求【使用标签】到后端,后端使用io流写出一张图片,前端页面展示出来。前端代码如下:

验证码:

οnclick="this.src='code?r='+Math.random()">

接下来就是后台代码实现了,后台画一张图片实际上就跟美术生写生一样,先有一个画板,然后在画板上铺上一张宣纸,在使用画笔在宣纸上进行图像的绘制。

第一部分:获取画板对象,并设置绘画区域:

//=================================创建画板(缓存图片)=================================//

//1.创建画板(缓存图片)(参数:宽度,高度,图像类型 -- 表示一个图像,该图像具有整数像素的 RGB 颜色)

BufferedImage image = new BufferedImage(100, 30, BufferedImage.TYPE_INT_BGR);

//2.根据缓冲图片获取一只画笔,默认颜色为白色

Graphics g = image.getGraphics();

//3.创建随机数对象,用于获取随机颜色

Random r = new Random();

//==================================画背景(随机颜色)==================================//

//4.先给笔设置颜色,才能设置画的区域,范围在0~255

//g.setColor(Color.gray);//设置固定颜色

g.setColor(new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256)));

//5.在画板上设置画的区域(参数:0,0表示起点的x和y坐标,100表示宽度,30表示高度)

g.fillRect(0, 0, 100, 30);

第二部分:画字符串(随机字符串,随机颜色,随机字体):

//6.获取随机字符串

String string = getString(4);

//7.为笔设置随机颜色,少了这一步的话,就会与背景颜色一样

g.setColor(new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256)));

//8.为该字符串设置随机的字体

g.setFont(getFont());

//9.将字符串画出(参数:画的字符串,10,25指的是画字符串的x坐标和字符串基线坐标y)

g.drawString(string, 10, 25);

第三部分:画干扰线和干扰点

//==========================画干扰线(随机位置)===========================//

for(int i = 0 ; i < 4 ; i++){

g.setColor(new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256)));

//参数:第一个点的坐标(x,y) 第二个点的坐标(x,y)

//将笔强转成Graphics2D类型

Graphics2D g1 = (Graphics2D)g;

//然后设置笔为原始宽度的1.5倍,Stroke:画笔

g1.setStroke(new BasicStroke(1.5f));

g.drawLine(r.nextInt(100), r.nextInt(30), r.nextInt(100), r.nextInt(30));

}

//==========================画干扰点(随机位置)===========================//

for(int i = 0 ; i < 20 ; i++){

g.setColor(new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256)));

//参数:圆心坐标(x,y)  横轴长度 纵轴长度,Oval椭圆

g.drawOval(r.nextInt(100), r.nextInt(30), 2, 2);

}

第四部分:画出图片,释放资源

//============================将缓存图片写出去=============================//

//x.设置响应的类型

resp.setContentType("image/jpeg");

//y.创建一个字节流(图片是二进制文件,只能通过字节流写出)

ServletOutputStream os = resp.getOutputStream();

//z.写出图片

ImageIO.write(image, "jpeg", os);

//关闭流释放资源

os.close();

其他:自定义的方法:

//获取随机字符串

public String getString(int num){

//这里不写0,O,1,l,2,z,6,b,U,V,v,u,9,q是因为用于不好区分,提高用户体验度

String words = "acdefghjkmnprstwxy34578ACEFGHJKLMNPQRSTWXY";

String result = "";

Random r = new Random();

for(int i = 0;i < num;i++){

result += words.charAt(r.nextInt(words.length())) + " ";

}

return result;

}

//随机字体

public Font getFont(){

Font[] fonts = new Font[5];

Random r = new Random();

fonts[0] = new Font("微软雅黑", Font.ITALIC, 24);

fonts[1] = new Font("新宋体", Font.PLAIN, 24);

fonts[2] = new Font("Microsoft YaHei UI", Font.PLAIN, 24);

fonts[3] = new Font("仿宋", Font.PLAIN, 24);

fonts[4] = new Font("Cambria", Font.BOLD, 24);

return fonts[r.nextInt(fonts.length)];

}

//随机颜色

public Color getRandomColor() {

Random ran = new Random();

Color color = new Color(ran.nextInt(256),

ran.nextInt(256), ran.nextInt(256));

return color;

}

实现不同字符的不同颜色:

StringBuilder string = new StringBuilder();

int left = 10;

for(int i = 0 ; i < 4 ; i++){

g.setColor(getRandomColor());

g.setFont(getFont());

String words = getString(1);

string.append(words);

g.drawString(words, left, 25);

left += 20;

}

实现不同字符的不同旋转角度:

StringBuilder string = new StringBuilder();//接收验证码的字符串

int left = 10;//设置画字符串的原始x坐标

int x = 15;//设置字符串旋转的x坐标

Random ran = new Random();

for(int i = 0 ; i < 4 ; i++){

g.setColor(getRandomColor());//随机颜色

g.setFont(getFont());//随机字体

String words = getString(1);//获取随机字符

string.append(words);//拼接到字符串string

Graphics2D g2 = (Graphics2D)g;//转换成Graphics2D对象,它才有rotate方法

double th = ran.nextInt(100)/100.0;//随机旋转角度

g2.rotate(th, x, 25);//旋转一个字符

g2.drawString(words, left, 25);//画字符串

g2.rotate(-th, x, 25);//调回原始角度

left += 20;//继续画下一个字符

x += 20;//继续旋转下一个字符

}

java 验证码_如何用java实现验证码?相关推荐

  1. 如何用命令行写java程序_如何用java实现doc命令行

    如何用java实现doc命令行, dir显示当前所有目录下的文件 cd 文件目录 进入到该目录 cd ..退到上级目录,一面是我写的代码,调试了. 不过有点小bug就是当你进去的是文件就会提示空指针异 ...

  2. java 下雪_如何用JAVA实现下雪场景

    看到这个题目,希望大家不要慌忙,从字面上很容易就能看出,我们要用到JFrame框架,然后需要在Frame里面添加雪花,最后让雪花移动起来. 下面我们来具体分析一下: 首先,我们需要有一个JFrame类 ...

  3. java椭圆_如何用java画椭圆

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 利用java画出椭圆.也就是鼠标一边移动一边显示出椭圆,如何做到请大神指教 这是我写的(没有达到我自己的要求): import java.awt.*; i ...

  4. datatable java实现_如何用Java实现.NET中DataTable功能

    展开全部 Junit中测试:32313133353236313431303231363533e59b9ee7ad9431333361306366 @Test public void joinTable ...

  5. java 艺术字_如何用Java做word里面的艺术字

    展开全部 你可以使用Spire.Doc for Java在Java应用程序中为word文档添加32313133353236313431303231363533e59b9ee7ad94313334313 ...

  6. java数字转换器_如何用java写个整数进制转换器

    十进制转为二进制.八进制.十六进制, 用  Integer.toXXXString()方法 (1)十进制转为二进制: Integer.toBinaryString(int i); public sta ...

  7. java 验证码_如何使用Java生成随机验证码

    我们想想,如何用Java绘制图片呢? 第一步 寻找☞ 纸画画要纸的 第二步 寻找笔 画画当然也要笔 在开始之前,我们需要用到几个主要的类 BufferedImage 用来缓寸你画的东西 Random ...

  8. java session验证码_利用session实现一次性验证码

    带有验证码的登录页面 用户名: 密码: 验证码: import java.io.*; import javax.servlet.*; import javax.servlet.http.*; impo ...

  9. 余数定理_如何用Java实现余数定理

    余数定理 by Anuj Pahade 由Anuj Pahade 如何用Java实现余数定理 (How to implement the Chinese Remainder Theorem in Ja ...

  10. preparestatement方法用多次_如何用java 5分钟实现一个最简单的mysql代理服务器?

    用java8基于vert.x3 快速实现一个最简单的mysql代理服务器,只需要5分钟时间. 什么是mysql 代理? mysql代理是介于client端和mysql服务端中间层服务,如下图所示: 这 ...

最新文章

  1. cgroup介绍、安装和控制cpu,内存,io示例
  2. shell相关测验题
  3. Quora使用到的技术
  4. Linux io运行情况,Linux IO调度层分析
  5. 央视《新闻联播》正式入驻快手平台
  6. 【Java从0到架构师】SpringMVC - 基础
  7. 5.UNIX 环境高级编程--标准I/O库
  8. web 安全-电脑端口(全部)
  9. Asp.Net编码规范
  10. 【行业应用】阿里云实时计算 Flink 版 IoT 行业解决方案
  11. 软件测试面试题(面试前准备篇)
  12. 重启 WMI 服务。
  13. 饭谈:盘点六种错误的技术问题提问
  14. 相机平面与工作平面带夹角下的坐标换算
  15. smss.exe之wom毒
  16. 手游低延迟高性价比蓝牙耳机,300元学生党最爱五款蓝牙耳机
  17. CES 2017:连接人工智能
  18. 大炮打蚊子(c语言易懂版)
  19. 【天光学术】建筑学论文:超高层建筑和风力发电一体化设计探析(节选)
  20. AI之Paper:人工智能领域之学术界的所有国际期刊简介、入门、学以致用(持续更新,建议收藏!)

热门文章

  1. Dell 禁用触摸板
  2. windows server 2019 中文语言包
  3. 离散数学与组合数学汇总
  4. Egret + P2物理引擎入门教程
  5. 汽车尾气排放在线监控系统解决方案
  6. ml sparksql 数据比较_Spark 及其上层应用 SparkSQL(六)
  7. ios备忘录下载安卓版_ios8备忘录app软件下载
  8. 太阳直射点纬度计算公式_高中地理——每日讲1题(太阳直射点、太阳高度角、影子方向)...
  9. 服务器性能测试 iometer 测试io
  10. nuxt 低版本浏览器不兼容处理