生成随机验证码工具类

生成随机验证码

package com.web;
//验证码生成处理类
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.geom.Line2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
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;
import javax.servlet.http.HttpSession;

import com.tools.MD5;

public class PictureCheckCode extends HttpServlet{

    private static final long serialVersionUID = 1L;

    private Random rand=new Random();

    /**
     * 生成随机颜色
     *
     * @param   start  [int]
     * @param   end    [int]
     * @return  Color  [object]
     */
    public Color getRandColor(int start,int end){
        int randNum;
        if(start>255) start=255;
        if(end>255) end=255;
        if(start>end) randNum=start-end;
        else randNum=end-start;
        int r=start+rand.nextInt(randNum);
        int g=start+rand.nextInt(randNum);
        int b=start+rand.nextInt(randNum);
        return new Color(r,g,b);
    }

    /**
     * 着色\旋转\缩放
     *
     * @param word 文字
     * @param g    图片对象
     */
    public void coloredAndRotation(String word,int i,Graphics g){
        /**着色**/
        g.setColor(new Color(20+rand.nextInt(110),20+rand.nextInt(110),20+rand.nextInt(110)));
        /**旋转**/
        Graphics2D g2d=(Graphics2D)g;
        AffineTransform trans=new AffineTransform();
        trans.rotate(rand.nextInt(45)*3.14/180,15*i+8,7);
        /**缩放**/
        float scaleSize=rand.nextFloat()+0.8f;
        if(scaleSize>1f) scaleSize=1f;
        trans.scale(scaleSize, scaleSize);
        g2d.setTransform(trans);
        g.drawString(word,15*i+20,20);
    }

    /**
     * 生成100条干扰线
     *
     * @param g2d
     * @param width
     * @param height
     */
    public void getRandLine(Graphics2D g2d,int width,int height){
        for(int i=0;i<100;i++){
            int x=rand.nextInt(width-1);
            int y=rand.nextInt(height-1);
            int z=rand.nextInt(6)+1;
            int w=rand.nextInt(12)+1;

            BasicStroke bs=new BasicStroke(2f,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL);
            Line2D line=new Line2D.Double(x,y,x+z,y+w);
            g2d.setStroke(bs);
            g2d.draw(line);
        }
    }

    /**
     * 获取随机文字
     *
     * @param  length [int]        验证码长度
     * @param  g      [Graphics]   图片对象
     * @return String
     * @case1:A-Z
     * @case2:chinese
     * @default:0-9
     */
    @SuppressWarnings("unused")
    public String getRandWord(int length,Graphics g){
        String finalWord="",firstWord="";
        int tempInt=0;
        String[] array={
                "0","1","2","3",
                "4","5","6","7",
                "8","9","a","b",
                "c","d","e","f"};

        for(int i=0;i<length;i++){
            switch(rand.nextInt(2)){
                case 1:
                        tempInt=rand.nextInt(26)+65;
                        firstWord=String.valueOf((char)tempInt);
                        break;
                /*case 2:
                        int r1,r2,r3,r4;
                        String strH,strL;//high&low
                        r1=rand.nextInt(3)+11; //前闭后开[11,14)
                        if(r1==13){
                            r2=rand.nextInt(7);
                        }else{
                            r2=rand.nextInt(16);
                        }

                        r3=rand.nextInt(6)+10;
                        if(r3==10){
                            r4=rand.nextInt(15)+1;
                        }else if(r3==15){
                            r4=rand.nextInt(15);
                        }else{
                            r4=rand.nextInt(16);
                        }

                        strH=array[r1]+array[r2];
                        strL=array[r3]+array[r4];

                        byte[] bytes=new byte[2];
                        bytes[0]=(byte)(Integer.parseInt(strH,16));
                        bytes[1]=(byte)(Integer.parseInt(strL,16));

                        firstWord=new String(bytes);
                        break;*/
                default:
                        tempInt=rand.nextInt(10)+48;
                        firstWord=String.valueOf((char)tempInt);
                        break;
            }
            finalWord+=firstWord;
            this.coloredAndRotation(firstWord,i, g);
        }

        return finalWord;
    }

