解析Java实现随机验证码功能的方法详解
2023-06-13 09:14:54 时间
现在许多系统的注册、登录或者发布信息模块都添加的随机码功能,就是为了避免自动注册程序或者自动发布程序的使用。
验证码实际上就是随机选择一些字符以图片的形式展现在页面上,如果进行提交操作的同时需要将图片上的字符同时提交,如果提交的字符与服务器session保存的不同,则认为提交信息无效。为了避免自动程序分析解析图片,通常会在图片上随机生成一些干扰线或者将字符进行扭曲,增加难度。
我们可以使用servlet来实现随机验证码的实现。
复制代码代码如下:
验证码实际上就是随机选择一些字符以图片的形式展现在页面上,如果进行提交操作的同时需要将图片上的字符同时提交,如果提交的字符与服务器session保存的不同,则认为提交信息无效。为了避免自动程序分析解析图片,通常会在图片上随机生成一些干扰线或者将字符进行扭曲,增加难度。
packagecom.servlet;
importjava.awt.Color;
importjava.awt.Font;
importjava.awt.Graphics2D;
importjava.awt.image.BufferedImage;
importjava.util.Random;
importjavax.imageio.ImageIO;
importjavax.servlet.ServletException;
importjavax.servlet.ServletOutputStream;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importjavax.servlet.http.HttpSession;
/**
*生成随机验证码
*@authorbitiliu
*
*/
publicclassValidateCodeServletextendsHttpServlet
{
privatestaticfinallongserialVersionUID=1L;
//验证码图片的宽度。
privateintwidth=60;
//验证码图片的高度。
privateintheight=20;
//验证码字符个数
privateintcodeCount=4;
privateintx=0;
//字体高度
privateintfontHeight;
privateintcodeY;
char[]codeSequence={"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"};
/**
*初始化验证图片属性
*/
publicvoidinit()throwsServletException
{
//从web.xml中获取初始信息
//宽度
StringstrWidth=this.getInitParameter("width");
//高度
StringstrHeight=this.getInitParameter("height");
//字符个数
StringstrCodeCount=this.getInitParameter("codeCount");
//将配置的信息转换成数值
try
{
if(strWidth!=null&&strWidth.length()!=0)
{
width=Integer.parseInt(strWidth);
}
if(strHeight!=null&&strHeight.length()!=0)
{
height=Integer.parseInt(strHeight);
}
if(strCodeCount!=null&&strCodeCount.length()!=0)
{
codeCount=Integer.parseInt(strCodeCount);
}
}
catch(NumberFormatExceptione)
{}
x=width/(codeCount+1);
fontHeight=height-2;
codeY=height-4;
}
protectedvoidservice(HttpServletRequestreq,HttpServletResponseresp)
throwsServletException,java.io.IOException{
//定义图像buffer
BufferedImagebuffImg=newBufferedImage(
width,height,BufferedImage.TYPE_INT_RGB);
Graphics2Dg=buffImg.createGraphics();
//创建一个随机数生成器类
Randomrandom=newRandom();
//将图像填充为白色
g.setColor(Color.WHITE);
g.fillRect(0,0,width,height);
//创建字体,字体的大小应该根据图片的高度来定。
Fontfont=newFont("Fixedsys",Font.PLAIN,fontHeight);
//设置字体。
g.setFont(font);
//画边框。
g.setColor(Color.BLACK);
g.drawRect(0,0,width-1,height-1);
//随机产生160条干扰线,使图象中的认证码不易被其它程序探测到。
g.setColor(Color.BLACK);
for(inti=0;i<160;i++)
{
intx=random.nextInt(width);
inty=random.nextInt(height);
intxl=random.nextInt(12);
intyl=random.nextInt(12);
g.drawLine(x,y,x+xl,y+yl);
}
//randomCode用于保存随机产生的验证码,以便用户登录后进行验证。
StringBufferrandomCode=newStringBuffer();
intred=0,green=0,blue=0;
//随机产生codeCount数字的验证码。
for(inti=0;i<codeCount;i++){
//得到随机产生的验证码数字。
StringstrRand=String.valueOf(codeSequence[random.nextInt(36)]);
//产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。
red=random.nextInt(255);
green=random.nextInt(255);
blue=random.nextInt(255);
//用随机产生的颜色将验证码绘制到图像中。
g.setColor(newColor(red,green,blue));
g.drawString(strRand,(i+1)*x,codeY);
//将产生的四个随机数组合在一起。
randomCode.append(strRand);
}
//将四位数字的验证码保存到Session中。
HttpSessionsession=req.getSession();
session.setAttribute("validateCode",randomCode.toString());
//禁止图像缓存。
resp.setHeader("Pragma","no-cache");
resp.setHeader("Cache-Control","no-cache");
resp.setDateHeader("Expires",0);
resp.setContentType("image/jpeg");
//将图像输出到Servlet输出流中。
ServletOutputStreamsos=resp.getOutputStream();
ImageIO.write(buffImg,"jpeg",sos);
sos.close();
}
}
需要在web.xml中声明servlet
<servlet>
<servlet-name>ValidateCodeServlet</servlet-name>
<servlet-class>com.servlet.ValidateCodeServlet</servlet-class>
<init-param>
<param-name>width</param-name>
<param-value>200</param-value>
</init-param>
<init-param>
<param-name>height</param-name>
<param-value>80</param-value>
</init-param>
<init-param>
<param-name>codeCount</param-name>
<param-value>5</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ValidateCodeServlet</servlet-name>
<url-pattern>/validateCodeServlet</url-pattern>
</servlet-mapping>
相关文章
- java除法保留两位小数_JAVA除法保留小数点后两位的两种方法
- java map 二维数组_Java二维数组实现简单Map
- 在线学习Java编程的最佳方法[通俗易懂]
- md5 java 实现_MD5加密的Java实现
- Java递归详解_java难不难学
- java——单链表方法实现
- Java生成随机数组_java生成唯一数字
- Java-String的常用方法总结
- 标题:Linux下发布Java:开创新纪元(linux发布java)
- 使用Java在Linux系统上开发:一步步安装全部组件(java环境linux)
- java中取得上下文路径的方法详解编程语言
- Linux下查看Java进程的方法(linux查看java进程)
- 数据库实现Java程序与Oracle数据库的连接(java链接oracle)
- Java里的Redis事务处理(redis事务java)
- 时间Java中设置Redis Key过期时间的方法(redisjava过期)
- 服务器快速搭建Linux Java服务器,实现互联网应用(linux搭建java)
- Java学习Linux基础的必要性(java要学linux)
- 使用Java连接MySQL实现查询功能(java连接mysql查询)
- Java连接MySQL:实现数据库操作(java中连接mysql)
- Java完美判断中文字符的方法
- JAVA读取文件夹大小的几种方法实例
- Java读取文件方法大全