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
pageEncoding="UTF-8"%>
Insert title herefunction refresh(obj) {
obj.src = "imageServlet?" + Math.random();
}
输入验证码
web.xml添加servlet配置
imageServlet
com.checkcode.servlet.ImageServlet
imageServlet
/imageServlet