java实现动态验证码
java动态实现验证码,供大家参考,具体内容如下
【实现效果】
- 点击图片或者文字可以更换验证码
- 验证码随机生成,由大小写字母和数字组成
- 验证码字体颜色随机生成,字母角度有偏转
- 干扰线随机分布
验证码的功能:防止恶意的表单注册
VerificationCode.java验证码功能实现
packagecom.iqqcode.servlet.checkcode;
importjavax.imageio.ImageIO;
importjavax.servlet.ServletException;
importjavax.servlet.ServletOutputStream;
importjavax.servlet.annotation.WebServlet;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importjava.awt.*;
importjava.awt.image.BufferedImage;
importjava.io.IOException;
importjava.util.Random;
/**
*@Author:Mr.Q
*@Date:2020-02-1210:12
*@Description:验证码生成
*/
@WebServlet("/VerificationCode")
publicclassVerificationCodeextendsHttpServlet{
@Override
protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{
intwidth=120;
intheight=50;
//1.创建对象,验证码图片对象
BufferedImageimage=newBufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//2.美化图片
//2.1填充背景色
//Graphicsg=image.getGraphics();
Graphics2Dg=(Graphics2D)image.getGraphics();//画笔对象,2D来旋转验证码字母
g.setColor(Color.WHITE);//设置画笔颜色
g.fillRect(0,0,width,height);
//2.2画边框
g.setColor(Color.BLUE);
g.drawRect(0,0,width-1,height-1);
//2.3生成验证码
Stringstr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
//生成随机角标
Randomrandom=newRandom();
//改变字体
g.setFont(newFont("宋体",Font.BOLD,35));
//将验证码偏转并写到画布上
for(inti=1;i<=4;i++){
intx=width/5*i;
inty=height/2;
Stringmsg="";
intindex=random.nextInt(str.length());
//获取字符
charch=str.charAt(index);//随机字符
//获取正负30的角度
intangle=random.nextInt(60)-30;
doubleradian=angle*Math.PI/180;
//设置验证码中的字体颜色
//g.setColor(Color.BLUE);
intred=0;intgreen=0;intblue=0;
intcodeY=32;
//得到随机产生的验证码数字
//产生随机的颜色分量来构造颜色值,使输出的每位数字的颜色值都不同
red=random.nextInt(255);
green=random.nextInt(255);
blue=random.nextInt(255);
//用随机产生的颜色将验证码绘制到图像中
g.setColor(newColor(red,green,blue));
//写验证码
g.rotate(radian,x,y);
//把字母画在画布上
//g.drawString(ch+"",x,y);
g.drawString(String.valueOf(ch)+"",x,codeY);
//把每次旋转的再旋转回来
g.rotate(-radian,x,y);
//每次向右移动20像素
x+=15;
msg+=ch;
}
//2.4随机产生20条干扰线,使图象中的认证码不易被其它程序探测到
g.setColor(Color.MAGENTA);
//随机生成坐标点
for(inti=0;i<20;i++){
intx1=random.nextInt(width);
intx2=random.nextInt(width);
inty1=random.nextInt(height);
inty2=random.nextInt(height);
g.drawLine(x1,x2,y1,y2);
}
//3.将图片输出到页面展示
//将图片对象写入流中
ImageIO.write(image,"jpg",response.getOutputStream());
}
@Override
protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{
this.doPost(request,response);
}
}
insex.jsp前台页面展示
分析:
- 点击超链接或者图片,需要换一张
- 给超链接和图片绑定单击事件
- 重新设置图片的src属性值
生成的图片先要缓存在本地,每次请求是不会修改,所以验证码图片不会切换;
将图片路径后添加时间戳,通过错误的路径来欺骗服务器重新请求
<%@pagecontentType="text/html;charset=UTF-8"language="java"%>验证码 验证码动态实现
看不清?换一张
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。