您的位置:首页 > 编程语言 > Java开发

java生成验证码

2016-12-27 09:32 288 查看
Java生成验证码
import javax.imageio.ImageIO;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import java.awt.*;import java.awt.image.BufferedImage;import java.io.IOException;import java.util.Random;/*** 生成验证码*/public class VerificationCode  {private static int width = 90;//定义图片的widthprivate static int height = 20;//定义图片的heightprivate static int codeCount = 5;//定义图片上显示验证码的个数private static int xx = 15;private static int fontHeight = 18;private static int codeY = 16;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' };//从该组中随机抽取几个数字或字母生成验证码public static void getVerificationCode(HttpServletRequest req, HttpServletResponse resp)throws IOException {// 定义图像bufferBufferedImage 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.gray);gd.drawRect(0, 0, width - 1, height - 1);// 随机产生40条干扰线,使图象中的认证码不易被其它程序探测到。gd.setColor(Color.gray);for (int i = 0; i < 10; i++) {int x = random.nextInt(width);int y = random.nextInt(height);int xl = random.nextInt(12);int yl = random.nextInt(12);gd.drawLine(x, y, x + xl, y + yl);}// randomCode用于保存随机产生的验证码,以便用户登录后进行验证。StringBuffer randomCode = new StringBuffer();int red = 0, green = 0, blue = 0;// 随机产生codeCount数字的验证码。for (int i = 0; i < codeCount; i++) {// 得到随机产生的验证码数字。String code = String.valueOf(codeSequence[random.nextInt(36)]);// 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。dzh注释原因:不要随机生成验证码颜色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);}// 将四位数字的验证码保存到Session中。HttpSession session = req.getSession();session.setAttribute("code", randomCode.toString());// 禁止图像缓存。resp.setHeader("Pragma", "no-cache");resp.setHeader("Cache-Control", "no-cache");resp.setDateHeader("Expires", 0);resp.setContentType("image/jpeg");// 将图像输出到Servlet输出流中。ServletOutputStream sos = resp.getOutputStream();ImageIO.write(buffImg, "jpeg", sos);sos.close();}}
在Controller里调用该Java程序
@RequestMapping(value = "/getVcode.shtml")public void getcode(HttpServletRequest req, HttpServletResponse resp) {try {VerificationCode.getVerificationCode(req, resp);log.info("\t获取到的验证码:{}-{}",req.getSession().getId(),req.getSession().getAttribute("code"));} catch (IOException e) {e.printStackTrace();}}
然后在jsp中调用该Controller就可以显示验证码
<span><img class="captcha-img" src="<%=basePath%>getVcode.shtml" width="65" title="看不清楚?换一张"/></span>
到了这里验证码就可以显示出来里,但是对于看不清的验证码怎么办呢?当然你如果重新刷新一下页面当然是可以重新生成验证码的,但是不够方便。
我们需要做一个点击事件,点击一下就会重新生成验证码。代码如下:
$(".captcha-img").click(function() {var d = new Date();$(this).attr("src", "<%=basePath%>getVcode.shtml?" + d.getTime());});
注意:这里一定要加 d.getTime()否则点击不会重新生成验证码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: