1.java工具类的编写,该工具类生成验证码.
package com.isoftstone.util;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.util.Random;
/**
* 工具类,生成验证码.
* @author 浮生若梦
*/
public class IdentifyingUtil {
/**
* 定义数组常量,比较难识别的比如 1,l,o,0,不再其中.
*/
private static final char[] CHAR_ARRAY = "ASDqwertyuipkjhgfdsazxcvbnm23456789".toCharArray();
/**
* 定义Random对象,因为下面多次 用到,避免内存浪费.
*/
private static Random random = new Random();
/**
* 生成一张随机验证码图片返回.
*/
public static BufferedImage getIdentifyingImage(String identifying){
//1.设置图片的宽度,高度.
int width = 100;
int height = 30;
//2.创建图片对象.
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
//3.创建画笔对象,绘图生成图片.
Graphics2D gra = image.createGraphics();
//3.1 绘制背景色.
Color color = getBackgroundColor();
gra.setColor(color);
gra.fillRect(0, 0, width, height);
//3.2绘制字体颜色,字体大小.
Font font = new Font(Font.SANS_SERIF, Font.BOLD, 18);
gra.setFont(font);
gra.setColor(getForegroundColor(color));
gra.drawString(identifying, 22, 22);
//3.3绘制噪点.
int length = new Random().nextInt(100);
for (int i = 0; i < length; i++) {
gra.drawRect(random.nextInt(width),random.nextInt(height),1,1);
}
return image;
}
/**
* 获取随机数的方法.
* @return 随机出来的6位字符串.
*/
public static String getIdentifyingCode(){
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < 6; i++) {
buffer.append(CHAR_ARRAY[random.nextInt(CHAR_ARRAY.length)]);
}
return buffer.toString();
}
/**
* 生产随机颜色,做背景色用.
* @return 背景色.
*/
public static Color getBackgroundColor(){
return new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255));
}
/**
* 生成背景色的反色,防止背景和字体颜色一致.
* @param 背景颜色.
* @return 字体颜色.
*/
public static Color getForegroundColor(Color color){
return new Color(255-color.getRed(), 255-color.getGreen(), 255-color.getBlue());
}
}
2.servlet的编写,设置响应格式,将验证码图片输出到前端页面.
package com.isoftstone.servlet;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.isoftstone.util.IdentifyingUtil;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
public class IdentifyingServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.设置相应类型.
resp.setContentType("image/jpeg");
//2.获取输出流.
OutputStream out = resp.getOutputStream();
//3.获取生成的字符串保存在session中,和用户输入的作比较,此处省略.
String identify = IdentifyingUtil.getIdentifyingCode();
BufferedImage image = IdentifyingUtil.getIdentifyingImage(identify);
//4.在前端页面显示的方式一.
//ImageIO.write(image, "JPEG", out);
//在前端页面显示的方式二.
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(image);
out.flush();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
3.web.xml的配置,访问servlet的路径.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<!-- servlet的配置 -->
<servlet>
<servlet-name>identifying</servlet-name>
<servlet-class>com.isoftstone.servlet.IdentifyingServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>identifying</servlet-name>
<url-pattern>/identifying</url-pattern>
</servlet-mapping>
</web-app>
4.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>
</head>
<body>
<script type="text/javascript">
function changeImg() {
document.getElementById("ident").src="identifying?ts="+new Date().getTime();
}
</script>
<img id="ident" src="identifying">
<button value="" οnclick="changeImg()">看不清换一张</button>
</body>
</html>
5.测试结果.