创建验证码

这是一个产生验证码的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);
	}
}

猜你喜欢

转载自blog.csdn.net/Jonebuqi/article/details/51434538