JSP验证码简单生成方法

当我们网站需要进行用户登录、注册等操作时,我们通常需要使用验证码来防止机器人或者是恶意攻击,本文就来详细讲解一下如何使用JSP生成验证码。

当我们网站需要进行用户登录、注册等操作时,我们通常需要使用验证码来防止机器人或者是恶意攻击,本文就来详细讲解一下如何使用JSP生成验证码。

一、验证码的生成方法

验证码的生成方法可以大致划分为以下步骤:

  1. 生成随机字符串
  2. 将随机字符串绘制成图片
  3. 将图片输出到网页上并传输随机字符串的值到后台进行验证

二、实现步骤

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验证码简单生成方法

基础教程推荐