javaweb登录验证码的实现方法

下面是“JavaWeb登录验证码的实现方法”的详细攻略:

什么是验证码

验证码(Verification Code)是一种用于判断用户是否为人类的简单程序,主要目的是防止恶意程序对网站进行暴力破解或网络爬虫行为。常见的验证码包括数字、字母、图片、数学公式等形式,验证码输入错误时,通常会跳出提示框要求重新输入。

JavaWeb登录验证码的实现方法

JavaWeb登录验证码的实现方法主要分为以下两种:

使用JSP内置对象生成验证码

步骤一:创建JSP页面

在项目的webapp文件夹下创建login.jsp页面,并在该页面中添加以下代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录页面</title>
</head>
<body>
    <form action="loginServlet" method="post">
        用户名:<input type="text" name="username"><br>
        密码:<input type="password" name="password"><br>
        验证码:<input type="text" name="checkCode"><br>
        <img src="<%=request.getContextPath()%>/checkCodeServlet" />
        <input type="submit" value="登录">
    </form>
</body>
</html>

以上代码中,<img>标签中的src属性的值为生成验证码的Servlet地址,代码的详细解释见下文。

步骤二:生成验证码的Servlet

在项目的src文件夹下创建CheckCodeServlet.java文件,并在该文件中添加以下代码:

package com.example.servlet;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CheckCodeServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public CheckCodeServlet() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 禁止页面缓存
        response.setHeader("Pragma", "no-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expires", 0);
        // 设置响应内容类型及编码
        response.setContentType("image/jpeg;charset=utf-8");

        // 验证码图片的宽度和高度
        int width = 100, height = 35;
        // 创建内存图片对象
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        // 获取绘图对象
        Graphics g = image.getGraphics();
        // 设置背景色
        g.setColor(Color.WHITE);
        // 填充矩形
        g.fillRect(0, 0, width, height);

        // 生成随机数字
        StringBuffer sb = new StringBuffer();
        Random random = new Random();
        for (int i = 0; i < 4; i++) {
            int x = random.nextInt(10);
            sb.append(x);
        }

        // 将验证码存入Session
        request.getSession().setAttribute("checkCode", sb.toString());

        // 设置字体
        g.setFont(new Font("宋体", Font.BOLD, 20));
        // 设置颜色
        g.setColor(Color.BLACK);
        // 绘制数字
        g.drawString(sb.toString(), 30, 25);
        // 绘制干扰线
        for (int i = 0; i < 6; i++) {
            int x1 = random.nextInt(width);
            int y1 = random.nextInt(height);
            int x2 = random.nextInt(width);
            int y2 = random.nextInt(height);
            g.setColor(new Color(random.nextInt(256), random.nextInt(256),  random.nextInt(256)));
            g.drawLine(x1, y1, x2, y2);
        }

        // 输出图片
        ImageIO.write(image, "JPEG", response.getOutputStream());
    }
}

以上方法中,利用java.awt提供的工具类,创建内存中的图片对象,利用绘图对象将生成的验证码和干扰线绘制到图片上,然后使用流输出图片。

步骤三:验证验证码正确性的Servlet

在项目的src文件夹下创建LoginServlet.java文件,并在该文件中添加以下代码:

package com.example.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public LoginServlet() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 获取用户输入的验证码
        String checkCode = request.getParameter("checkCode");
        // 获取Session中的验证码
        String sessionCheckCode = (String) request.getSession().getAttribute("checkCode");
        // 判断验证码是否正确
        if (checkCode != null && checkCode.equalsIgnoreCase(sessionCheckCode)) {
            // 验证码正确,进行登录操作
            // ...
        } else {
            // 验证码不正确,返回登录页面
        }
    }
}

以上代码从请求参数中获取用户输入的验证码,并从Session中获取保存的验证码,之后进行比较,以判断验证码的正确性。如果正确,继续进行登录操作;如果不正确,则返回登录页面。

使用第三方库生成验证码

除了使用JSP内置对象生成验证码之外,还可以使用第三方开源库,比如Google的kaptcha进行验证码的生成。

步骤一:导入kaptcha依赖

在项目的pom.xml文件中,添加kaptcha依赖:

<dependency>
    <groupId>com.github.penggle</groupId>
    <artifactId>kaptcha</artifactId>
    <version>2.3.2</version>
</dependency>

步骤二:生成验证码的Servlet

在项目的src文件夹下创建KaptchaServlet.java文件,并在该文件中添加以下代码:

package com.example.servlet;

import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.google.code.kaptcha.impl.DefaultKaptcha;

public class KaptchaServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    private DefaultKaptcha kaptcha = new DefaultKaptcha();

    public KaptchaServlet() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 禁止页面缓存
        response.setHeader("Pragma", "no-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expires", 0);
        // 设置响应内容类型及编码
        response.setContentType("image/jpeg;charset=utf-8");

        // 生成验证码
        String text = kaptcha.createText();
        // 将验证码存入Session
        request.getSession().setAttribute("kaptcha_text", text);
        // 创建验证码图片
        BufferedImage image = kaptcha.createImage(text);
        // 输出图片
        ImageIO.write(image, "JPEG", response.getOutputStream());
    }
}

