验证码实现

本文提供了一个使用Java Servlet生成验证码的示例代码。该代码通过随机生成四位数字和字母组合,并将其绘制在一个66x20像素的图片上。此外,还介绍了如何在JSP页面中调用Servlet来显示验证码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关键字:验证码的实现


servlet代码:


package com.sinosoft.edu.common;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

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;

/**
* 验证码 生成
* @author linzhen
*
*/
public class ValidateCodeServlet extends HttpServlet {

private static int WIDTH = 66;
private static int HEIGHT = 20;
private static int LENGTH = 4;

protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {

this.doPost(req, resp);
}


protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

HttpSession session = request.getSession();

response.setContentType("image/jpeg");

ServletOutputStream sos = response.getOutputStream();

//设置浏览器不要缓存此图片
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);

//创建内存图象并获得其图形上下文
BufferedImage image =
new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);

Graphics g = image.getGraphics();

//产生随机的认证码
char [] rands = generateCheckCode();

//产生图像
drawBackground(g);

drawRands(g,rands);

//结束图像的绘制过程,完成图像
g.dispose();

//将图像输出到客户端
ByteArrayOutputStream bos = new ByteArrayOutputStream();

ImageIO.write(image, "JPEG", bos);

byte [] buf = bos.toByteArray();

response.setContentLength(buf.length);

//下面的语句也可写成:bos.writeTo(sos);
sos.write(buf);
bos.close();
sos.close();
//System.out.print("*validateCodeservlei");
//将当前验证码存入到Session或者数据库中,下一个表单处理中验证客户端提交的验证码是否正确
session.setAttribute("check_code",new String(rands));
}

private static char [] generateCheckCode()
{
//定义验证码的字符表
String chars = "23456789ABCDEFGHKMNPQRSTUVWXYZ";

char [] rands = new char[LENGTH];
for(int i=0; i<LENGTH; i++)

{
int rand = (int)(Math.random() * 30);
rands[i] = chars.charAt(rand);
}

return rands;
}

private void drawRands(Graphics g , char [] rands)
{
g.setColor(Color.BLACK);
g.setFont(new Font(null,Font.ITALIC|Font.BOLD,18));

//在不同的高度上输出验证码的每个字符
g.drawString("" + rands[0],1,17);
g.drawString("" + rands[1],16,15);
g.drawString("" + rands[2],31,18);
g.drawString("" + rands[3],46,16);
// g.drawString("" + rands[4],61,14);
// g.drawString("" + rands[5],76,19);

// //System.out.println(rands);
}

private void drawBackground(Graphics g)

{
//画背景
g.setColor(new Color(0xDCDCDC));
g.fillRect(0, 0, WIDTH, HEIGHT);

//随机产生120个干扰点
for(int i=0; i<120; i++)

{
int x = (int)(Math.random() * WIDTH);

int y = (int)(Math.random() * HEIGHT);

int red = (int)(Math.random() * 255);

int green = (int)(Math.random() * 255);

int blue = (int)(Math.random() * 255);

g.setColor(new Color(red,green,blue));

g.drawOval(x,y,1,0);

}

//加两条干扰线
g.drawLine(0, 5, 90, 5);
g.drawLine(0, 15, 90, 15);

}

}


jsp代码:


<img width="66" height="20" onclick="changeImg();" style="cursor:hand;" title='看不清楚? align="middle" id='imgsrc' src="ImgValidateServlet" />


附件是一个完整的工程,不过是我个性的设置,大家可以根据这个例子自己改一下!!!

至于字体(附件有 验证码支持的字体)、颜色、几位数、图片大小 等问题 自己修改 servlet内容即可!!!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值