用来实现网页中的随机验证码功能,当然,只是实现了该出现功能,并没有实现判断对错功能,要做的话其实也是很简单的。
package servlet;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
/**
* @author Chalmers
* @version 创建时间:2016年3月10日 下午7:41:25
*/
public class ImageServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
// 随机出现的字符
private static final String CHARS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
static Random random = new Random();
// 字符长度为6
private static final int NUM = 6;
/**
* 获得随机字符串
*
* @return String
*/
private String getRandomString() {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < NUM; i++) {
// 追加
sb.append(CHARS.charAt(random.nextInt(CHARS.length())));
}
return sb.toString();
}
/**
* 返回字体颜色
*
* @return Color
*/
private Color getFontColor() {
Color c = null;
// 采用rgb形式的颜色,随机生成三个小于255的整数
c = new Color(random.nextInt(255), random.nextInt(255),
random.nextInt(255));
return c;
}
/**
* 获得背景颜色
*
* @return Color
*/
private Color getBgColor(Color c) {
// 采用与字体不一样的颜色
// 为了避免字体与背景颜色一样,而影响观察
return new Color(255 - c.getBlue(), 255 - c.getGreen(),
255 - c.getRed());
}
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// 得到session对象,用来存储随机字符串的值
HttpSession session = request.getSession(true);
response.setContentType("image/jpeg");
// 得到随机字符串
String randomString = getRandomString();
session.setAttribute("randomString", randomString);
// 设置图片的宽和高
int width = 90;
int height = 30;
// 得到字体颜色
Color fontColor = getFontColor();
// 得到背景颜色
Color bgColor = getBgColor(fontColor);
// 创建一个图片对象(该图片放置在内存中)
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_BGR);
// 创建绘图对象,从image得到绘图对象,会把数据绘制到image上
Graphics2D g = image.createGraphics();
// 设置字体样式
g.setFont(new Font("宋体", Font.BOLD, 24));
// 设置背景颜色
g.setColor(bgColor);
// 对图片进行填充
g.fillRect(0, 0, width, height);
// 设置字体颜色
g.setColor(fontColor);
// 在图片上绘制字符串
for (int i = 0; i < randomString.length(); i++) {
g.drawString(randomString.charAt(i) + "", 8 + i * 12, 22);
}
// 画出干扰点
for (int i = 0, n = random.nextInt(100); i < n; i++) {
// 设置点的位置以及大小
g.fillRect(random.nextInt(width), random.nextInt(height), 1, 1);
}
// 将图片输出到浏览器中
ServletOutputStream outStream = response.getOutputStream();
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(outStream);
encoder.encode(image);
outStream.flush();
outStream.close();
}
}
在网页中使用
<%@ 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>
</head>
<body>
<img src="ImageServlet" />
</body>
</html>
当然,要记得在xml文件中配置servlet
<servlet> <servlet-name>ImageServlet</servlet-name> <servlet-class>servlet.ImageServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>ImageServlet</servlet-name> <url-pattern>/ImageServlet</url-pattern> </servlet-mapping>