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日

相关文章

  • springmvc Rest风格介绍及实现代码示例

    SpringMVC Rest风格介绍及实现代码示例 在Web开发中,REST(Representational State Transfer)是一种架构风格,它提供了一种简单的方式来创建Web服务。SpringMVC框架支持RESTful Web服务的开发,本文将详细介绍SpringMVC Rest风格的实现及代码示例。 Rest风格介绍 REST是一种基于…

    Java 2023年5月17日
    00
  • 解析MyBatis源码实现自定义持久层框架

    解析MyBatis源码实现自定义持久层框架是一个比较高级的主题,需要我们对MyBatis的原理和实现方式有一定的了解,下面是一个完整攻略: 1. 理解MyBatis的框架结构 MyBatis的框架结构有三个方面: SqlSessionFactoryBuilder:用于创建SqlSessionFactory对象,可以从XML配置文件和Java代码两种方式创建。…

    Java 2023年6月15日
    00
  • 这可能是最全面的MySQL面试八股文了

    什么是MySQL MySQL是一个关系型数据库,它采用表的形式来存储数据。你可以理解成是Excel表格,既然是表的形式存储数据,就有表结构(行和列)。行代表每一行数据,列代表该行中的每个值。列上的值是有数据类型的,比如:整数、字符串、日期等等。 数据库的三大范式 第一范式1NF 确保数据库表字段的原子性。最全面的Java面试网站 比如字段 userInfo:…

    Java 2023年4月25日
    00
  • MyBatis-Plus集成Druid环境搭建的详细教程

    下面我将为你介绍Mybatis-Plus集成Druid环境搭建的详细教程,包括环境搭建、配置和代码演示。首先,我们需要明确一下什么是Mybatis-Plus和Druid。 什么是MyBatis-Plus和Druid? MyBatis-Plus MyBatis-Plus(简称MP)是一个在MyBatis框架基础上的增强工具,省去了很多重复性的代码,提供了更为简…

    Java 2023年5月20日
    00
  • Java JDK1.5、1.6、1.7新特性整理

    Java JDK1.5、1.6、1.7新特性整理 Java JDK1.5新特性 自动装箱、拆箱 Java JDK1.5引入了自动装箱和拆箱功能,即可以自动将基本类型和它们对应的包装类型进行转换。例如: // 自动装箱 Integer i = 10; // 自动拆箱 int j = i; 可变参数 Java JDK1.5引入了可变参数功能,即可以在方法中使用任…

    Java 2023年5月24日
    00
  • 什么是Java内存泄漏?

    Java内存泄漏 (Memory Leak) 指在Java程序运行时,由于对象已经无法访问,但是资源或内存没有被释放,程序运行时会出现内存泄漏的情况。当程序运行时发现内存泄漏,会导致Java程序的内存使用率不断增加,并最终导致程序崩溃或运行异常缓慢。 在Java中常见的内存泄漏产生的原因有两种:未释放资源、循环引用。 未释放资源 Java程序在运行时会分配内…

    Java 2023年5月11日
    00
  • java实现批量导入.csv文件到mysql数据库

    下面我来详细讲解如何使用Java实现批量导入.csv文件到MySQL数据库的攻略。 一、准备工作 导入MySQL依赖 在Maven项目中,需要在pom.xml文件中导入MySQL的依赖,代码如下: <dependency> <groupId>mysql</groupId> <artifactId>mysql-c…

    Java 2023年5月20日
    00
  • Java字符串常见的操作(比较,查找,替换等)

    Java字符串常见的操作 在Java中,字符串被定义为一个类,称为java.lang.String。Java中的字符串是不可变的,这意味着一旦创建了一个字符串,就不能更改它的内容,而是会创建一个新的字符串对象。 下面是Java字符串常见的操作: 创建字符串 在Java 中创建一个字符串非常容易,只需要将字符串括在两个引号之间即可: String str = …

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