码迷,mamicode.com
首页 > 编程语言 > 详细

Java验证码源代码原理

时间:2016-05-12 14:53:46      阅读:216      评论:0      收藏:0      [点我收藏+]

标签:

本文章一共分为四步:

一、新建名为:CheckCodeServlet的servlet类

二、复制以下代码到新建的CheckCodeServlet类中,修改自己的包名


package com.seesun2012.Servlet; //这里是我的包名


import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CheckCodeServlet extends HttpServlet {
//产生随即的字体  
    private Font getFont() {  
    //创建random对象用来生成随机数
        Random random = new Random();
        //创建字体数组,用来装不同的字体的Font对象
        Font font[] = new Font[5];  
        font[0] = new Font("Ravie", Font.PLAIN, 24);  
        font[1] = new Font("Antique Olive Compact", Font.PLAIN, 24);  
        font[2] = new Font("Forte", Font.PLAIN, 24);  
        font[3] = new Font("Wide Latin", Font.PLAIN, 24);  
        font[4] = new Font("Gill Sans Ultra Bold", Font.PLAIN, 24);  
        return font[random.nextInt(5)];  
    }  
  
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)  
            throws ServletException, IOException {  
        // 设置响应头 Content-type类型  
        resp.setContentType("image/jpeg");  
        OutputStream os = resp.getOutputStream();  
        int width = 83, height = 30;  
        // 建立指定宽、高和BufferedImage对象  
        BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);  
  
        Graphics g = image.getGraphics(); // 该画笔画在image上  
        Color c = g.getColor(); // 保存当前画笔的颜色
        //填充矩形
        g.fillRect(0, 0, width, height);  
          
  
        char[] ch = "abcdefghjkmnpqrstuvwxyz2345678901".toCharArray(); // 随即产生的字符串 不包括 i l(小写L) o(小写O) 1(数字1)0(数字0)  
        int length = ch.length; // 随即字符串的长度  
        String sRand = ""; // 保存随即产生的字符串  
        Random random = new Random();  
        for (int i = 0; i < 4; i++) {  
            // 设置字体  
            g.setFont(getFont());  
            // 随即生成0-9的数字  
            String rand = new Character(ch[random.nextInt(length)]).toString();  
            sRand += rand;  
            // 设置随机颜色  
            g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));  
            g.drawString(rand, 20 * i + 6, 25);  
        }  
        //产生随即干扰点  
        for (int i = 0; i < 20; i++) {  
            int x1 = random.nextInt(width);  
            int y1 = random.nextInt(height);  
            g.drawOval(x1, y1, 2, 2);  
        }  
         // 将画笔的颜色再设置回去  
        g.setColor(c); 
        // 释放此图形的上下文以及它使用的所有系统资源。
        g.dispose();  
  
        //将验证码记录到session  
        req.getSession().setAttribute("safecode", sRand);  
        // 输出图像到页面  
        ImageIO.write(image, "JPEG", os);  
  
    }  
  
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)  
            throws ServletException, IOException {  
        doGet(req, resp);  
    }  

}



三、在页面中JSP页面中添加如下JavaScript代码(前提必须引用jquery-1.11.0.min.js脚本):

<script type="text/javascript">
function changeImg() {
var imgObj = document.getElementById("img");
imgObj.src = "CheckCodeServlet?ran=" + Math.random();
}
</script>



四、在body标签中的添加,post为提交方式:

<form action="所要进行处理的和验证Servlet名称" id="commentForm" method="post">

<span class="login_txt">验证码:</span>

<input class=“” name="code" type="rext" value="" maxLength=4 size=10 /> 

<img src="CheckCodeServlet" id="img" class="yzm" width="109" height="40" /> 

<a href="javascript:changeImg()" class="login-text03">看不清楚,换张图片</a>

</form>

Java验证码源代码原理

标签:

原文地址:http://blog.csdn.net/seesun2012/article/details/51362420

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!