jsp实现简单图片验证码功能

admin 轻心小站 关注 LV.19 运营
发表于JSP编程版块 教程

实现一个简单的图片验证码功能,你需要完成两个主要部分:生成验证码图片和校验用户输入的验证码。以下是使用JSP和Java Servlet实现这一功能的基本步骤:步骤1:创建验证码图片生成验证码图片可以通

实现一个简单的图片验证码功能,你需要完成两个主要部分:生成验证码图片和校验用户输入的验证码。以下是使用JSP和Java Servlet实现这一功能的基本步骤:

步骤1:创建验证码图片

生成验证码图片可以通过创建一个Servlet来完成。以下是一个简单的示例,展示如何生成一个包含随机数字的验证码图片:

import javax.imageio.ImageIO;
import javax.servlet.*;
import javax.servlet.http.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

public class CaptchaServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        int width = 100; // 验证码图片的宽度
        int height = 40;  // 验证码图片的高度
        char[] code = generateCode(4); // 生成4位随机数字验证码
        
        // 设置响应类型为图片
        response.setContentType("image/jpeg");
        
        // 创建BufferedImage对象
        BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics g = bufferedImage.getGraphics();
        
        // 设置背景色
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, width, height);
        
        // 添加干扰线条
        Random random = new Random();
        for (int i = 0; i < 20; i++) {
            g.setColor(getRandomColor());
            g.drawLine(random.nextInt(width), random.nextInt(height), random.nextInt(width), random.nextInt(height));
        }
        
        // 绘制验证码
        g.setFont(new Font("Fixedsys", Font.BOLD, 24));
        g.setColor(Color.BLACK);
        for (int i = 0; i < code.length; i++) {
            g.drawString(String.valueOf(code[i]), 15 * i + 6, 24);
        }
        
        // 将验证码存入session
        request.getSession().setAttribute("captcha", new String(code));
        
        g.dispose();
        ImageIO.write(bufferedImage, "jpeg", response.getOutputStream());
    }
    
    private char[] generateCode(int length) {
        Random random = new Random();
        char[] code = new char[length];
        for (int i = 0; i < length; i++) {
            code[i] = (random.nextInt(10)) + '0'; // 生成0-9的数字
        }
        return code;
    }
    
    private Color getRandomColor() {
        Random random = new Random();
        return new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255));
    }
}

步骤2:配置Servlet

在web.xml中配置上面创建的CaptchaServlet:

<servlet>
    <servlet-name>CaptchaServlet</servlet-name>
    <servlet-class>CaptchaServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>CaptchaServlet</servlet-name>
    <url-pattern>/captcha</url-pattern>
</servlet-mapping>

步骤3:在JSP页面中使用验证码

在你的登录或注册JSP页面中,添加一个图片标签来显示验证码:

<form action="YourLoginServlet" method="post">
    <input type="text" name="username" placeholder="Username" required>
    <input type="password" name="password" placeholder="Password" required>
    <input type="text" name="captcha" placeholder="Captcha" required>
    <img src="captcha" alt="Captcha" onclick="this.src='captcha?'+new Date().getTime();" />
    <input type="submit" value="Login">
</form>

请注意,图片标签的src属性设置为/captcha,这将调用上面创建的CaptchaServlet。onclick事件用于刷新验证码图片。

步骤4:校验验证码

在你的登录或注册的Servlet中,添加验证码校验逻辑:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String inputCaptcha = request.getParameter("captcha");
    String sessionCaptcha = (String) request.getSession().getAttribute("captcha");
    
    if (sessionCaptcha != null && sessionCaptcha.equals(inputCaptcha)) {
        // 验证码正确,继续处理登录或注册
    } else {
        // 验证码错误,返回错误信息
        request.setAttribute("error", "Captcha is incorrect!");
        request.getRequestDispatcher("login.jsp").forward(request, response);
    }
}

注意事项:

  • 为了提高安全性,考虑使用更复杂的验证码生成算法,包括字母和数字的随机组合。

  • 在生产环境中,避免直接将验证码存储在客户端的cookie中,应使用服务器端的session来存储。

  • 验证码的过期时间也需要考虑,以避免用户长时间不操作导致的验证码失效问题。

通过上述步骤,你可以实现一个基本的图片验证码功能,以增强Web应用程序的安全性。

文章说明:

本文原创发布于探乎站长论坛,未经许可,禁止转载。

题图来自Unsplash,基于CC0协议

该文观点仅代表作者本人,探乎站长论坛平台仅提供信息存储空间服务。

评论列表 评论
发布评论

评论: jsp实现简单图片验证码功能

粉丝

0

关注

0

收藏

0

已有0次打赏