SpringBoot使用Captcha生成验证码

下面是SpringBoot使用Captcha生成验证码的完整攻略。

1. 引入依赖

pom.xml文件中引入Captcha依赖:

<dependency>
    <groupId>com.github.yingzhuo</groupId>
    <artifactId>captcha</artifactId>
    <version>0.5.0</version>
</dependency>

2. 生成验证码

在Controller里编写如下代码来生成验证码:

@GetMapping("/captcha")
public void captcha(HttpServletRequest request, HttpServletResponse response) throws IOException {
    // 设置响应头信息
    response.setContentType("image/png");
    response.setHeader("Cache-Control", "no-cache");

    // 获取验证码
    Captcha captcha = new Captcha.Builder(200, 50) // 设置图片大小
            .addText() // 添加文字验证码
            .addNoise(new StraightLineNoiseProducer()) // 添加干扰线
            .addNoise(new CircleNoiseProducer(Color.WHITE)) // 添加干扰噪音
            .addBackground(new GradiatedBackgroundProducer()) // 添加背景
            .build(); 

    // 将验证码保存到Session中
    request.getSession().setAttribute("captcha", captcha.getAnswer());

    // 将生成图片输出到响应流中
    ImageIO.write(captcha.getImage(), "png", response.getOutputStream());
}

3. 校验验证码

用户填写完成后,需要对验证码进行校验,校验代码如下:

@PostMapping("/login")
public String login(@RequestParam String username, @RequestParam String password, 
        @RequestParam String verifyCode, HttpSession session) {
    if (!session.getAttribute("captcha").toString().equalsIgnoreCase(verifyCode)) {
        // 验证码输入错误
        return "redirect:/login?error";
    }
    // 验证码输入正确,进行登录校验
    ...
}

示例一:使用Thymeleaf模板

假设我们现在需要在登录页面上面加入验证码输入框,代码如下:

<form th:action="@{/login}" th:method="POST">
    <div>
        <label>用户名:</label>
        <input type="text" name="username">
    </div>
    <div>
        <label>密码:</label>
        <input type="password" name="password">
    </div>
    <div>
        <label>验证码:</label>
        <input type="text" name="verifyCode">
        <img id="captcha_img" src="/captcha" alt="验证码">
        <a href="javascript:;" onclick="changeImg()">看不清,换一张</a>
    </div>
    <button type="submit">登录</button>
</form>

其中,/captcha为生成验证码的请求地址。

为了使“看不清,换一张”功能正常使用,我们添加了一个JavaScript函数,用于动态改变验证码的图片。

function changeImg() {
    var imgNode = document.getElementById("captcha_img");
    imgNode.src = "/captcha?t=" + new Date().getTime();
}

这个函数会更改/captcha请求后面的时间戳,从而使浏览器重新请求验证码。

示例二:使用Angular框架

代码如下:

<div ng-controller="LoginController">
    <form ng-submit="login()">
        <div>
            <label>用户名:</label>
            <input type="text" ng-model="username">
        </div>
        <div>
            <label>密码:</label>
            <input type="password" ng-model="password">
        </div>
        <div>
            <label>验证码:</label>
            <input type="text" ng-model="verifyCode">
            <img ng-src="{{captchaUrl}}">
            <a href="javascript:;" ng-click="refreshCaptcha()">看不清,换一张</a>
        </div>
        <button type="submit">登录</button>
    </form>
</div>

其中,LoginController的代码如下:

app.controller("LoginController", function($scope, $http) {
    $scope.login = function() {
        $http.post("/login", {
            username: $scope.username,
            password: $scope.password,
            verifyCode: $scope.verifyCode
        }).then(function(response) {
            console.log(response.data);
        });
    };

    $scope.refreshCaptcha = function() {
        var time = new Date().getTime();
        $scope.captchaUrl = "/captcha?t=" + time;
    };

    $scope.refreshCaptcha();
});