    protected 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");
        int width=100;
        int height=40;
        BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);

        Graphics g=image.getGraphics();
        Graphics2D g2d=(Graphics2D)g;
        Font mFont=new Font("宋体",Font.BOLD,22);
        g.setColor(this.getRandColor(200,250));
        g.fillRect(0, 0, width, height);
        g.setFont(mFont);
        g.setColor(this.getRandColor(180,200));

        this.getRandLine(g2d, width, height);

        String randCode=this.getRandWord(4, g);

        HttpSession session=request.getSession();
        session.setAttribute("randCode",MD5.code(randCode.toLowerCase()));

        g.dispose();

        ImageIO.write(image,"JPEG",response.getOutputStream());

    }

}
时间: 2024-10-15 06:08:35

生成随机验证码工具类的相关文章

生成4位随机验证码工具类

keyUtil: package com.duocy.util; import java.util.Random; public class keyUtil {public String keyUtil() { String str="ABCDEFGHIJKLMNOPQRSTUVWXYZqwertyuiopasdfghjklzxcvbnm0123456789"; StringBuilder st=new StringBuilder(4); for(int i=0;i<4;i++)

图片验证码工具类

图片验证码工具类 文章 https://blog.csdn.net/lzxlfly/article/details/93381526 需求 session中放入登录验证码,一定时间后定时清除. 每次使用过验证码后清除,需要重新生成验证码. 工具类 package com.yuantiao.smartcardms.util; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; i

Java 验证码工具类

验证码代码工具代码如下: import javax.imageio.ImageIO;import java.awt.*;import java.awt.image.BufferedImage;import java.awt.image.RenderedImage;import java.io.FileOutputStream;import java.io.OutputStream;import java.util.HashMap;import java.util.Map;import java.

android 客户端生成随机验证码的实现

由于项目中要用到验证码,自己找了些资料,试着就把这个验证码给做了出来,代码不是很多,比较的简单,下面给大家看看我是怎么实现该功能的: 源码地址下载:http://download.csdn.net/detail/u014608640/7268905 首先当然是写XML咯,贴上代码 <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" andr

pillow实例 | 生成随机验证码

1 PIL(Python Image Library) PIL是Python进行基本图片处理的package,囊括了诸如图片的剪裁.缩放.写入文字等功能.现在,我便以生成随机验证码为例,讲述PIL的基本用法. PIL库似乎已经被人抛弃,就为更新,上次使用时竟然不能用show()直接将图片,在系统默认的图片管理器中打开.好在pillow,一个PIL的方言,将PIL继续维护了下去. 生成验证码一般需要对写入的文字进行旋转.扭曲.变色等一系列操作,才能避免计算机算法的识别. 因此定义一个生成验证码的类

自己封装————验证码工具类————

下面分享的是我自己封装的验证码工具类,在平时的项目中会比较经常用到的工具类,目前封装的这个工具类简易版的,如果有需要的伙伴可以拿去用,当然我建议用之前在配置文件里增加一些选项信息 //验证码宽度 private $width; //验证码高度 private $height; //验证的个数 private $length; //干扰点个数 private $dots; //干扰点的类型 private $type; //干扰线个数 private $lines; //文字 private $f

Android生成随机验证码技术

在Android客户端应用开发中,往往需要短信验证码或者随机验证码来限制用户的操作或者认证.短信验证码是为了对用户进行认证,主要通过Http协议等通信协议实现;随机验证码很大程度是为限制或者提示用户相关操作.随机验证码的验证主要有两种方式:请求服务器验证,本地验证.比如,在用户向服务器发送登录请求,我们通过随机验证码(本地验证即可)限制用户随意按请求按钮,演示如下: 源码实战 (1)src/.../createCode.java 功能:使用Random.Canvas.Paint及其相关方法创建包

学习python:实例2.用PIL生成随机验证码

效果: 代码: # 生成随机验证码图片 import string from random import randint, sample from PIL import Image, ImageDraw, ImageFont, ImageFilter # Image 负责处理图片 # ImageDraw 画笔 # ImageFont 文字 # ImageFileter 滤镜 # 定义变量 img_size = (150,50)        # 定义画布大小 img_rgb = (255,255

Python 生成随机验证码

Python生成随机验证码 Python生成随机验证码,需要使用PIL模块. 安装: 1 pip3 install pillow 基本使用 1. 创建图片 1 2 3 4 5 6 7 8 9 from PIL import Image img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255)) # 在图片查看器中打开 # img.show()  # 保存在本地 with open('code.png','wb') as f