zoukankan      html  css  js  c++  java
  • 验证码生成器模版

     VCodeGenerator.java

      1 package util;
      2 import java.awt.Color;
      3 import java.awt.Font;
      4 import java.awt.Graphics2D;
      5 import java.awt.image.BufferedImage;
      6 import java.io.FileOutputStream;
      7 import java.io.IOException;
      8 import java.io.OutputStream;
      9 
     10 import javax.imageio.ImageIO;
     11 public class VCodeGenerator {
     12     private int width=160;
     13     private int height=60;
     14     private int charCnt=4;
     15     private int disturbLineNum = 10;
     16 
     17     final private char[] chars = "2345678ABCDEFGHJKLMPQRSTUVWXYabcdefhkmnqrstuvwx"
     18         .toCharArray();
     19     private static String[] fontNames = new String[] { "Courier", "Arial",
     20         "Verdana", "Georgia", "Times", "Tahoma" };
     21     private static int[] fontStyle = new int[] { Font.PLAIN, Font.BOLD,Font.ITALIC, Font.BOLD | Font.ITALIC };
     22 
     23 
     24     private OutputStream os;
     25     
     26     public VCodeGenerator(OutputStream os) {//一参构造函数
     27         this.os = os;
     28     }
     29     public VCodeGenerator(int width, int height, int charCnt, OutputStream os) {//四参构造函数
     30         super();
     31         this.width = width;
     32         this.height = height;
     33         this.charCnt = charCnt;
     34         this.os = os;
     35     }
     36     
     37     public String drawCode() throws IOException {
     38         BufferedImage bi = new BufferedImage(this.width, this.height,
     39                 BufferedImage.TYPE_INT_RGB);
     40         Graphics2D g = bi.createGraphics();
     41         g.setColor(new Color(245, 245, 245));//背景色
     42         g.fillRect(0, 0, this.width, this.height);
     43 
     44         drawDisturbLine(g);
     45 
     46         BufferedImage[] bis = new BufferedImage[charCnt];
     47         char[] codes = generateCode();
     48         for (int i = 0; i < charCnt; i++) {
     49             bis[i] = generateBuffImg(codes[i]);
     50             g.drawImage(bis[i], null, (int) (this.height * 0.6) * i, 0);
     51         }
     52 
     53         g.dispose();
     54 
     55         ImageIO.write(bi, "gif", os);
     56         return new String(codes);
     57     }
     58     private BufferedImage generateBuffImg(char c) {
     59         String tmp = Character.toString(c);
     60         Color forecolor = getRandomColor();
     61         Color backcolor = new Color(255, 255, 255, 0);
     62         String fontName = getRandomFontName();
     63         int fontStyle = getRandomStyle();
     64         int fontSize = getRandomSize();
     65         int strX = (this.height - fontSize) / 2;
     66         int strY = (this.height - fontSize) / 2 + fontSize;
     67         double arch = getRandomArch();
     68 
     69         BufferedImage ret = new BufferedImage(this.height, this.height,
     70                 BufferedImage.TYPE_INT_ARGB);
     71         Graphics2D g = ret.createGraphics();
     72         g.setColor(backcolor);
     73         g.fillRect(0, 0, this.height, this.height);
     74 
     75         g.setColor(forecolor);
     76         g.setFont(new Font(fontName, fontStyle, fontSize));
     77         g.rotate(arch, this.height / 2, this.height / 2);
     78         g.drawString(tmp, strX, strY);
     79 
     80         g.dispose();
     81         return ret;
     82     }
     83 
     84     private double getRandomArch() {
     85         return ((int) (Math.random() * 1000) % 2 == 0 ? -1 : 1) * Math.random();
     86     }
     87 
     88     private Color getRandomColor() {
     89         int r = (int) (Math.random() * 10000) % 200;
     90         int g = (int) (Math.random() * 10000) % 200;
     91         int b = (int) (Math.random() * 10000) % 200;
     92         return new Color(r, g, b);
     93     }
     94 
     95     private String getRandomFontName() {
     96         int pos = (int) (Math.random() * 10000) % (fontNames.length);
     97         return fontNames[pos];
     98     }
     99 
    100     private int getRandomStyle() {
    101         int pos = (int) (Math.random() * 10000) % (fontStyle.length);
    102         return fontStyle[pos];
    103     }
    104 
    105     private int getRandomSize() {
    106         int max = (int) (this.height * 0.9);
    107         int min = (int) (this.height * 0.6);
    108         return (int) (Math.random() * 10000) % (max - min + 1) + min;
    109     }
    110 
    111     private char[] generateCode() {
    112         char[] ret = new char[charCnt];
    113         for (int i = 0; i < charCnt; i++) {
    114             int letterPos = (int) (Math.random() * 10000) % (chars.length);
    115             ret[i] = chars[letterPos];
    116         }
    117         return ret;
    118     }
    119     
    120     private void drawDisturbLine(Graphics2D graphics) {
    121         for (int i = 0; i < disturbLineNum; i++) {
    122             graphics.setColor(getRandomColor());
    123             int x = (int) (Math.random() * 10000) % (this.width + 1) + 1;
    124             int x1 = (int) (Math.random() * 10000) % (this.width + 1) + 1;
    125             int y = (int) (Math.random() * 10000) % (this.height + 1) + 1;
    126             int y1 = (int) (Math.random() * 10000) % (this.height + 1) + 1;
    127             graphics.drawLine(x, y, x1, y1);
    128         }
    129 
    130     }
    131 
    132     public static void main(String[] args) throws IOException {
    133         FileOutputStream fos = new FileOutputStream("d:/tmp.gif");
    134         VCodeGenerator vg = new VCodeGenerator(80,30,4,fos);
    135         String a=vg.drawCode();
    136         System.out.print("\n"+a);
    137 /* 新建一个servlet,代码如下:(验证码直接调用该servlet)
    138  * OutputStream os=response.getOutputStream();
    139         VCodeGenerator vg=new VCodeGenerator(os);
    140         String vcode=vg.drawCode();
    141         os.close();
    142         request.getSession().setAttribute("vcode", vcode);
    143         System.out.print("\n"+vcode);
    144   *jsp中获取:
    145           <tr> <td height="60">
    146             <img src="servlet/getVcode?ts="+new Date().getTime() id="imgVcode"/>
    147           </td> </tr>
    148         <tr>
    149           <td align="center" valign="middle" height="20" style="color:blue">若看不清,点图片换一张</td>
    150         </tr>
    151    *js中控制    
    152     //绑定验证码图片框单击事件实现更换验证码
    153     $("div.validateCodeDiv").click(function(event){
    154         changeCode();
    155         window.event.cancelBubble = true;//防止冒泡事件
    156     });
    157         function changeCode(){
    158     $("#imgVcode").attr("src","servlet/getVcode?ts="+new Date().getTime() );    
    159 }
    160 */
    161     }
    162 }
  • 相关阅读:
    JavaWeb学习笔记
    IDEA环境配置里的一些error
    python库之argparse
    Burpsuite模块—-Intruder模块详解
    Burpsuite使用指南
    kali学习wiki
    用Flask 实现文件服务器(包含docker版本)
    ubuntu Nginx+tomcat 部署web项目
    python测试开发工具库汇总(转载)
    屏幕截图小工具的制作过程问题记录 python PIL pynput pyautogui pyscreeze
  • 原文地址:https://www.cnblogs.com/xumin/p/2769490.html
Copyright © 2011-2022 走看看