servlet生成验证码

1.生成验证码图片,包含干扰点
原理其实十分简单,就是生成一串随机的字符串,然后将其以图片的方式显示出来
package com.manage.model;

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;
import javax.servlet.http.HttpSession;

public class CheckCode extends HttpServlet {
	private static final int CODE_LENGTH = 5;//验证码的位数
	private static final int WIDTH = CODE_LENGTH*18;//验证码图片的宽度,跟验证码的位数相关
	private static final int HEIGHT = 30;//验证码图片的高度
	private static final String CODES = "0123456789abcdefghijklmnopqr" +
			"stuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";//验证码字符库
	private static final Color BACKGROUND_COLOR = Color.BLACK;//验证码图片的背景颜色
	private static final Color CODE_COLOR = Color.RED;//验证码字体的颜色
	private static final int POINT_NUM = 100;//干扰点的数量
	private static final Color POINT_COLOR = Color.WHITE;//干扰点的颜色
	private static final Font CODE_FONT = new Font("Consolas",Font.BOLD,30);
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//获取session
		HttpSession session = request.getSession();
		//禁止浏览器缓存随机图片
		response.setDateHeader("Expires", -1);
		response.setHeader("Cache-Control", "no-cache");
		response.setHeader("Pragma", "no-cache");
		//通知浏览器以图片的方式打开发送的数据
		response.setHeader("Content-Type", "image/jpeg");
		//在内存中创建一幅图片
		BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
		//获取画笔
		Graphics g = image.getGraphics();
		//设置黑色背景
		g.setColor(BACKGROUND_COLOR);
		g.fillRect(0, 0, WIDTH, HEIGHT);
		//画干扰点
		Random random = new Random();
		for(int i=0;i<POINT_NUM;i++){
			g.setColor(POINT_COLOR);
			g.drawOval(random.nextInt(WIDTH), random.nextInt(HEIGHT),1,1);			
		}
		//生成随机验证码
		char[] randCode = new char[CODE_LENGTH];
		for(int i=0;i<CODE_LENGTH;i++){
			randCode[i] = CODES.charAt(random.nextInt(CODES.length()));
		}
		String code = new String(randCode);
		//显示验证码显示的样式
		g.setColor(CODE_COLOR);
		g.setFont(CODE_FONT);
		g.drawString(code, 2, 25);
		//向浏览器输出验证码图片
		ImageIO.write(image, "jpg", response.getOutputStream());
		//将code写入session中		
		session.setAttribute("checkCode", code);
	}

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

		this.doGet(request, response);

	}

}

2.验证码图片点击刷新
<script language="javascript" type="text/javascript">
    var pic = document.getElementById('checkCode');
    pic.src = "你的servlet的URL"+"?d="+Math.random();
</script>
之所以要加上Math.random(),是因为浏览器有缓存,访问同一个URL地址的话,浏览器会去取原来缓存中的验证码图片,这样就会导致错误。加上了随机数,可以使得前后两次的URL产生变化,浏览器每次都对服务器发出新的请求,从而获得正确的验证码图片。

3.服务器端
服务器端在用session验证的时候,要记得用户输入的验证码,无论是大写还是小写都要当成相同的格式来对待。当然也可以设计成区分大小写的形式。

4.最后生成的图片
例如:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值