验证码的生成类:
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中配置的,
这样验证码的结果就看到了,当然在具体验证的actin中,是要从session中把验证码取出来的,然后对比,做出相应的处理.