JAVA-生成随机验证码

RandomValidateCode.java

package com.checkcode.servlet;

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 RandomValidateCode {
	public static final String RANDOMCODEKEY = "randomValidateCode"; // 放到session中的key
	private Random random = new Random();
	private String randomString = ""; // 随机产生的字符串
	private int width = 80; // 宽
	private int height = 30; // 高
	private int lineSize = 40; // 干扰线数量
	private int randomSize = 4; // 验证码字符数量

	/**
	 * 获取可随机产生的字符串 0-9/a-z/A-Z
	 */
	public void getRandomString() {
		StringBuilder str = new StringBuilder();
		for (int i = 0; i <= 9; i++) {
			str.append(i);
		}
		for (int i = 0; i < 26; i++) {
			str.append((char) (i + 65));
		}
		for (int i = 0; i < 26; i++) {
			str.append((char) (i + 97));
		}
		this.randomString = str.toString();
	}

	/**
	 * 获取颜色
	 * 
	 * @param fc
	 * @param bc
	 * @return
	 */
	public Color getColor(int fc, int bc) {
		if (fc > 225) {
			fc = 225;
		}
		if (bc > 225) {
			bc = 225;
		}
		int r = fc + random.nextInt(bc - fc - 16);
		int g = fc + random.nextInt(bc - fc - 14);
		int b = fc + random.nextInt(bc - fc - 18);
		return new Color(r, g, b);
	}

	/**
	 * 获取字体
	 * 
	 * @return
	 */
	public Font getFont() {
		return new Font("Arial", Font.PLAIN, 18);
	}

	/**
	 * 生成随机图片
	 * 
	 * @param request
	 * @param response
	 */
	public void getRandomImage(HttpServletRequest request,
			HttpServletResponse response) {
		// 初始化字符串
		getRandomString();
		// 1.获取Image类
		BufferedImage image = new BufferedImage(width, height,
				BufferedImage.TYPE_3BYTE_BGR);
		// 2.获取图形绘制类Graphics,对图片进行绘制
		Graphics graphics = image.getGraphics();
		graphics.fillRect(0, 0, width, height); 
		graphics.setFont(getFont());
		graphics.setColor(getColor(110, 133));
		// 3.绘制干扰线
		for (int i = 0; i < lineSize; i++) {
			drawLine(graphics);
		}
		// 4.绘制随机字符
		String str = "";
		for (int i = 0; i < randomSize; i++) {
			str = drawString(graphics, str, i);
		}
		// 5.加入session
		request.getSession().removeAttribute(RANDOMCODEKEY);
		request.getSession().setAttribute(RANDOMCODEKEY, str.toLowerCase()); // 全部加入小写字符
		System.out.println(str.toLowerCase());
		// 6.处理绘制类
		graphics.dispose();

		// 7.输出到客户端
		try {
			ImageIO.write(image, "JPEG", response.getOutputStream());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	/**
	 * 绘制字符串
	 * 
	 * @param graphics
	 * @param randomStr
	 * @param i
	 * @return
	 */
	private String drawString(Graphics graphics, String str, int i) {
		graphics.setFont(getFont());
		graphics.setColor(new Color(random.nextInt(101), random.nextInt(111),
				random.nextInt(121)));
		String rand = String.valueOf(getRandomStr(random.nextInt(randomString
				.length())));
		str += rand;
		graphics.translate(random.nextInt(3), random.nextInt(3));
		graphics.drawString(rand, 13 * i, 16);
		return str;
	}

	/**
	 * 通过随机数截取字符
	 * 
	 * @param num
	 * @return
	 */
	public String getRandomStr(int num) {
		return String.valueOf(randomString.charAt(num));
	}

	/**
	 * 绘制干扰线
	 * 
	 * @param graphics
	 */
	private void drawLine(Graphics graphics) {
		int x1 = random.nextInt(width);
		int y1 = random.nextInt(height);
		int x2 = random.nextInt(13) + x1;
		int y2 = random.nextInt(15) + y1;
		//绘制一条干扰线,从(x1,y1)坐标到,(x2,y2)坐标
		graphics.drawLine(x1, y1, x2, y2);
	}

	public static void main(String[] args) {
		System.out.println();
	}
}

 ImageServlet.java

package com.checkcode.servlet;

import java.io.IOException;

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

public class ImageServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("image/jpeg");
		// 设置相应类型,告诉浏览器输出的内容为图片
		response.setHeader("Pragma", "No-cache");
		// 设置响应头信息,告诉浏览器不要缓存此内容
		response.setHeader("Cache-Control", "no-cache");
		response.setDateHeader("Expire", 0);
		RandomValidateCode randomValidateCode = new RandomValidateCode();
		try {
			randomValidateCode.getRandomImage(request, response);
			// 输出图片方法
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		doGet(req, resp);
	}

}

 randomCode.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
	function refresh(obj) {
		obj.src = "imageServlet?" + Math.random();
	}
</script>
</head>
<body>
	<form action="xxxServlet" method="post">
		<label>输入验证码</label><br /> 
                <input type="text" />
                <img title="点击更换" onclick="javascript:refresh(this);" src="imageServlet"><br />
		<input type="submit" value="登陆">
	</form>
</body>
</html>

 web.xml添加servlet配置

	<servlet>
		<servlet-name>imageServlet</servlet-name>
		<servlet-class>com.checkcode.servlet.ImageServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>imageServlet</servlet-name>
		<url-pattern>/imageServlet</url-pattern>
	</servlet-mapping>

 

你可能感兴趣的:(生成验证码,随机验证码,java随机验证码,验证码生成,登陆验证码)