验证码的生成

      在具体的程序设计中,验证码的生成可以是一次设计,一直使用,在一个具体的工程中,可以写一个类,专门用来生成验证码,然后再使用时,那里使用那里直接调用其对应的servlet就可以使用了,当然在不同的工程中,对验证码的要求也不一样,可以对生成验证码的类做修改,比如干扰线的条数,使用的字符是字母,数字还是两者都使用,设置字体的颜色,大小,位置都可以调节,一般来说,在一个工程中,制作一个验证码的生成类就够了,用时直接调用,比如:
验证码的生成类:
    package com.filr.randomimg;
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.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class RandomImg {
public static final String RANDOMCODEKEY="RANDOMVALIDATECODEKEY";
private Random random=new Random();
private String randString="0123456789QWERTYUIOPLKJH GFDSAZXCVBNM";
private int width=80;
private int height=26;
private int lineSize=100;
private int stringNum=4;
public String genRandomChar()
{
StringBuilder sb=new StringBuilder();
for (int i = 0; i
int idx=random.nextInt(randString.length());
char c=randString.charAt(idx);
sb.append(c);
}
return sb.toString();
}
public Color getRandomColor()
{
Color c=new Color(110+random.nextInt(7),110+random.nextInt(9),110+random.nextInt(5));
return c;
}
public void drawRandomLine(Graphics g)
{
for (int i = 0; i
g.setColor(getRandomColor());
int sx=random.nextInt(width);
int sy=random.nextInt(height);
int ex=random.nextInt(width);
int ey=random.nextInt(height);
g.drawLine(sx, sy, ex, ey);
}
}
public void drawString(Graphics g,String str)
{
int charx=5;
for (int i = 0; i < str.length(); i++) {
g.setColor(new Color(random.nextInt(101),random.nextInt(111),random.nextInt(121)));
char c=str.charAt(i);
int startx=charx+random.nextInt(7);
g.setFont(new Font("Fixedsys",Font.CENTER_BASELINE, 15+random.nextInt(8)));
g.translate(random.nextInt(3),random.nextInt(3));
int starty=random.nextInt(8)+13;
g.drawString(String.valueOf(c),startx,starty);
charx+=15;
}
}
public void genImg(HttpServletRequest request,HttpServletResponse response)
{
String randStr=this.genRandomChar();
request.getSession().setAttribute(RANDOMCODEKEY, randStr);
BufferedImage image=new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics g=image.getGraphics();
g.fillRect(0, 0, width, height);
g.setFont(new Font("Times New Roman",Font.ROMAN_BASELINE,18));
drawRandomLine(g);
drawString(g, randStr);
g.dispose();
try {
ImageIO.write(image, "JPEG",response.getOutputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

下面是验证码对应的servlet:
package com.filr.randomimg;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Random;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class RandImgServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("image/jpeg");
response.setHeader("Pragma","no-cache");
response.setDateHeader("Expires",0);
RandomImg ri=new RandomImg();
ri.genImg(request, response);
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}

}
之后再具体的网页中,可以直接在图片的连接src中调用servlet的访问路径,就可以加载出验证码了!如下所示:
不能忘记的是src的访问路劲是要在xml中配置的,
 
    This is the description of my J2EE component
    This is the display name of my J2EE component
    RandomeImgServlet
    com.filr.randomimg.RandImgServlet
 


 
    RandomeImgServlet
    /servlet/RandomeImgServlet
 

这样验证码的结果就看到了,当然在具体验证的actin中,是要从session中把验证码取出来的,然后对比,做出相应的处理.
     
    以上内容属个人手工编写,只为方便以后编程,若有大侠看到有不足或改进的地方,请不吝赐教!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值