这是一个产生验证码的servlet,在登录界面可以调用这个servlet差生一个验证码的图片,验证码的对应值保存到了session里面,可以在处理登录的servlet里面直接获取
session的值,然后验证用户的验证码输入是否正确。ps:将登录界面传入的用户输入的验证码和session里面保存的验证码真实值统一转换成大写或小写,即可处理忽略大
小写的问题。
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet(name="validateCode",urlPatterns="/validateCode")
public class ValidateCode extends HttpServlet{
@Override
public void init() throws ServletException {
super.init();
}
/**
* 验证码
*/
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setHeader("Content-type", "image/jpeg,UTF-8");
resp.setHeader("Pragma","no-cache");
resp.setHeader("Cache-Control", "no-cache");
resp.setHeader("Expires","-1");//内容不要设置缓存
OutputStream outputStream=resp.getOutputStream();
BufferedImage image=new BufferedImage(83, 35, BufferedImage.TYPE_INT_BGR);
Graphics g=image.getGraphics();
Color color=g.getColor();
g.fillRect(0, 0, 83, 35);
char[] ch="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890".toCharArray();
int length=ch.length;
Random random=new Random();
Font[] font=new Font[5];
//24指的是字体大小
font[0]=new Font("Ravie",Font.PLAIN,24);
font[1]=new Font("Autique Olive Compact",Font.PLAIN,24);
font[2]=new Font("Forte",Font.PLAIN,24);
font[3]=new Font("Wide Latin",Font.PLAIN,24);
font[4]=new Font("Gill Sans Ultra Bold",Font.PLAIN,24);
Font nowFont=font[random.nextInt(5)];
String validateCode="";
for(int i=0;i<4;i++){
//设置字体样式
g.setFont(nowFont);
char t=ch[random.nextInt(ch.length)];
String rand=new Character(t).toString();
// System.out.print(t);
// String rand=new Character(ch[random.nextInt(ch.length)]).toString();
g.setColor(new Color(random.nextInt(255),random.nextInt(255),random.nextInt(255)));
g.drawString(rand, 20*i+6, 25);
//将产生的随机符号保存到temp字符串中
validateCode=validateCode+t;
}
//方法一:可以将验证码字符串的真实值保存到servletcontext对象中,以便在处理登录的servlet中进行验证
// this.getServletConfig().getServletContext().setAttribute("validateCode", validateCode);
//方法二:可以将验证码字符串的真实值保存到session中,以便在处理登录的servlet中进行验证,这里采用这种方式
HttpSession session=req.getSession();
session.setAttribute("validateCode", validateCode);
//干扰线,设置了一百个点,作为干扰线
for(int i=0;i<100;i++){
int x1=random.nextInt(83);
int y1=random.nextInt(35);
g.drawOval(x1, y1, 2, 2);
}
g.setColor(color);
g.dispose();
ImageIO.write(image, "JPEG", outputStream);
}
@Override
public void destroy() {
super.destroy();
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
super.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
super.doPost(req, resp);
}
}