产生4位包含大小字母与数字的验证码

转载 2013年12月02日 11:39:28
package sanitation.Util;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.awt.*;
import java.awt.image.*;
import java.util.*;
import javax.imageio.*; 

public class AuthImg extends HttpServlet
{
    /**
     * 验证码图片的处理
*/
    private static final long serialVersionUID = 1L;
    private Font mFont = new Font("Arial Black", Font.PLAIN, 16);  // 根据指定名称、样式和磅值大小,创建一个新 Font
    public void init() throws ServletException
    {
        super.init();
    }
    //随机产生指定区间颜色
    Color getRandColor(int fc,int bc)
    {
        Random random = new Random();
        if(fc>255) fc=255;
        if(bc>255) bc=255;
        int r=fc+random.nextInt(bc-fc);
        int g=fc+random.nextInt(bc-fc);
        int b=fc+random.nextInt(bc-fc);
        return new Color(r,g,b);
    }

    public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        response.setHeader("Pragma","No-cache");
        response.setHeader("Cache-Control","no-cache");
        response.setDateHeader("Expires", 0);
        response.setContentType("image/jpeg");
        System.out.println("i产生的");
        int width=80, height=18;
        /**
         * 构造一个类型为预定义图像类型之一的 BufferedImage,三个参数分别为:a.所创建图像的宽度
         *b.所创建图像的高度   c.所创建图像的类型
         * */
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        //创建图形上下文
        Graphics g = image.getGraphics();
        Random random = new Random();
        //将此图形上下文的当前颜色设置为指定颜色
        g.setColor(getRandColor(200,250));
        //填充指定的矩形,fillRect(int x, int y, int width, int height),该矩形左边缘和右边缘分别位于 x 和 x + width - 1。上边缘和下边缘分别位于 y 和 y + height - 1,宽度为width,高度为height
        g.fillRect(1, 1, width-1, height-1);
        g.setColor(new Color(102,102,102));
        //绘制指定矩形的边框。
        g.drawRect(0, 0, width-1, height-1);
        //将此图形上下文的字体设置为指定字体
        g.setFont(mFont);
        g.setColor(getRandColor(160,200));
        for (int i=0;i<155;i++)
        {
            int x = random.nextInt(width - 1);
            int y = random.nextInt(height - 1);
            int xl = random.nextInt(6) + 1;
            int yl = random.nextInt(12) + 1;
            //drawLine(int x1, int y1, int x2, int y2)在此图形上下文的坐标系中,使用当前颜色在点 (x1, y1) 和 (x2, y2) 之间画一条线。 
            g.drawLine(x,y,x + xl,y + yl);
        }
        for (int i = 0;i < 70;i++)
        {
            int x = random.nextInt(width - 1);
            int y = random.nextInt(height - 1);
            int xl = random.nextInt(12) + 1;
            int yl = random.nextInt(6) + 1;
            g.drawLine(x,y,x - xl,y - yl);
        }
        /**
         * 以下是产生4位随机数(包括大写字母,小写字母,数字)
         * */
        String sRand="";
        for (int i=0;i<4;i++)
        {    
            //返回一个String的字符
            String tmp = getRandomChar();
            //下面是为了不让0与o产生歧义,而进行处理
            if(tmp.equals("O") || tmp.equals("o")){
                tmp="A";
            }
            if(tmp=="0"){
                tmp="B";
            }
            sRand += tmp;
            g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));
            //使用此图形上下文的当前字体和颜色绘制由指定 string 给定的文本。最左侧字符的基线位于此图形上下文坐标系的 (x, y) 位置处
            g.drawString(tmp,15*i+10,15);
        }
        System.out.println("产生的验证码"+sRand.toUpperCase());

        HttpSession session = request.getSession(true);
        session.setAttribute("rand",sRand);
        //释放此图形的上下文以及它使用的所有系统资源
        g.dispose();
        /**
         * 到此图形创建结束,接着借助ImageIO.write(RenderedImage im, String formatName, OutputStream output)将一个图像写入 OutputStream
         * */
        ImageIO.write(image, "JPEG", response.getOutputStream());
    }
    /**
     * 获取相应的大写字母,小写字母或是数字
     * */
    private String getRandomChar()
    {    
        //产生小于2的随机数并进行四舍五入
        int rand = (int)Math.round(Math.random() * 2);
        long itmp = 0;
        char ctmp = '\u0000';
        switch (rand)
        {
            case 1:
                //产生65-90的Ascii
                itmp = Math.round(Math.random() * 25 + 65);
                //强制转化为char,获取相应的大写字母
                ctmp = (char)itmp;
                //下面有了return就可以省略break
                return String.valueOf(ctmp);            
            case 2:
                //获取97-122的Ascii,获取小写字母
                itmp = Math.round(Math.random() * 25 + 97);
                ctmp = (char)itmp;
                return String.valueOf(ctmp);
            default :
                //获取数字
                itmp = Math.round(Math.random() * 9);
                return String.valueOf(itmp);
        }
    }
}
}

