当我们网站需要进行用户登录、注册等操作时,我们通常需要使用验证码来防止机器人或者是恶意攻击,本文就来详细讲解一下如何使用JSP生成验证码。
当我们网站需要进行用户登录、注册等操作时,我们通常需要使用验证码来防止机器人或者是恶意攻击,本文就来详细讲解一下如何使用JSP生成验证码。
一、验证码的生成方法
验证码的生成方法可以大致划分为以下步骤:
- 生成随机字符串
- 将随机字符串绘制成图片
- 将图片输出到网页上并传输随机字符串的值到后台进行验证
二、实现步骤
1. 生成随机字符串
使用Java的Random类来生成指定长度的随机字符串:
Random random = new Random();
char[] str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".toCharArray();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < length; i++) {
sb.append(str[random.nextInt(str.length)]);
}
String randomStr = sb.toString();
在上述代码中我们生成了一个包含大小写字母和数字的随机字符串,其长度由参数length指定。
2. 将随机字符串绘制成图片
我们可以使用Java的 BufferedImage 类生成图片,使用 Graphics类在图片上绘制字符,实现代码如下:
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
g.setColor(new Color(200, 200, 200));
g.fillRect(0, 0, width, height);
g.setColor(Color.BLACK);
g.setFont(new Font("Times New Roman", Font.PLAIN, fontSize));
g.drawString(randomStr, 5, fontSize);
g.dispose();
在上述代码中,我们首先使用 BufferedImage 类创建一个宽度为width、高度为height的 RGB 图像,然后使用 Graphics 类进行绘图,设置绘图颜色、设置字体尺寸、调用 g.drawString() 方法在图片上绘制随机字符串。
3. 将图片输出到网页上并传输随机字符串的值到后台进行验证
最后一步就是将图片写入到网页上,并将随机字符串的值传输到后台进行验证:
response.setContentType("image/jpeg");//设置返回的是图片类型
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
ServletOutputStream out = response.getOutputStream();
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(image);
out.flush();
//将随机字符串的值存储到session中,用于后面的验证
request.getSession().setAttribute("checkCode", randomStr);
在这里,我们首先设置了response的输出类型为image/jpeg,然后使用JPEGImageEncoder来将图片输出到网页上。同时,将随机字符串的值存储到了session中,用于之后的验证。
三、完整JSP代码示例
1. 生成验证码的JSP页面
下面是一个完整的生成验证码的JSP示例:
<%
int width=90, height=30, fontSize=16;//设定验证码样式
String randomStr = request.getSession().getAttribute("checkCode") == null ? "":(String) request.getSession().getAttribute("checkCode"); //从session中获取之前生成的随机字符串
response.setContentType("image/jpeg");//设置返回的是图片类型
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();
Random random = new Random();
g.setColor(new Color(200, 200, 200));
g.fillRect(0, 0, width, height);
g.setColor(Color.BLACK);
g.setFont(new Font("Times New Roman", Font.PLAIN, fontSize));
StringBuffer sb = new StringBuffer();
for (int i = 0; i < 4; i++) {
String rand = String.valueOf(random.nextInt(10));
sb.append(rand);
g.drawString(rand, (i+1)*18, 20+height/2);
}
randomStr = sb.toString();
g.dispose();
//将随机字符串的值存储到session中,用于后面的验证
request.getSession().setAttribute("checkCode", randomStr);
ServletOutputStream out = response.getOutputStream();
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(image);
out.flush();
%>
在上述代码中,我们首先从 session 中获取之前生成的随机字符串,然后设置了 response 的输出类型,使用 BufferedImage 类创建一个宽度为 width、高度为 height 的 RGB 图像,使用 Graphics 类进行绘图,设置绘图颜色、设置字体尺寸、在图片上绘制随机字符串,最后将随机字符串的值存储到了 session 中,用于之后的验证。
2. 在JSP页面中调用验证码
下面是在 JSP 页面中调用验证码的示例:
<html>
<head>
<meta charset="UTF-8">
<title>验证码示例</title>
</head>
<body>
<form name="loginForm" action="handleLogin.jsp" method="post">
<fieldset>
<legend>用户登录</legend>
<label for="username">用户名:</label>
<input type="text" name="username" id="username">
<br>
<label for="password">密码:</label>
<input type="password" name="password" id="password">
<br>
<label for="checkCode">验证码:</label>
<input type="text" name="checkCode" id="checkCode">
<img src="./checkCode.jsp" onclick="this.src='./checkCode.jsp?'+Math.random()">
<br>
<input type="submit" value="登录">
</fieldset>
</form>
</body>
</html>
在上述代码中,我们向服务器提交了一个表单,其中包含一个文本框和一个图片。图片的 src 属性指向了一个 JSP 页面,通过在图片的 src 属性添加 ?+Math.random() 保证每次请求的图片都是随机的,达到了刷新验证码的效果。
四、总结
以上就是使用JSP生成验证码的完整攻略,实现起来并不复杂,只要掌握了以上三个步骤,便可以轻松生成验证码。值得一提的是,在生成随机字符串时,我们应该避免使用易被猜测到的字符串,比如“123456”、“qwerty”,应使用随机的字符创进行生成。
本文标题为:JSP验证码简单生成方法
基础教程推荐
- 详解Java中Period类的使用方法 2022-11-07
- Spring Cloud oauth2 认证服务搭建过程示例 2023-02-05
- Spring Transaction事务实现流程源码解析 2023-05-18
- Java查看线程运行状态的方法详解 2023-04-23
- JSP是什么?JSP是什么意思? 2024-01-10
- Java实现warcraft java版游戏的示例代码 2023-06-01
- Java聊天室之解决连接超时问题 2023-06-17
- JSP一句话木马代码 2024-01-09
- 一文搞懂Java中的反射机制 2023-03-11
- Spring AOP 动态多数据源的实例详解 2023-08-01