当前位置: 移动技术网 > IT编程>开发语言>Java > java实现简单的验证码功能

java实现简单的验证码功能

2020年05月13日  | 移动技术网IT编程  | 我要评论

sousuo,雪纳瑞论坛,藁木

最近要做一个网站,要求实现验证码程序,经过不断调试,终于成功实现功能。

一、验证码生成类

生成验证码的话需要用到java的graphics类库,画出一个验证码
废话不多说,直接上代码

package verificationcode;


import java.awt.color;
import java.awt.font;
import java.awt.graphics;
import java.awt.image.bufferedimage;
import java.awt.image.renderedimage;
import java.io.file;
import java.io.filenotfoundexception;
import java.io.fileoutputstream;
import java.io.ioexception;
import java.io.outputstream;
import java.util.hashmap;
import java.util.map;
import java.util.random;

import javax.imageio.imageio;

public class generatecode {
 private static int width = 150;// 定义图片的width
 private static int height = 48;// 定义图片的height
 private static int codecount = 4;// 定义图片上显示验证码的个数
 private static int xx = 25;
 private static int fontheight = 42;
 private static int codey = 42;
 private static 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' };

 /**
  * 生成一个map集合
  * code为生成的验证码
  * codepic为生成的验证码bufferedimage对象
  * @return
  */
 public static map<string,object> generatecodeandpic() {
  // 定义图像buffer
  bufferedimage buffimg = new bufferedimage(width, height, bufferedimage.type_int_rgb);
  // graphics2d gd = buffimg.creategraphics();
  // graphics2d gd = (graphics2d) buffimg.getgraphics();
  graphics gd = buffimg.getgraphics();
  // 创建一个随机数生成器类
  random random = new random();
  // 将图像填充为白色
  gd.setcolor(color.white);
  gd.fillrect(0, 0, width, height);

  // 创建字体,字体的大小应该根据图片的高度来定。
  font font = new font("fixedsys", font.bold, fontheight);
  // 设置字体。
  gd.setfont(font);

  // 画边框。
  gd.setcolor(color.black);
  gd.drawrect(0, 0, width - 1, height - 1);
  gd.setfont(font);
  // 随机产生40条干扰线,使图象中的认证码不易被其它程序探测到。
  int red = 0, green = 0, blue = 0;


  // randomcode用于保存随机产生的验证码,以便用户登录后进行验证。
  stringbuffer randomcode = new stringbuffer();


  // 随机产生codecount数字的验证码。
  for (int i = 0; i < codecount; i++) {
   // 得到随机产生的验证码数字。
   string code = string.valueof(codesequence[random.nextint(36)]);
   // 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。
   red = random.nextint(255);
   green = random.nextint(255);
   blue = random.nextint(255);
   // 用随机产生的颜色将验证码绘制到图像中。
   gd.setcolor(new color(red, green, blue));
   gd.drawstring(code, (i + 1) * xx, codey);

   // 将产生的四个随机数组合在一起。
   randomcode.append(code);
  }
  for (int i = 0; i < 60; i++) {
   red = random.nextint(255);
   green = random.nextint(255);
   blue = random.nextint(255);
   // 用随机产生的颜色将验证码绘制到图像中。
   gd.setcolor(new color(red, green, blue));
   int x = random.nextint(width);
   int y = random.nextint(height);
   int xl = random.nextint(50);
   int yl = random.nextint(50);
   gd.drawline(x, y, x + xl, y + yl);
  }
  map<string,object> map =new hashmap<string,object>();
  //存放验证码
  map.put("code", randomcode);
  //存放生成的验证码bufferedimage对象
  map.put("codepic", buffimg);
  return map;
 }

 public static void main(string[] args) throws exception {
  //创建文件输出流对象
  file file = new file("webroot/image/"+system.currenttimemillis()+".jpg");
  fileoutputstream out = null;
  try {
   if (!file.exists()) {
    // 先得到文件的上级目录,并创建上级目录,在创建文件
    file.getparentfile().mkdir();
    file.createnewfile();
   }
   out = new fileoutputstream(file);
  map<string,object> map = generatecode.generatecodeandpic();
  imageio.write((renderedimage) map.get("codepic"), "jpeg", out);
  system.out.println("验证码的值为:"+map.get("code"));
  } catch (filenotfoundexception e) {
   e.printstacktrace();
  } catch (ioexception e) {
   e.printstacktrace();
  }
 }
}