PHP实现四位数字+字母验证码

一、新建captcha.php,写入以下代码:
  • LYHVOYAGE
  • LYHVOYAGE
  • 2016年04月27日 16:05
  • 1494

Java随机生成字母数字组合的验证码

字母与数字的ASCII码 目 前计算机中用得最广泛的 字符集及其编码,是由美国国家标准局(ANSI)制定的ASCII码(American Standard Code for Informatio...
  • qq_36948778
  • qq_36948778
  • 2017年05月18日 13:37
  • 1139

Java-验证码生成(数字+字母)

package util;import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.aw...
  • wxgxgp
  • wxgxgp
  • 2017年07月13日 18:01
  • 379

C#识别简单的验证码(上)

需要说明的是,这篇文章所讲的方法只适应于识别某一种特定的验证码,并不具有普遍性,但是读者可以参考其中的思维过程。 下面是我们要识别的验证码的样本: 对上面的样本进行分析,我们可以发现这套验...
  • louislong007
  • louislong007
  • 2015年08月09日 16:20
  • 1252

Java web 开发: 随机生成验证码,支持大小写字母、数字;随机字体

http://blog.csdn.net/ibm_hoojo/article/details/5834509 [java] view plaincopyprint? j...
  • Quincylk
  • Quincylk
  • 2013年08月06日 15:27
  • 1620

js随机生成一个验证码

之前接触过的验证码都是图片,今天碰到了一个用js生成随机验证码的demo,拿来敲一敲和大家分享...
  • AmberWu
  • AmberWu
  • 2017年05月31日 19:26
  • 1172

js随机生成4位验证码

js随机生成4位验证码
  • wang863628979
  • wang863628979
  • 2016年08月04日 20:46
  • 5268

Java版纯字母、纯数字、字母数字组合验证码的生成

所谓验证码,就是将一串随机产生的数字或符号,生成一幅图片, 图片里加上一些干扰,例如随机画数条直线或者画一些点,由用户肉眼识别其中的验证码信息,输入表单提交网站验证,验证成功后才能使用某项功能。验证码...
  • aboy123
  • aboy123
  • 2013年08月07日 11:10
  • 8910

在网页上生成由字母和数字组成验证码的简单实现

以下代码用于实现在页面上显示由字母和数字组成的简单验证码           效果图: package cn.itcast.response; import ja...
  • bear06
  • bear06
  • 2016年11月26日 20:00
  • 504

字母+数字验证码(一)

项目龙骨(Servlet项目 自己可以更改为框架式) : 首先将两个类放进去 1. ImageServlet.javapackage com.muke;import java.awt.Color...
  • Celebrity_Senior
  • Celebrity_Senior
  • 2016年10月03日 13:38
  • 756
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:产生4位包含大小字母与数字的验证码
举报原因:
原因补充:

(最多只允许输入30个字)