java动态验证码_程序员:Java web实现动态图片验证码的一个小实例

前言

不管PC端还是移动端,安全要求越来越高。产品也会通过各种手段提高应用在关键节点为的安全性,最基础的验证码、图片文字识别、简单算术计算、滑动板块、人脸识别等等。

这些功能都有一样的目的,防止外来攻击和加强安全验证。

今天给大家来个小实例,用java实现动态图片验证码。

8358098bf032ee806ec76e3931967b75.png

代码

生成验证码图片

定义宽高

int width = 100;

int height = 50;

使用BufferedImage在内存中生成图片

BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

绘制背景和边框

Graphics g = image.getGraphics();

g.setColor(Color.WHITE);

g.fillRect(0, 0, width, height);

g.setColor(Color.BLACK);

g.drawRect(0, 0, width - 1, height - 1);

创建随机字符集和随机数对象

//字符集

String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefgjijklmnopqrstuvwxyz";

//随机数

Random ran = new Random();

创建随机颜色生成方法

private Color getRandomColor(Random random) {

//获取随机颜色

int colorIndex = random.nextInt(3);

switch (colorIndex) {

case 0:

return Color.BLUE;

case 1:

return Color.GREEN;

case 2:

return Color.RED;

case 3:

return Color.YELLOW;

default:

return Color.MAGENTA;

}

}

绘制验证码字符

//绘制验证码

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

//获取随机字符

int index = ran.nextInt(str.length());

char ch = str.charAt(index);

//获取随机色

Color randomColor = getRandomColor(ran);

g.setColor(randomColor);

//设置字体

Font font = new Font("宋体", Font.BOLD, height / 2);

g.setFont(font);

//写入验证码

g.drawString(ch + "", (i == 0) ? width / 4 * i + 2 : width / 4 * i, height - height / 4);

}

绘制干扰线

//干扰线

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

int x1 = ran.nextInt(width);

int x2 = ran.nextInt(width);

int y1 = ran.nextInt(height);

int y2 = ran.nextInt(height);

Color randomColor = getRandomColor(ran);

g.setColor(randomColor);

g.drawLine(x1, x2, y1, y2);

}

使用ImageIO输出图片

ImageIO.write(image, "jpg", resp.getOutputStream());

成果图

94c71f3e9114b5c18ae33c03828b1b0f.png

实现刷新效果

新建html页面

使用img标签实现图片展示

identcode

看不清,换一张

使用js实现刷新效果

//点击图片时

var img = document.getElementById("identcode");

img.onclick = function (){

refesh();

}

//点击连接时

var a = document.getElementById("refesh");

a.onclick = function (){

refesh();

//返回false防止a标签默认href行为

return false;

}

function refesh() {

/**

* 由于路径相同时浏览器会自动调用缓存中的图片

* 所以在连接后加时间戳解决此问题

*/

var date = new Date().getTime();

img.src = "identcode?" + date;

}

效果

8009049dc667544c57256ef5074f54bd.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值