针对“java实用验证码的实现代码”的完整攻略,我将以下面几个部分进行详细讲解:
- 验证码介绍:了解什么是验证码以及它的作用。
- 验证码实现思路:介绍如何实现验证码的代码。
- 验证码实现示例:提供两个示例说明。
1. 验证码介绍
验证码全称为“Completely Automated Public Turing test to tell Computers and Humans Apart”,中文翻译为“全自动区分计算机和人类的图灵测试”,是为了防止恶意攻击、垃圾邮件、机器人等等而产生的一种人机识别技术。实现原理是:生成一张随机的包含数字、字母的图片,要求用户在图片中识别出特定的验证码,如果用户识别正确则算验证通过,否则就需要继续输入验证码,直到正确为止。通过使用验证码,可以有效遏制一些自动化的恶意攻击,提高系统的安全性。
2. 验证码实现思路
以下是验证码实现的思路:
- 随机生成字符串:随机生成一组包含数字、字母的字符串,可以通过Java中的Random类实现。
- 字符串生成图片:将随机生成的字符串绘制到一张图片上,可以通过Java中的Graphics类实现。
- 图片输出:将生成的图片输出到页面上,可以通过response.getOutputStream()实现。
- 验证码存储:将生成的验证码字符串保存到Session中,可以通过request.getSession().setAttribute()实现。
- 用户输入验证:用户在登录或者注册时输入生成的验证码字符串,通过与Session中存储的验证码字符串进行比对,判断是否通过验证。
3. 验证码实现示例
以下是两个生成验证码的示例。
示例一
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
String code = randomCode();//生成随机码
BufferedImage img = generateImage(code);//生成图片
HttpSession session = request.getSession();
session.setAttribute("checkcode", code);//保存随机码到Session中
response.setContentType("image/png");
OutputStream os = response.getOutputStream();
ImageIO.write(img, "png", os);//生成图片输出到磁盘
os.close();
}
private String randomCode() {
String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
Random random = new Random();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 4; i++) {
int index = random.nextInt(str.length());
sb.append(str.charAt(index));
}
return sb.toString();
}
private BufferedImage generateImage(String code) {
int width = 80;//图片的宽度
int height = 30;//图片的高度
BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics g = img.getGraphics();
g.setColor(Color.WHITE);//设置背景色
g.fillRect(0, 0, width, height);
g.setColor(Color.BLACK);//设置字体色
Font font = new Font("宋体", Font.BOLD, 20);
g.setFont(font);
//生成随机字符
for (int i = 0; i < code.length(); i++) {
g.drawString(String.valueOf(code.charAt(i)), 20 * i + 8, 22);
}
//画干扰线
Random random = new Random();
for (int i = 0; i < 6; i++) {
int x1 = random.nextInt(width);
int y1 = random.nextInt(height);
int x2 = random.nextInt(width);
int y2 = random.nextInt(height);
g.drawLine(x1, y1, x2, y2);
}
g.dispose();
return img;
}
示例二
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
String code = randomCode();//生成随机码
BufferedImage img = generateImage(code);//生成图片
HttpSession session = request.getSession();
session.setAttribute("checkcode", code);//保存随机码到Session中
response.setContentType("image/png");
OutputStream os = response.getOutputStream();
try {
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(os);//将图片以JPEG格式输出
encoder.encode(img);
} catch (Exception e) {
e.printStackTrace();
} finally {
os.flush();
os.close();
}
}
private String randomCode() {
String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
Random random = new Random();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 4; i++) {
int index = random.nextInt(str.length());
sb.append(str.charAt(index));
}
return sb.toString();
}
private BufferedImage generateImage(String code) {
int width = 85;//图片的宽度
int height = 30;//图片的高度
BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics g = img.getGraphics();
g.setColor(Color.white);//设置背景色
g.fillRect(0, 0, width, height);
g.setColor(Color.BLACK);//设置字体色
Font font = new Font("楷体", Font.BOLD, 24);
g.setFont(font);
//生成随机字符
for (int i = 0; i < code.length(); i++) {
g.drawString(String.valueOf(code.charAt(i)), 20 * i + 9, 23);
}
//画干扰线
Random random = new Random();
for (int i = 0; i < 6; i++) {
int x1 = random.nextInt(width);
int y1 = random.nextInt(height);
int x2 = random.nextInt(width);
int y2 = random.nextInt(height);
g.drawLine(x1, y1, x2, y2);
}
g.dispose();
return img;
}
以上是两个生成验证码的示例代码,可以按照需求进行修改和调整。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java实用验证码的实现代码 - Python技术站