看了其他人写的验证码程序,于是自己写了个很小的,因为字母就是用ASCii码表示的,那么可以使用int值直接生成就可以了,这样程序很简单,执行效率也很高。
1 ImageOut.java 复则产生验证码
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.util.Random;
public class ImageOut {
private static final int WIDTH = 62;
private static final int HEIGHT = 20;
private static Color getRandomColor() {
Random random = new Random();
return new Color(50 + random.nextInt(100), 50 + random.nextInt(100),
50 + random.nextInt(100));
}
private static int getRandomBgInt() {
Random random = new Random();
return 180 + random.nextInt(60);
}
private static Font getRandomFont() {
Random random = new Random();
return new Font("Times New Roman", Font.PLAIN, 10 + random.nextInt(8));
}
public static char getRandomChar() {
Random random = new Random();
if (random.nextInt(5) < 3) {
return (char) (65 + random.nextInt(26));
}
return (char) (97 + random.nextInt(26));
}
public static Pair<String, BufferedImage> getImage() {
BufferedImage image = new BufferedImage(WIDTH, HEIGHT,
BufferedImage.TYPE_INT_RGB);
Graphics2D g = image.createGraphics();
g.setColor(new Color(255, getRandomBgInt(), 255));
g.fillRect(0, 0, WIDTH, HEIGHT);
StringBuilder s = new StringBuilder();
for (int i = 0; i < 4; i++) {
String t = String.valueOf(getRandomChar());
s.append(t);
g.setColor(getRandomColor());
g.setFont(getRandomFont());
g.drawString(t, 3 + 16 * i, 18);
}
g.dispose();
return new Pair<String, BufferedImage>(s.toString(), image);
}
}
2 上面使用了Pair类,使用Map也可以的,只不过Java里的类都几千行代码的,自己写个可以节约些资源:
Pair.java
public class Pair<K, E> {
private K key;
private E value;
public Pair() {
}
public Pair(K key, E value) {
this.key = key;
this.value = value;
}
public K getKey() {
return key;
}
public void setKey(K key) {
this.key = key;
}
public E getValue() {
return value;
}
public void setValue(E value) {
this.value = value;
}
}
3 在jsp环境中使用上面的程序:
3.1 首先写个为当前用户生成验证码的jsp页面:
ValidateImage.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@page import="java.awt.image.BufferedImage,javax.imageio.ImageIO" %>
<%@page import="com.bookshop.util.Pair,com.bookshop.util.ImageOut" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<%
response.setContentType("image/jpeg");
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
Pair<String, BufferedImage> p = ImageOut.getImage();
ImageIO.write(p.getValue(), "JPEG", response.getOutputStream());
session.setAttribute("valid", p.getKey());
%>
3.2 在登录注册的页面中调用:
比如login.jsp
<form id="form1" name="form1" method="post" action="<%=path%>/bookshop/login.jsp">
<input type="hidden" name="op" value="login" readonly="readonly" />
<label></label>
<p>
<label></label>
</p>
<p class="STYLE1">用户登录</p>
<table width="317">
<tr>
<td width="100"><span class="STYLE2">登录名称:</span></td>
<td width="200"><input class="field" type="text" name="username" /></td>
</tr>
<tr>
<td><span class="STYLE2">登陆密码:</span></td>
<td><input class="field" type="password" name="password" /></td>
</tr>
<tr>
<td rowspan="2"><span class="STYLE2">验证码:</span></td>
<td>
<input class="field" type="text" name="yanzhm" />
</td>
</tr>
<tr>
<td><img alt="看不清?单击更换!" src="<%=path%>/bookshop/ValidateImage.jsp" onclick="changeValidateCode(this)"/> </td>
</tr>
<tr>
<td>
<input class="tijiao" type="submit" name="Submit" value="登 录" />
</td>
<td style="text-align:right">
<input type="reset" name="Submit" value="重 置" />
</td>
</tr>
</table>
</form>
上面调用了一个能刷新验证码的js代码:如下
<script type="text/javascript">
function changeValidateCode(obj) {
var timenow = new Date().getTime();
obj.src="<%=path%>/bookshop/ValidateImage.jsp?d="+timenow;
}
</script>
在验证逻辑处只需获取验证就可以了:
String yanzhm = request.getParameter("yanzhm");
String valid = (String) session.getAttribute("valid");
if (!yanzhm.equalsIgnoreCase(valid)) {
request.setAttribute("info", "验证码输入错误,请重新输入!");
request.getRequestDispatcher("/bookshop/error.jsp").forward(request, response);
return;
}
4 在servlet中使用与此类似,此处省略!
分享到:
相关推荐
随机验证码。 - 随机生成十组六位字符组成的验证码。 - 验证码由大小写字母、数字字符组成。
用java编写的四位随机的验证码,包括数字跟字母 简单易懂
### Java随机生成数字和字母知识点解析 #### 一、引言 在Java编程语言中,随机生成数字和字母是一项常用的技术。它广泛应用于密码生成、验证码生成、游戏开发等场景。本文将通过一个简单的示例程序来介绍如何使用...
在这个问题中,我们关注的是如何生成四位字符且无重复的验证码,以及如何进一步确保相邻字符不重复的实现方法。 1. 生成四位字符、整数组成的验证码(无重复码验证) 首先,我们需要一个包含所有可能字符的数组,...
例如,如果我们想要生成4位数字的验证码,可以创建一个`Random`对象,并调用`nextInt(10)`方法四次,每次都在0到9之间获取一个随机整数。为了确保验证码不重复,可以将生成的数字存储在一个数组中,并检查新生成的...
在画布上绘制随机生成的字符串,每个字符的位置和颜色都是随机的,这样可以增加识别难度。使用`Font`类创建不同样式和大小的字体,然后用`Graphics2D`的`drawString()`方法绘制。 6. **保存为图像**: 使用`...
根据给定的文件信息,我们将深入探讨如何使用Java语言生成随机数字及验证码,尤其是在网络验证、安全性增强等场景中的应用。下面将详细解析文件中提到的关键知识点,包括使用`java.security.SecureRandom`类和`java....
java生成四位随机数,包含数字和字母 区分大小写,特别适合做验证码,android开发
本篇文章将详细解析如何通过Java语言实现一个功能,即随机生成包含字母和数字的10位随机字符串。 #### 核心需求分析 根据题目描述,我们需要实现的功能是生成一个由字母和数字组成的10位随机字符串。这里的字母只...
Java 随机生成图片验证码是一种常见的网络安全技术,主要用于防止自动化程序(如机器人)进行恶意操作,例如批量注册、刷票等。在这个过程中,我们通常会创建一个包含随机字符的字符串,然后将其显示为带有扭曲、...
java随机产生验证码,可以随机生成数字、大写字母、小写字母。还可以随机生成文字字体、及大小。在图片上面可能字体都不不同、大小不等。
随机生成手机验证码的java源码文件,结果是在后台输出,可根据选择生成几位随机码或者随机码是否带有字母。
### 随机生成11位数字 #### 1. 理解需求 在给定的代码片段中,我们看到一个名为`getRandomString`的方法,其目的是生成一个长度为11的随机字符串。这个字符串包含数字和字母,但根据题目描述,我们需要的是一个纯...
这个“随机生成验证码工具jar包”是一个Java编写的程序库,它能够帮助开发者快速地在他们的应用中集成验证码功能。让我们深入了解一下这个jar包以及与之相关的Java和jar文件的知识。 首先,Java是一个广泛使用的...
本教程将详细介绍如何使用Java编程语言来实现随机生成用户密码和验证码的功能。 首先,我们来讨论随机生成用户密码的方法。一个良好的用户密码生成策略应该考虑到以下几个因素: 1. **复杂度**:密码应包含大小写...
随即生成指定位数的验证码.可输出到页面
1. **随机数生成**:验证码通常由一组随机生成的字符组成,可以是数字、字母或者是两者的混合。Java中的`Random`类可以用于生成随机数,然后结合字符集(如ASCII或Unicode)来得到随机字符。 2. **图像处理**:Java...
验证码通常包含一组随机生成的字符,这些字符可以是中文、字母、数字或它们的组合。在Java中,可以使用`java.util.Random`类来生成随机数,然后通过字符集映射将这些数字转化为对应的字符。例如,如果要生成数字...
1. **随机字符生成**:验证码由一组随机字符组成,可以是数字、字母,也可以包括中文字符。在Java中,可以使用`java.util.Random`类生成随机数,配合字符数组来生成随机字符。 2. **图像创建**:生成的验证码需要...
本文将深入探讨如何使用JSP(JavaServer Pages)来生成随机验证码。 验证码的核心在于生成难以被机器识别的随机字符串或图像,同时确保服务器端能够正确验证用户输入的验证码。JSP提供了丰富的功能,可以方便地实现...