java实现简单的验证码功能
最近要做一个网站,要求实现验证码程序,经过不断调试,终于成功实现功能。
一、验证码生成类
生成验证码的话需要用到java的Graphics类库,画出一个验证码
废话不多说,直接上代码
packageverificationCode;
importjava.awt.Color;
importjava.awt.Font;
importjava.awt.Graphics;
importjava.awt.image.BufferedImage;
importjava.awt.image.RenderedImage;
importjava.io.File;
importjava.io.FileNotFoundException;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.OutputStream;
importjava.util.HashMap;
importjava.util.Map;
importjava.util.Random;
importjavax.imageio.ImageIO;
publicclassgenerateCode{
privatestaticintwidth=150;//定义图片的width
privatestaticintheight=48;//定义图片的height
privatestaticintcodeCount=4;//定义图片上显示验证码的个数
privatestaticintxx=25;
privatestaticintfontHeight=42;
privatestaticintcodeY=42;
privatestaticchar[]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'};
/**
*生成一个map集合
*code为生成的验证码
*codePic为生成的验证码BufferedImage对象
*@return
*/
publicstaticMapgenerateCodeAndPic(){
//定义图像buffer
BufferedImagebuffImg=newBufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//Graphics2Dgd=buffImg.createGraphics();
//Graphics2Dgd=(Graphics2D)buffImg.getGraphics();
Graphicsgd=buffImg.getGraphics();
//创建一个随机数生成器类
Randomrandom=newRandom();
//将图像填充为白色
gd.setColor(Color.WHITE);
gd.fillRect(0,0,width,height);
//创建字体,字体的大小应该根据图片的高度来定。
Fontfont=newFont("Fixedsys",Font.BOLD,fontHeight);
//设置字体。
gd.setFont(font);
//画边框。
gd.setColor(Color.BLACK);
gd.drawRect(0,0,width-1,height-1);
gd.setFont(font);
//随机产生40条干扰线,使图象中的认证码不易被其它程序探测到。
intred=0,green=0,blue=0;
//randomCode用于保存随机产生的验证码,以便用户登录后进行验证。
StringBufferrandomCode=newStringBuffer();
//随机产生codeCount数字的验证码。
for(inti=0;imap=newHashMap();
//存放验证码
map.put("code",randomCode);
//存放生成的验证码BufferedImage对象
map.put("codePic",buffImg);
returnmap;
}
publicstaticvoidmain(String[]args)throwsException{
//创建文件输出流对象
Filefile=newFile("WebRoot/image/"+System.currentTimeMillis()+".jpg");
FileOutputStreamout=null;
try{
if(!file.exists()){
//先得到文件的上级目录,并创建上级目录,在创建文件
file.getParentFile().mkdir();
file.createNewFile();
}
out=newFileOutputStream(file);
Mapmap=generateCode.generateCodeAndPic();
ImageIO.write((RenderedImage)map.get("codePic"),"jpeg",out);
System.out.println("验证码的值为:"+map.get("code"));
}catch(FileNotFoundExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
二、验证码验证类
packageverificationCode;
importjava.io.IOException;
importjavax.servlet.ServletException;
importjavax.servlet.annotation.WebServlet;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importjavax.servlet.http.HttpSession;
@WebServlet("/checkCode")
publicclasscheckCodeextendsHttpServlet{
privatestaticfinallongserialVersionUID=1L;
protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
}
protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
Stringcode=request.getParameter("code");
response.setCharacterEncoding("utf-8");//保证格式正确
response.setContentType("text/html");
//验证验证码
StringsessionCode=request.getSession().getAttribute("code").toString();
if(code!=null&&!"".equals(code)&&sessionCode!=null&&!"".equals(sessionCode)){
if(code.equalsIgnoreCase(sessionCode)){
response.getWriter().println("验证通过!");
}else{
response.getWriter().println("验证失败!");
}
}else{
response.getWriter().println("验证失败!");
}
}
}
三、验证码传输类
用到doget方法
packageverificationCode;
importjava.awt.Color;
importjava.awt.Font;
importjava.awt.Graphics;
importjava.awt.image.BufferedImage;
importjava.awt.image.RenderedImage;
importjava.io.IOException;
importjava.util.HashMap;
importjava.util.Map;
importjava.util.Random;
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;
importjavax.servlet.http.HttpSession;
importverificationCode.generateCode;
/**
*ServletimplementationclassCodeServlet
*/
@WebServlet("/getCode")
publicclassCodeServletextendsHttpServlet{
privatestaticfinallongserialVersionUID=1L;
protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{
//调用工具类生成的验证码和验证码图片
MapcodeMap=generateCode.generateCodeAndPic();
//将四位数字的验证码保存到Session中。
HttpSessionsession=req.getSession();
session.setAttribute("code",codeMap.get("code").toString());
//禁止图像缓存。
resp.setHeader("Pragma","no-cache");
resp.setHeader("Cache-Control","no-cache");
resp.setDateHeader("Expires",0);
resp.setContentType("image/jpeg");
//将图像输出到Servlet输出流中。
ServletOutputStreamsos;
try{
sos=resp.getOutputStream();
ImageIO.write((RenderedImage)codeMap.get("codePic"),"jpeg",sos);
sos.close();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}
四、jsp验证demo
<%@pagelanguage="java"contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>验证码页面 请输入验证码:
总结
虽然只是一个小小的demo,但是实际上用到了许多知识,比如生成验证码的画图,传输验证码doget,验证验证码的dopost和ajax动态更换验证码,麻雀虽小五脏俱全啊。
参考网址:Java实现验证码的产生和验证
更多关于java验证码的精彩文章请点击专题:java验证码大全进行参考
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。