图片验证码的生成参考文档

来源:互联网 发布:伴随矩阵秩的性质 编辑:程序博客网 时间:2024/05/16 02:03
       验证码的生成是在  Servlet 类中完成的,主要使用 java.awt 包中的绘制图形图像的类,以及用户生成随机数的 Random 类,而且在 Servlet 类中,需要设置 Response 对象的 setContenType() 方法的参数值为 “image/jpeg” , 最后在注册页的表单中,使用<img> 标签显示注册码,主要设置<img>标签属性 src 的值为生成图像的地址 servlet 


主要有两点、
       1. 首先要有一个容器,也就是画图的一张纸
           BufferedImage 对象
           BufferedImage image =new BufferedImage(宽,高,图像类型);
           创建 BufferedImage 对象,需要 3 个参数,宽、高、图像类型(BufferedImage.TYPE_INT_RGB)             


       2. 其次需要画图的一支笔 ,(图形的上下文)
          Graphics 对象
          该类用户  BufferedImage  图像上进行绘制操作,通过 BufferedImage.getGraphics() 创建
        例:
          Graphics g = BufferedImage.getGraphics();
         
          Graphics 类的常用方法及说明
   ------------------------------------------------------------------------------------
              方     法                   |               说            明
   ------------------------------------------------------------------------------------
             dispose()                    |  释放此图形的上下文以及它使用的所有系统资源
   ------------------------------------------------------------------------------------
             drawImage()                  |  绘制指定图像中当前可用的图像
   ------------------------------------------------------------------------------------
   drawLing(int x1,int y1,int x2,int y2)  |  在此图像上下文的坐标系中,使用当前颜色在点
                                          |   x1,y1)和 (x2,y2)之间画线
   ------------------------------------------------------------------------------------
     drawString(String str,int x,int y)   |  使用此图形上下文的当前字体和颜色绘制由指定 
                                          |  String 给定的文本
   ------------------------------------------------------------------------------------
fillRect(int x,int y,int width,int height)|  填充指定的矩形,参数 x和y表示矩形的坐标,
                                          |  width 和 height 表示矩形的宽和高
   ------------------------------------------------------------------------------------
             finalize()                   |  释放此图形的上下文
   ------------------------------------------------------------------------------------
             setFont(Font font)           |  将此图形上下文的字体设置为指定字体
   ------------------------------------------------------------------------------------
             setColor(Color color)        |  将此图形上下文的当前颜色设置为指定颜色
   ------------------------------------------------------------------------------------




 例:********************************
    package com.accp.util;


import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
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;


public class MyServlet extends HttpServlet {


@Override
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);
//设置响应格式为 .jpeg 图片
response.setContentType("image/jpeg");
//创建一个指定长宽的图像
int width=60,height=20;
BufferedImage image= new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);
//获得处理图形上下文的对象
Graphics g = image.getGraphics();
//创建生成随机数的对象
Random rd = new Random();
//设置图像背景颜色
g.setColor(MyServlet.getRandomColor(200, 250));
//填充指定的矩形
g.fillRect(0, 0, width, height);
//设置字体格式
g.setFont(new Font("Times New Roman",Font.PLAIN,18));
g.setColor(MyServlet.getRandomColor(160, 200));
//产生 130 随机干扰线
for(int i=0;i<130;i++){
int x = rd.nextInt(width);
int y = rd.nextInt(height);
int xl = rd.nextInt(12);
int yl = rd.nextInt(12);
//在图像的随机指定坐标之间画上干扰线
g.drawLine(x, y, x+xl, y+yl);
}
String strCode="";
for(int i=0;i<4;i++){
String strname=rd.nextInt(10)+"";
strCode+=strname;
g.setColor(new Color(15+rd.nextInt(120),15+rd.nextInt(120),15+rd.nextInt(120)));
//将验证码依次画到图像上
g.drawString(strname, 13*i+6,16);
}
//将验证码保存到 session 中
request.getSession().setAttribute("Code", strCode);
g.dispose(); //释放此图像上下文以及它使用的所有资源
//输出 JPEG 格式图片到页面
ImageIO.write(image, "JPEG", response.getOutputStream());
response.getOutputStream().flush();
response.getOutputStream().close();
}

//该方法用于获取颜色
private static Color getRandomColor(int fc,int bc){
Random rd =new Random();
Color color = null;
if(fc>255)fc=255;
if(bc>255)bc=255;
//设置 3 个  0 ~ 255 之间的随机颜色值
int r = fc+rd.nextInt(bc-fc);
int g = fc+rd.nextInt(bc-fc);
int b = fc+rd.nextInt(bc-fc);
color=new Color(r,g,b);
return color;
}

}
原创粉丝点击