验证码的随机产生

最近做项目时,接触了登录验证码生成问题,现在跟大家分享下!

这是自己写的一个简单的demo:

登陆界面index.jsp
<
%@page contentType="text/html;charset=GBK"%>
<html>
<head>
<title>用户登录</title>
</head>
<body>
<div align="center"><!-- 登录表单 -->
<h1><font color="#FF0000"><strong>登录</strong></font></h1>
<form name="form" method="post" action="login.jsp">
<table>
<tr>
<td align="right"><strong>姓名:</strong></td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td align="right"><strong>密码:</strong></td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td align="right"><strong>随机验证码:</strong></td>
<td><input type="text" name="validatingString" size="10">&nbsp;<img
src="randomImage.jsp" align="top"/></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" name="Submit"
value="提交"> &nbsp; &nbsp; <input type="reset" name="reset"
value="重置"></td>
</tr>
</table>
</form>
</div>
</body>
</html>
其中randomImage.jsp是产生验证码的,代码如下
<%@ page contentType="image/jpeg;charset=GBK"%>
<%@ page import="java.awt.*"%>
<%@ page import="java.awt.image.*"%>
<%@ page import="java.util.*"%>
<%@ page import="javax.imageio.*"%>
<!-- 在指定的数值范围内生成一种随机色 -->
<%!Color getRandColor(int lower, int upper) {
//创建随机数类变量
Random random = new Random();
//防止数值范围出界
lower = (lower < 0 || lower > 255) ? 0 : lower;
upper = (upper < 0 || upper > 255) ? 0 : upper;
//生成红绿蓝三种基本色的随机数值
int r = lower + random.nextInt(upper - lower);
int g = lower + random.nextInt(upper - lower);
int b = lower + random.nextInt(upper - lower);
//返回生成的随机色
return new Color(r, g, b);
}%>
<%
//图片的初始大小
int width = 60;
int height = 20;
//创建缓冲图片
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
//获取缓冲图片的绘图类变量
Graphics g = image.getGraphics();
//设置前景色(为较亮的一种随机色)
g.setColor(getRandColor(200, 255));
//使用该色填充背景
g.fillRect(0, 0, width, height);
//创建随机数类变量
Random random = new Random();
//产生100条具有随机位置、随机长度和随机颜色的干扰直线,使图象中的认证码不易被其它程序识别出来?
for (int i = 0; i < 100; i++) {
//设置前景色(为灰度中等的一种随机色)
g.setColor(getRandColor(150, 200));
//获取随机位置
int x1 = random.nextInt(width);
int y1 = random.nextInt(height);
//获取随机长度
int x2 = random.nextInt(10);
int y2 = random.nextInt(10);
//绘制直线
g.drawLine(x1, y1, x1 + x2, y1 + y2);
}
//设定字体
g.setFont(new Font("Times New Roman", Font.PLAIN, 18));
//获取1000到9999之间的四位随机整数
int randomInt = 1000 + random.nextInt(9000);
//转换为字符串
String randomStr = String.valueOf(randomInt);
//循环遍历字符串每个字符
for (int i = 0; i < randomStr.length(); i++) {
//设置前景色(为较暗的一种随机色)
g.setColor(getRandColor(0, 100));
//显示一个字符
g.drawString(randomStr.substring(i, i + 1), 10 * i + 10, 15);
}
// 将随机数存储在会话属性中,便于其他网页程序判断是否验证成功
session.setAttribute("randomStr", randomStr);
//输出随机数图片
ImageIO.write(image, "JPEG", response.getOutputStream());
%>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值