以上代码使用kaptcha库的DefaultKaptcha类生成验证码,并将验证码保存在Session中。由于kaptcha库自带干扰线的绘制,所以无需手动绘制干扰线。

步骤三:验证验证码正确性的Servlet

在项目的src文件夹下创建LoginServlet.java文件,并在该文件中添加以下代码:

package com.example.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public LoginServlet() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 获取用户输入的验证码
        String kaptcha_text = request.getParameter("kaptcha_text");
        // 获取Session中的验证码
        String sessionKaptchaText = (String) request.getSession().getAttribute("kaptcha_text");
        // 判断验证码是否正确
        if (kaptcha_text != null && kaptcha_text.equalsIgnoreCase(sessionKaptchaText)) {
            // 验证码正确,进行登录操作
            // ...
        } else {
            // 验证码不正确,返回登录页面
        }
    }
}

以上代码从请求参数中获取用户输入的验证码,并从Session中获取保存的验证码,之后进行比较,以判断验证码的正确性。如果正确,继续进行登录操作;如果不正确,则返回登录页面。

总结

本文介绍了JavaWeb登录验证码的两种实现方法:使用JSP内置对象生成验证码和使用第三方库生成验证码。它们各有优缺点,开发者可以根据实际需要进行选择。无论使用哪种方法,都需要注意保证验证码的随机性、不易被破解,并在代码中防止Session劫持和CSRF攻击。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:javaweb登录验证码的实现方法 - Python技术站

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • 深入理解Java线程编程中的阻塞队列容器

    深入理解Java线程编程中的阻塞队列容器 在Java多线程编程中,阻塞队列是一个非常重要的容器。它可以在生产者线程和消费者线程之间传递数据,并且能够自动地控制线程的同步和互斥。本文将从以下几个方面介绍Java线程编程中的阻塞队列容器: 阻塞队列的定义和用法 队列容器的种类和特性 阻塞队列的实现原理 阻塞队列的定义和用法 阻塞队列是一种线程安全的队列,具有自动…

    Java 2023年5月19日
    00
  • 计算机二级考试java软件操作教程 教大家如何学习java

    计算机二级考试Java软件操作教程 为什么学习Java? Java是一门跨平台的编程语言,在开发Web应用、移动应用、桌面应用等众多领域都有广泛应用。学习Java可以让程序员扩展自己的技能树,更好地适应市场需求。而计算机二级考试中也有Java相关的考察内容,学习Java可以更好地准备考试。 学习Java的基本步骤 下载安装Java开发环境(JDK)和集成开发…

    Java 2023年5月20日
    00
  • Java中高效的判断数组中某个元素是否存在详解

    Java中高效的判断数组中某个元素是否存在的方法,一般有以下两种: 方法一:使用Arrays类中的binarySearch()方法 Arrays类中的binarySearch()方法可以对已排序的数组进行二分查找,返回匹配元素的索引,若未找到则返回负数。该方法需要先对数组进行排序,时间复杂度为 O(log n)。 下面是一个使用binarySearch()方…

    Java 2023年5月26日
    00
  • JAVA十大排序算法之堆排序详解

    JAVA十大排序算法之堆排序详解 什么是堆排序 堆排序是一种经典的排序算法,在java的Collections.sort()方法中也采用了堆排序的实现方式。堆排序的基本思想是将待排序的序列视为一棵完全二叉树,每个节点的关键字都不大于(或不小于)其子节点的关键字,然后构建大(小)顶堆,最后依次取出堆顶元素并删除。 堆排序的原理 1.构建堆 堆排序首先需要将待排…

    Java 2023年5月19日
    00
  • Java 从json提取数组并转换为list的操作方法

    下面是 “Java 从json提取数组并转化为list的操作方法” 的完整攻略: 1. 需要的依赖 在 Java 中使用 JSON 数据,我们需要导入相应的 JSON 解析库,这里我们以 JSON-java 为例。 在 Maven 项目中添加以下依赖即可: <dependency> <groupId>org.json</grou…

    Java 2023年5月26日
    00
  • MySQL Packet for query is too large 问题及解决方法

    MySQL Packet for query is too large 是 MySQL 服务器返回的错误信息,意味着 MySQL 的查询语句太大,超出了 MySQL 服务器和客户端之间约定的协议数据包大小(默认为 16MB),导致服务器无法处理该查询请求。此时,我们需要进行以下措施来解决问题。 解决方法一:增加 max_allowed_packet 配置项的…

    Java 2023年6月16日
    00
  • 什么是Java安全性?

    什么是Java安全性? Java是一种面向对象的编程语言,可以通过各种平台上的Java虚拟机(JVM)在许多不同的环境中运行。与其他编程语言相比,Java有许多安全特性,如内存管理、类加载器和访问控制机制等,这些特性可以更好地保护Java程序免受各种攻击。Java安全性一直是Java社区的重要议题之一,因为Java在许多关键应用场景中都得到了广泛应用,如金融…

    Java 2023年5月11日
    00
  • Java实现的数组去重与排序操作详解

    Java实现的数组去重与排序操作详解 1. 去重操作 1.1 利用HashSet去重 利用HashSet可以对无序数组进行去重,操作属于较为简单的算法。 示例代码如下: public static int[] removeDuplicates(int[] nums) { Set<Integer> set = new HashSet<>…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部