java 生成验证码

来源:互联网 发布:37大闹天宫进阶数据 编辑:程序博客网 时间:2024/05/15 13:58

生成验证码的过程

1.创建BufferedImage对象,该对象存在内存中,负责保存绘制的图像;   

2.创建Graphics2D对象,该对象负责绘制所需的图像;(1先画边框,2.产生码值,3.产生干扰线 )   

3.当绘制完成后,调用com.sun.image.codec.jpeg包的JPEG编码器对其编码;   

4.最后将编码后的数据输出至HttpResponse即可

一.validImage.jsp生成验证码代码

<%@ page language="java" pageEncoding="UTF-8"%><%@page import="java.util.Date"%><%@ page contentType="image/jpeg"  import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*"%>  <%@page import="java.io.InputStream"%>    <%   int width = 68; //图片宽度   int height = 22; //图片高度   int count = 4; //码数    //验证码源   char[] codes = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };     InputStream inputStream;          BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);            Graphics2D g = bi.createGraphics();      g.setColor(Color.WHITE);      g.fillRect(0, 0, width, height); //画背景            g.setColor(Color.BLACK);  ////画着色块    g.drawRect(0, 0, width - 1, height - 1); //画边框            //设置画笔的颜色和字体      g.setFont(new Font("Fixedsys",Font.PLAIN, 14));      StringBuilder sb = new StringBuilder();  //用来保存产生的码值      Random random = new Random();      for(int i = 0; i < count; i++){          char c = codes[random.nextInt(codes.length)];          sb.append(c);          //产生随机颜色          g.setColor(new Color(random.nextInt(200), random.nextInt(200), random.nextInt(200)));          g.drawString(String.valueOf(c), i * (width/count)+2, height-3);      }            //随机数的干扰线       for(int i = 0; i < 1; i++){          g.setColor(new Color(160 + random.nextInt(96),                   160 + random.nextInt(96), 160 + random.nextInt(96)));                        int x = 2+random.nextInt(width);          int y = 2+random.nextInt(height);          int x1 = random.nextInt(6);          int y1 = random.nextInt(6);          g.drawLine(x, y, x+x1 > width - 3 ? width-3 : x+x1, y+y1 > height-3 ? height - 3 : y+y1);      }        //   将认证码存入SESSION       session.setAttribute("validCode", sb.toString());      g.dispose();      out.clear();       out = pageContext.pushBody();      ImageIO.setUseCache(true); //ImageIO.setUseCache(false)用系统缓存 
    //编码后的JPEG图像直接输出到了out对象中,我们只要传入response. getOutputStream()就可以直接输出到HttpResponse中。    ImageIO.write(bi, "JPEG", response.getOutputStream()); //保存新图片        %>


二.contrller

@RequestMapping(value="/m/login/validImage")public String validImage(){return "m/validImage";}

三.用验证码的页面的片段代码。

<img src="<ph:root/>/m/login/validImage?ran=Math.random()" width="68px" height="25px" name="validImage" id="validImage" onclick="this.src='<ph:root/>/m/login/validImage?ran='+Math.random()" />


原创粉丝点击