JSP验证码动态生成方法
验证码是一种基于图像识别的人机交互技术,用于防止机器恶意提交表单、暴力破解等恶意行为。在 JSP 中,我们可以采用动态生成验证码的方式来实现验证码功能。
- 安装开发环境
你需要在本地搭建 JSP 的开发环境。这里我们以 Eclipse + Tomcat 作为例。
- 编写生成验证码的 Servlet
(1)新建一个 Java 类,并继承 HttpServlet。
@WebServlet("/captcha")
public class CaptchaServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int width = 100;
int height = 50;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
g.setColor(Color.GRAY);
g.fillRect(0, 0, width, height);
g.setColor(Color.BLACK);
g.drawRect(0, 0, width - 1, height - 1);
String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
Random r = new Random();
for (int i = 0; i < 4; i++) {
int index = r.nextInt(str.length());
char c = str.charAt(index);
g.drawString(c + "", i * (width / 4) + 10, height / 2 + 5);
}
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ImageIO.write(image, "PNG", bos);
byte[] bytes = bos.toByteArray();
response.setContentType("image/png");
ServletOutputStream out = response.getOutputStream();
out.write(bytes);
out.close();
}
}
(2)在上述 Servlet 中,我们使用 Graphics2D API 绘制了一个 100 × 50 的背景为灰色的矩形,然后使用随机数生成器生成四位随机验证码并将其绘制到图片上,最后将生成的图片以 PNG 格式写入一个 ByteArrayOutputStream 中,通过一个 ServletOutputStream 输出到响应中。
- 编写 JSP 页面
(1)新建 captcha.jsp 文件。在该文件中编写以下代码:
<html>
<head>
<title>JavaWeb 实验室 - 验证码</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
</head>
<body>
<div>
<p>请输入下方验证码:</p>
<form method="post" action="result.jsp">
<p><label>验证码:</label><input type="text" name="captcha" size="20"/></p>
<p><img src="captcha" alt="captcha"/></p>
<p><input type="submit" value="提交"/></p>
</form>
</div>
</body>
</html>
在该页面中,我们使用了一个表单,该表单提交到 result.jsp 页面。同时,我们在表单中嵌入了一个图片,用于展示由 captcha Servlet 动态生成的验证码。
(2)新建 result.jsp 文件,代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%!
private static String captcha = "ABCD"; // 此处预设验证码为 "ABCD",实际应用中应该从 session 中获取
%>
<html>
<head>
<title>JavaWeb 实验室 - 结果</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
</head>
<body>
<%
String inputCaptcha = request.getParameter("captcha");
if (inputCaptcha == null || !inputCaptcha.equalsIgnoreCase(captcha)) {
out.println("<p>验证码错误,请重新输入!</p>");
} else {
out.println("<p>验证码输入成功!</p>");
}
%>
<p><a href="captcha.jsp">重新输入</a></p>
</body>
</html>
在该页面中,我们首先通过 request.getParameter("captcha") 获取用户提交的验证码。然后,我们判断用户输入的验证码是否与事先设定的验证码相等。如果相等,我们输出“验证码输入成功!”的提示信息;反之,我们输出“验证码错误,请重新输入!”的提示信息。
- 测试
(1)启动 Tomcat 服务器。
(2)访问 http://localhost:8080/your-project-name/captcha.jsp,即可看到一个嵌入了动态生成的验证码图片的表单。
(3)在表单中输入“ABCD”(不区分大小写)并提交,即可看到“验证码输入成功!”的提示信息;反之,会提示“验证码错误,请重新输入!”。
示例2:
生成数字验证码
@WebServlet("/captcha")
public class CaptchaServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int width = 100;
int height = 50;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
g.setColor(Color.GRAY);
g.fillRect(0, 0, width, height);
g.setColor(Color.BLACK);
g.drawRect(0, 0, width - 1, height - 1);
int x, y;
for (int i = 0; i < 10; i++) {
x = new Random().nextInt(width);
y = new Random().nextInt(height);
g.setColor(Color.GREEN);
g.drawOval(x, y, 1, 1);
}
StringBuilder sb = new StringBuilder();
Random random = new Random();
for (int i = 0; i < 4; i++) {
int num = random.nextInt(10);
sb.append(num);
g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));
g.drawString(num + "", width/4*i+5, 25);
}
request.getSession().setAttribute("captcha", sb.toString());
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ImageIO.write(image, "PNG", bos);
byte[] bytes = bos.toByteArray();
response.setContentType("image/png");
ServletOutputStream out = response.getOutputStream();
out.write(bytes);
out.close();
}
}
上述代码所实现的是一个动态生成的数字验证码。它与第一个示例的不同之处在于,它会在图片的任意位置生成 10 个随机分布的圆点,并且验证码的内容也是由 4 个随机数字组成。在生成验证码的同时,我们将成功生成的验证码存入 session 中,以方便后面的校验。
总结
通过以上两个例子,我们了解了在 JSP 中动态生成验证码的基本步骤和操作,包括 Java 代码和 JSP 页面的编写、相关的 Servlet 控制及 session 的数据传递,以及验证码图片的生成和输出等。实际应用中,我们可以根据需要对验证码的生成及验证方式进行改进或优化,来满足不同应用场景的需求。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JSP验证码动态生成方法 - Python技术站