二、验证码验证类

package verificationcode;


import java.io.ioexception;
import javax.servlet.servletexception;
import javax.servlet.annotation.webservlet;
import javax.servlet.http.httpservlet;
import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpservletresponse;
import javax.servlet.http.httpsession;


@webservlet("/checkcode")
public class checkcode extends httpservlet {
 private static final long serialversionuid = 1l;

 protected void doget(httpservletrequest request, httpservletresponse response)
   throws servletexception, ioexception {

 }

 protected void dopost(httpservletrequest request, httpservletresponse response)
   throws servletexception, ioexception {
  string code = request.getparameter("code");
  response.setcharacterencoding("utf-8");//保证格式正确
  response.setcontenttype("text/html");
  // 验证验证码
  string sessioncode = 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方法

package verificationcode;

import java.awt.color;
import java.awt.font;
import java.awt.graphics;
import java.awt.image.bufferedimage;
import java.awt.image.renderedimage;
import java.io.ioexception;
import java.util.hashmap;
import java.util.map;
import java.util.random;

import javax.imageio.imageio;
import javax.servlet.servletexception;
import javax.servlet.servletoutputstream;
import javax.servlet.annotation.webservlet;
import javax.servlet.http.httpservlet;
import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpservletresponse;
import javax.servlet.http.httpsession;

import verificationcode.generatecode;
/**
 * servlet implementation class codeservlet
 */
@webservlet("/getcode")
public class codeservlet extends httpservlet {
 private static final long serialversionuid = 1l;

 protected void doget(httpservletrequest req, httpservletresponse resp) throws servletexception, ioexception {
  // 调用工具类生成的验证码和验证码图片
  map<string, object> codemap = generatecode.generatecodeandpic();

  // 将四位数字的验证码保存到session中。
  httpsession session = 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输出流中。
  servletoutputstream sos;
  try {
   sos = resp.getoutputstream();
   imageio.write((renderedimage) codemap.get("codepic"), "jpeg", sos);
   sos.close();
  } catch (ioexception e) {
   // todo auto-generated catch block
   e.printstacktrace();
  }

 }

}

四、jsp验证demo

<%@ page language="java" contenttype="text/html; charset=utf-8"
 pageencoding="utf-8"%>

<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>验证码页面</title>
<script type="text/javascript"
 src="${pagecontext.request.contextpath}/js/jquery.js"></script>
</head>
<body>
 <form action="${pagecontext.request.contextpath}/checkcode" method="post">
  请输入验证码:<input type="text" name="code" style="width: 80px;" /> <div id=random> <img id="imgobj" alt="验证码"
   src="${pagecontext.request.contextpath}/getcode"> </div><button id="b01" type="button">改变内容</button><br/> <input
   type="submit" value="提交" />
 </form>
</body>
<script type="text/javascript">
 $(function() {
  //response.getwriter().println("验证失败!");
 });

 $("#b01").click( function changeimg() { 


   $("#random").html("<img id='imgobj' alt='验证码' src='${pagecontext.request.contextpath}/getcode'>")  
   var imgsrc = $("#imgobj"); 
  var src = imgsrc.attr("src");  
  imgsrc.attr("src", chgurl(src)); 
 });

 // 时间戳
 // 为了使每次生成图片不一致,即不让浏览器读缓存,所以需要加上时间戳
 function chgurl(url) {
  var timestamp = (new date()).valueof();
  url = url.substring(0, 20);
  if ((url.indexof("&") >= 0)) {
   url = url + "×tamp=" + timestamp;
  } else {
   url = url + "?timestamp=" + timestamp;
  }
  return url;
 }

</script>
</html>

总结

虽然只是一个小小的demo,但是实际上用到了许多知识,比如生成验证码的画图,传输验证码doget,验证验证码的dopost和ajax动态更换验证码,麻雀虽小五脏俱全啊。

参考网址: java实现验证码的产生和验证

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网