CodeServlet验证码servlet
package com.hr.servlet;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
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;
public class CodeServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 定义宽度和高度
int width = 80;
int height = 25;
// 定义当前图片类型(设置高度和宽度)
BufferedImage bi = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
// 设置一个画板(空白面板)
Graphics gp = bi.getGraphics();
// 一.做一个背景色
// a.设置一个颜色
gp.setColor(Color.white);
// b.填充颜色到画板(背景色)
gp.fillRect(0, 0, width, height);
// 二.做一个边框
// a.设置一个颜色
gp.setColor(Color.GRAY);
// b.绘制边框(描边)
gp.drawRect(0, 0, width - 1, height - 1);
// 三.产生随机的4位数的数字英文字母
String codes = "";
Random ran = new Random();
// a.准备好数字和字母
String str = "1234567890qwertyuiopasdfghjklzxcvbnm";
// b.设置字体的大小
gp.setFont(new Font("微软雅黑", Font.BOLD, 25));
// c.随机产生四个字符
for (int i = 1; i <= 4; i++) {
// 只要产生的随机下标不超过str字符串的长度即可
int ran_index = ran.nextInt(str.length());
// str.charAt(ran_index) 获取随机下标返回的字符
// String.valueOf 将字符转换字符串类型(方便处理)
String temp = String.valueOf(str.charAt(ran_index));
// 循环拼接四个字符
codes += temp;
// d.产生一个字符就写入(画在画板上)一个字符
// 颜色随机产生,三原色的取值范围0-255
int r = ran.nextInt(256);
int g = ran.nextInt(256);
int b = ran.nextInt(256);
// 通过三个不同颜色,产生一个新的颜色画笔
gp.setColor(new Color(r, g, b));
// 将字符画在面板上
gp.drawString(temp, i * 13, 22);
}
for (int i = 1; i <= 8; i++) {
// 颜色随机产生,三原色的取值范围0-255
int r = ran.nextInt(256);
int g = ran.nextInt(256);
int b = ran.nextInt(256);
// 通过三个不同颜色,产生一个新的颜色画笔
gp.setColor(new Color(r, g, b));
// 画入画板上
gp.drawLine(ran.nextInt(width), ran.nextInt(height), ran
.nextInt(width), ran.nextInt(height));
}
//****************************将完整的验证码放入session****************************
System.out.println("产生的验证码 : "+codes);
HttpSession session = req.getSession();
session.setAttribute("codes", codes);
// 服务器响应字节流
ServletOutputStream os = resp.getOutputStream();
// 写图片流(画板,文件类型,字节流)
ImageIO.write(bi, "jpg", os);
}
}
jsp页面
<body>
<form action="LoginServlet" method="post">
<table width="330px" border="0">
<tr>
<td class="txt_right">
用户名 :
</td>
<td>
<input type="text" name="name" />
</td>
<td></td>
</tr>
<tr>
<td class="txt_right">
密码 :
</td>
<td>
<input type="password" name="pwd" />
</td>
<td></td>
</tr>
<tr>
<td class="txt_right">
验证码 :
</td>
<td>
<input type="text" name="code" />
</td>
<td>
<!-- 图片src直接填入一个servlet,该servlet会响应一张图片response -->
<img src="CodeServlet" onclick="change_img(this)" style="cursor: pointer;"/>
</td>
</tr>
<tr>
<td></td>
<td colspan="2" style="color: red"><!-- 错误提示 -->
<input type="submit" value="登录" /> ${msg}
</td>
</tr>
</table>
</form>
<script type="text/javascript">
function change_img(t){
//缓存导致src的改变没有效果,它认为此方法的CodeServlet和原src="CodeServlet"是同一个
//欺骗浏览器,让每一次src的路径都不同,因为new Date().getTime();会让每次产生的时间都不同
t.src="CodeServlet?xxx="+new Date().getTime();
}
</script>
</body>
另外需要导入
standard.jar包,验证码注释又不懂的加我微信15717500810沟通交流