其中,$http用于向后台发送POST请求。refreshCaptcha函数用于更改图片的URL,从而使浏览器重新请求验证码。

以上就是SpringBoot使用Captcha生成验证码的完整攻略,希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot使用Captcha生成验证码 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Spring Data JPA系列JpaSpecificationExecutor用法详解

    Spring Data JPA系列JpaSpecificationExecutor用法详解 JpaSpecificationExecutor介绍 JpaSpecificationExecutor是Spring Data JPA提供的一个接口,可以用于对JPA规范中Criteria Query查询标准的扩展,使得我们可以根据不同的查询条件,动态生成不同的查询语…

    Java 2023年5月20日
    00
  • java中String的一些方法深入解析

    Java中String的一些方法深入解析 String类简介 在Java程序中,String是一个重要的类,它用来表示字符串。String类是Java中一个不可变类,也就是说,一旦字符串创建,就不能改变其内容。在使用String时经常需要用到一些其方法来操作字符串。 常用String方法 charAt方法 charAt方法用来获取字符串中指定索引位置的字符,…

    Java 2023年5月27日
    00
  • Java Apache POI报错“IndexOutOfBoundsException”的原因与解决办法

    “IndexOutOfBoundsException”是Java的Apache POI类库中的一个异常,通常由以下原因之一引起: 索引错误:如果索引不正确,则可能会出现此异常。例如,可能会尝试访问不存在的行或列。 以下是两个实例: 例1 如果索引不正确,则可以尝试使用正确的索引以解决此问题。例如,在Java中,可以使用以下代码: FileInputStrea…

    Java 2023年5月5日
    00
  • Spring4整合Hibernate5详细步骤

    下面是“Spring4整合Hibernate5详细步骤”的攻略,分别针对Spring和Hibernate进行详细讲解。 Spring配置 在pom.xml文件中添加Spring和Hibernate的依赖: <dependency> <groupId>org.springframework</groupId> <art…

    Java 2023年5月19日
    00
  • Java计算字符串公式的方式解读

    下面是Java计算字符串公式的方式解读: 1. 了解逆波兰表达式 在计算字符串公式之前,需要了解逆波兰表达式。逆波兰表达式是一种将数学表达式中的运算符放在操作数的后面进行计算的形式。 例如,中缀表达式(即常见的数学公式)5 + 3 * 2 – 6可以转换为逆波兰表达式:5 3 2 * + 6 – 在逆波兰表达式中,操作数在前面,运算符在后面,便于计算时进行栈…

    Java 2023年5月26日
    00
  • 详解Java语言中一个字符占几个字节?

    当谈到Java字符的字节数时,需要考虑字符集的影响。Java中默认的字符集是UTF-16,而不是8位的ASCII字符集。 在Java中,一个字符占用2个字节(16位),因为Java中的char数据类型是16位宽的。这意味着,无论字符实际需要多少字节存储,Java都会分配16位空间来存储它。注意:这不仅适用于Unicode字符,也适用于ASCII字符。 下面是…

    Java 2023年5月20日
    00
  • 怎么运行用记事本写的java程序

    当我们使用记事本来编写Java程序时,需要注意一些细节,例如设置环境变量、保存文件格式、编译运行指令等等。下面是详细讲解如何在Windows操作系统中使用记事本运行Java程序的攻略: 环境变量配置 为了让操作系统知道我们的Java程序在哪里,我们需要设置Java环境变量。可以按照如下步骤进行设置: 在桌面上用鼠标右键点击“此电脑”图标,然后选择“属性”选项…

    Java 2023年5月19日
    00
  • Java删除文件、目录及目录下所有文件的方法实例

    下面是关于Java删除文件、目录及目录下所有文件的方法实例的完整攻略: 使用Java的IO模块删除文件和目录 删除文件的方法 在Java中删除文件可以使用Java自带的IO模块中的 File 类的 delete() 方法,该方法将直接删除指定的文件。下面是代码示例: import java.io.File; public class DeleteFileEx…

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