Springboot + Vue 多用户并发同时登录验证码失效导致阻塞的解决方案

项目上线后,遇到并发登录时验证码错误导致登录阻塞的问题。原因为并发请求时,同一验证码被多个用户使用。解决方案是使用HashMap和唯一UUID,将验证码与UUID绑定,后端验证时通过UUID查找对应验证码,确保并发安全。
摘要由CSDN通过智能技术生成

前段时间做了一个学校教学的项目,测试的时候无论是学生还是老师登录,都能登录,但是上线后当一个班的几十名学生同时登录的时候,会出现大面积验证码错误无法登录一直阻塞的问题,于是我赶紧去翻了下源码进行排查,让我们先来看下有问题的源码是怎么样的。

前端打开登陆页面时获取验证码图片的接口代码

// 对查询所有人员信息前先生成验证码,让前端来请求并校验
    // 生成验证码图片==》响应一个 base64 字符串
    @GetMapping("/getImage")
    public String getImageCode(HttpServletRequest request) throws IOException {
   
        //1.使用工具类生成验证码(包括image和code)
        Map<String, Object> imageCode = VerifyUtil.createImageCode();
        String code = (String) imageCode.get("code");

        //2.将验证码放入servletContext作用域(前后端分离是没有session概念的)
        request.getServletContext().setAttribute("yCode", code);

        BufferedImage image = (BufferedImage) imageCode.get("image");
        //3.将图片转化为base64
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        //5.响应给浏览器  ImageIO :工具类
        ImageIO.write(image, "png", outputStream);
        String encode = Base64Utils.encodeToString(outputStream.toByteArray());

        return encode;
    }

然后是点击登录按钮,进行验证码校验时的接口代码

// 登录界面比对验证码
    
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用以下步骤来实现 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` 事件来刷新验证码,以便用户重新输入。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值