javaweb之图片验证码功能
1.图片验证码生成类
直接拷贝到自己的项目即可
@WebServlet("/checkCode")
public class CheckCodeServlet extends HttpServlet{
private int width = 80;
private int height = 30;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// step1: 使用画笔画出一张验证码图片
// 1. 创建一个图片对象(可当作一个空白画布)
BufferedImage image =
new BufferedImage( width, height, BufferedImage.TYPE_INT_RGB );
// 2. 获得画笔
Graphics g = image.getGraphics();
// 3. 给画笔设置一个随机色
Random r = new Random();
Color c = new Color( 155+r.nextInt(100),
155+r.nextInt(100), 155+r.nextInt(100) );
g.setColor( c );
// 4. 给图片画一个背景颜色
g.fillRect(0, 0, width, height);
// 5. 画随机数
//String number = r.nextInt(99999) + "";
/*
String number = getNumber(5);
g.setColor( Color.BLACK );
g.setFont( new Font(null,
Font.BOLD | Font.ITALIC, 20) );
g.drawString( number, 5, 24 );
*/
// 设置每个字符的字体
String number = getNumber(5);
for( int i=0; i<5; i++ ){
char ch = number.charAt(i);
// 设置一个随机颜色
c = new Color( r.nextInt(155), r.nextInt(155), r.nextInt(155) );
g.setColor( c );
// 设置一个随机字体
int h = (int)(10+20*Math.random());
g.setFont( new Font(null,
Font.BOLD | Font.ITALIC, h) );
// 设置字符画在画布中随机高度的位置(整个图片高度是30)
g.drawString( ""+ch, width/5*i, h);
}
// 6. 加一些干扰线
g.setColor(Color.black);
for( int i=0; i<10; i++ ){
g.drawLine( r.nextInt(80), r.nextInt(30),
r.nextInt(80), r.nextInt(30) );
}
// 7.============== 将随机验证码绑定到session对象中==================
HttpSession session = request.getSession();
session.setAttribute("number", number);
System.out.println("验证码:" + number);
// step2:将动态生成的图片压缩后输出到浏览器
// 1. 设置Content-type消息头,告诉浏览器数据是
// 一张jpeg格式的图片
response.setContentType("image/jpeg"); // text/html
// 2.===========获得响应的字节输出流(要输出的是图片)===========
OutputStream os = response.getOutputStream();
// 3. 将原始图片按照指定压缩格式jpeg进行压缩,
// 然后将压缩后生成的数据通过os输出到response对象上。
// 服务器会从response对象上取出数据,打包发送给浏览器
ImageIO.write(image, "jpeg", os);
os.close();
}
/** 返回一个字符串,长度是参数size决定,随机字符a-zA-Z0-9 */
private String getNumber(int size) {
String str = "abcdefhjkmnprstuvwxyABCDEFGHJKLMN"
+ "PQRSTUVWXY3456789";
StringBuilder buf = new StringBuilder();
Random r = new Random();
for (int i = 0; i < size; i++) {
int index = r.nextInt( str.length() );
char c = str.charAt(index);
buf.append( c );
}
return buf.toString();
}
}
2.将图片响应给页面
<p>
<img src="checkCode" alt="" id="img1"
onclick="this.src='checkCode?'+Math.random()">
<a href="javascript:;"
onclick="document.getElementById('img1').src='checkCode?'+Math.random()">看不清</a>
</p>