zoukankan      html  css  js  c++  java
  • java的图片验证码

    1.验证码生成工具类

      1 package cn.bd.jboa.util;
      2 
      3 import java.awt.Color;
      4 import java.awt.Font;
      5 import java.awt.Graphics;
      6 import java.awt.image.BufferedImage;
      7 import java.io.ByteArrayInputStream;
      8 import java.io.ByteArrayOutputStream;
      9 import java.util.Random;
     10 import javax.imageio.ImageIO;
     11 import javax.imageio.stream.ImageOutputStream;
     12 
     13 public class RandomNumUtil {
     14     private ByteArrayInputStream image;// 图像
     15     private String str;// 验证码
     16 
     17     private RandomNumUtil() {
     18         init();// 初始化属性
     19     }
     20 
     21     /*
     22      * 取得RandomNumUtil实例
     23      */
     24     public static RandomNumUtil Instance() {
     25         return new RandomNumUtil();
     26     }
     27 
     28     /*
     29      * 取得验证码图片
     30      */
     31     public ByteArrayInputStream getImage() {
     32         return this.image;
     33     }
     34 
     35     /*
     36      * 取得图片的验证码
     37      */
     38     public String getString() {
     39         return this.str;
     40     }
     41 
     42     private void init() {
     43         // 在内存中创建图象
     44         int width = 85, height = 20;
     45         BufferedImage image = new BufferedImage(width, height,
     46                 BufferedImage.TYPE_INT_RGB);
     47         // 获取图形上下文
     48         Graphics g = image.getGraphics();
     49         // 生成随机类
     50         Random random = new Random();
     51         // 设定背景色
     52         g.setColor(getRandColor(200, 250));
     53         g.fillRect(0, 0, width, height);
     54         // 设定字体
     55         g.setFont(new Font("Times New Roman", Font.PLAIN, 18));
     56         // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
     57         g.setColor(getRandColor(160, 200));
     58         for (int i = 0; i < 155; i++) {
     59             int x = random.nextInt(width);
     60             int y = random.nextInt(height);
     61             int xl = random.nextInt(12);
     62             int yl = random.nextInt(12);
     63             g.drawLine(x, y, x + xl, y + yl);
     64         }
     65         // 取随机产生的认证码(6位数字)
     66         String sRand = "";
     67         for (int i = 0; i < 6; i++) {
     68             String rand = String.valueOf(random.nextInt(10));
     69             sRand += rand;
     70             // 将认证码显示到图象中
     71             g.setColor(new Color(20 + random.nextInt(110), 20 + random
     72                     .nextInt(110), 20 + random.nextInt(110)));
     73             // 调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
     74             g.drawString(rand, 13 * i + 6, 16);
     75         }
     76         // 赋值验证码
     77         this.str = sRand;
     78 
     79         // 图象生效
     80         g.dispose();
     81         ByteArrayInputStream input = null;
     82         ByteArrayOutputStream output = new ByteArrayOutputStream();
     83         try {
     84             ImageOutputStream imageOut = ImageIO
     85                     .createImageOutputStream(output);
     86             ImageIO.write(image, "JPEG", imageOut);
     87             imageOut.close();
     88             input = new ByteArrayInputStream(output.toByteArray());
     89         } catch (Exception e) {
     90             System.out.println("验证码图片产生出现错误:" + e.toString());
     91         }
     92 
     93         this.image = input;/* 赋值图像 */
     94     }
     95 
     96     /*
     97      * 给定范围获得随机颜色
     98      */
     99     private Color getRandColor(int fc, int bc) {
    100         Random random = new Random();
    101         if (fc > 255)
    102             fc = 255;
    103         if (bc > 255)
    104             bc = 255;
    105         int r = fc + random.nextInt(bc - fc);
    106         int g = fc + random.nextInt(bc - fc);
    107         int b = fc + random.nextInt(bc - fc);
    108         return new Color(r, g, b);
    109     }
    110 }

    2.action

     1 package cn.bd.jboa.action;
     2 
     3 import java.io.ByteArrayInputStream;
     4 import cn.bd.jboa.util.RandomNumUtil;
     5 import com.opensymphony.xwork2.ActionContext;
     6 import com.opensymphony.xwork2.ActionSupport;
     7 
     8 /**
     9  * 验证码
    10  * @author TaoXianXue
    11  *
    12  */
    13 public class RandomAction extends ActionSupport {
    14 
    15     private static final long serialVersionUID = 1L;
    16     private ByteArrayInputStream inputStream;
    17 
    18     // 生成验证码方法
    19     public String execute() throws Exception {
    20         RandomNumUtil rdnu = RandomNumUtil.Instance();
    21         this.setInputStream(rdnu.getImage());/// 取得带有随机字符串的图片
    22         ActionContext.getContext().getSession().put("random", rdnu.getString());//把验证码放入HttpSession中
    23         return "random";
    24     }
    25 
    26     public void setInputStream(ByteArrayInputStream inputStream) {
    27         this.inputStream = inputStream;
    28     }
    29 
    30     public ByteArrayInputStream getInputStream() {
    31         return inputStream;
    32     }
    33 }

    3.struts.xml

     1     <!-- 验证码操作Action配置 -->
     2     <package name="random" extends="json-default">
     3         <!-- Random验证码 -->
     4         <action name="random" class="randomAction">
     5             <result type="stream" name="random">
     6                 <param name="contentType">image/jpeg</param>
     7                 <param name="inputName">inputStream</param>
     8             </result>
     9         </action>
    10     </package>

    4.jsp页面

     1 <input type="image" src="random.actiononclick="this.src=this.src+'?'" title="点击图片刷新验证码" /> 

  • 相关阅读:
    USACO Milk2 区间合并
    Codeforces 490B Queue【模拟】
    HDU 3974 Assign the task 简单搜索
    HDU 5119 Happy Matt Friends(2014北京区域赛现场赛H题 裸背包DP)
    Cin、Cout 加快效率方法
    POJ 1159 回文LCS滚动数组优化
    POJ 2479 不相交最大子段和
    POJ 1458 最长公共子序列 LCS
    在阿里最深刻的,还是职场之道给我的震撼
    精细化
  • 原文地址:https://www.cnblogs.com/taobd/p/6682630.html
Copyright © 2011-2022 走看看