基于SpringBoot-Vue生成验证码

在Web应用中,验证码(CAPTCHA)是一种常用的安全机制,用于防止自动化脚本(如机器人)进行恶意活动,如暴力破解密码、批量注册账号等。本文将介绍如何在Spring Boot后端和Vue前端实现验证码的生成和验证。

Spring Boot后端实现

引入依赖

首先,需要在Spring Boot项目中引入相关的依赖,本文采用的是easy-captcha来生成验证码。

<dependency>
   <groupId>com.github.whvcse</groupId>
   <artifactId>easy-captcha</artifactId>
   <version>1.6.2</version>
</dependency>

Controller层实现生成代码

import com.computer.common.CaptureConfig;
import com.wf.captcha.SpecCaptcha;
import com.wf.captcha.base.Captcha;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@CrossOrigin
@RestController
public class CaptchaController {

    @RequestMapping("/captcha")
    public void captcha(@RequestParam String key, HttpServletRequest request, HttpServletResponse response) throws Exception {
        // 指定验证码长度及字符个数
        SpecCaptcha captcha = new SpecCaptcha(135,33,5);
        captcha.setCharType(Captcha.TYPE_NUM_AND_UPPER);
        // 首先把验证码在后台保存一份,但不能保存在session中,可以存在redis,也可以存在后台的某个Map里面
        CaptureConfig.CAPTURE_MAP.put(key,captcha.text().toLowerCase());
        setHeader(response);
        request.getSession().setAttribute("captcha", captcha.text().toLowerCase());
        captcha.out(response.getOutputStream());

        // 算数类型
        /*ArithmeticCaptcha captcha = new ArithmeticCaptcha(135,33);
        captcha.setLen(4);  // 指定几位数运算,默认两位
        captcha.getArithmeticString();  // 获取运算公式
        captcha.text();  // 获取运算结果
        CaptureConfig.CAPTURE_MAP.put(key,captcha.text().toLowerCase());
        // 只有tomcat10以下版本才可以使用
        // CaptchaUtil.out(captcha, request, response);*/
    }
    public static void setHeader(HttpServletResponse response) {
        response.setContentType("image/gif");
        response.setHeader("Pragma", "No-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expires", 0L);
    }
}

这里有个注意事项,如果你使用的是tomcat10以下版本可以直接使用CaptchaUtil.out(captcha, request, response);来生成验证码。

判断验证码是否正确

// 判断验证码是否正确
        if (!admin.getVerCode().toLowerCase().equals(CaptureConfig.CAPTURE_MAP.get(key))) {						                
            // 只有tomcat10以下版本才可以使用
            // CaptchaUtil.clear(request);
            request.getSession().removeAttribute("captcha");
            return Result.error("验证码错误");
        }

调用一个工具类来保存生成的验证码,这里使用的是Map集合保存。

import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

@Component
public class CaptureConfig {

    public static Map<String, String> CAPTURE_MAP = new HashMap<>();
}

Vue前端实现

定义文本框与验证码显示图片

<el-form-item>
  <div style="display: flex; justify-content: center">
    <el-input v-model="ruleForm.verCode" prefix-icon="el-icon-user" style="width: 42%;margin-right: 60px;" placeholder="请输入验证码"></el-input>
    <img :src="captchaUrl" @click="clickImg()" width="140px" height="33px" />
   </div>
 </el-form-item>

调用前端接口生成验证码

data() {
      return {
        key: '',
        captchaUrl: ''
      };
    },
mounted() {
      this.key = Math.random(),
      this.captchaUrl = 'http://localhost:8080/api/captcha?key=' + this.key
    },
    methods: {
      clickImg(){
        this.key = Math.random(),
        this.captchaUrl = 'http://localhost:8080/api/captcha?key=' + this.key
      },
    }

  • 17
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
您可以使用以下步骤来实现 Spring BootVue.js 登录验证码: 1. 在 Spring Boot 中实现验证码生成和验证 您可以使用第三方库来生成验证码,例如 Kaptcha 或 Google 的 reCAPTCHA。使用 Kaptcha 的示例代码如下: ```java // 生成验证码 @RequestMapping("/captcha.jpg") public void captcha(HttpServletResponse response, HttpSession session) throws IOException { response.setHeader("Cache-Control", "no-store, no-cache"); response.setContentType("image/jpeg"); // 生成验证码 String text = kaptchaProducer.createText(); session.setAttribute("captcha", text); // 将验证码写入响应 BufferedImage image = kaptchaProducer.createImage(text); ServletOutputStream out = response.getOutputStream(); ImageIO.write(image, "jpg", out); out.flush(); out.close(); } // 验证码验证 @PostMapping("/login") public String login(String username, String password, String captcha, HttpSession session) { String sessionCaptcha = (String) session.getAttribute("captcha"); if (!captcha.equalsIgnoreCase(sessionCaptcha)) { return "验证码错误"; } // 其他登录逻辑 // ... } ``` 2. 在 Vue.js 中实现验证码的展示和刷新 您可以使用第三方库来实现验证码的展示和刷新,例如 vue-verify-code。使用 vue-verify-code 的示例代码如下: ```vue <template> <div> <input v-model="captcha" placeholder="请输入验证码"> <verify-code :url="captchaUrl" @success="onCaptchaSuccess"></verify-code> </div> </template> <script> import VerifyCode from 'vue-verify-code'; export default { components: { VerifyCode, }, data() { return { captcha: '', captchaUrl: '/captcha.jpg', }; }, methods: { onCaptchaSuccess() { // 验证码刷新成功 this.captchaUrl = '/captcha.jpg?' + Date.now(); }, }, }; </script> ``` 在上面的示例代码中,我们使用了 vue-verify-code 组件来展示验证码。该组件会在页面加载时自动请求 `/captcha.jpg` 地址来获取验证码图片。在用户输入验证码后,我们可以通过监听 `@success` 事件来刷新验证码,以便用户重新输入。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值