看了其他人写的验证码程序,于是自己写了个很小的,因为字母就是用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生成四位随机数,包含数字和字母 区分大小写,特别适合做验证码,android开发
本文档讲述了如何使用java来随机的生成验证码
java随机产生验证码,可以随机生成数字、大写字母、小写字母。还可以随机生成文字字体、及大小。在图片上面可能字体都不不同、大小不等。
随机生成手机验证码的java源码文件,结果是在后台输出,可根据选择生成几位随机码或者随机码是否带有字母。
随即生成指定位数的验证码.可输出到页面
android java 获取随机4位验证码(包含大小写字母,数字,不重复)
为了防止某些用户使用软件进行登录和发布信息,很多网站在用户登录或者发布信息时,都要求用户输入验证码。验证码通常是以一幅图片的形式显示的...由于验证码都是随机生成的,自动发布信息的软件无法知道生成的验证码。
csdn上三种java验证码生成方法,以及谷歌开源验证码,总共四...3. 汉字验证码,噪点,未加扭曲(未使用字符集,随机生成汉字) 4. 谷歌开源验证码 只对第一种方法写了验证,后三种方法只有验证图片生成,验证方法同一。
验证码由大小写字母、数字字符组成。 * 48~57(0-9) * 65~90(A-Z) * 97~122(a-z)
java生成随机数字和字母验证码,
使用SpringBoot搭建,jdk1.8,layui前端框架。验证码图片文字随机生成,可以选择中文、字母、数字、字母数字的组合。可以根据自己的需要进行修改。
java随机产生验证码,可以随机生成数字、大写字母、小写字母。还可以随机生成文字字体、及大小。在图片上面可能字体都不不同、大小不等
java 生成随机图片验证码 ,字母数组随机组合,加干扰线
在我们项目中间经常会用到验证码...这是一个生成验证码的例子,直接可以用在项目中...生成带条纹的含有字母和数字的随机验证码!
java随机生成四位验证码 数字大小写字母
在JSP页面中产生随机验证码的小例子 在JSP页面中产生随机验证码的小例子
验证码的作用:有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试,实际上是用验证码是现在很多网站通行的方式(比如招商银行的网上个人银行,腾讯的QQ社区),我们利用比较简易的方式...
Java代码-自动生成70*35大小的验证码,并保存到你想要的路径,同时返回验证码的字符内容以便用于验证。 验证码范围:23456789...随机生成不同颜色、大小、斜体、粗体,并加有三条干扰线