最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot后端驗證碼的實現(xiàn)示例

 更新時間:2024年08月16日 10:46:03   作者:Alphamilk  
為了防止網(wǎng)站的用戶被通過密碼典爆破,引入驗證碼的功能是十分有必要的,本文主要介紹了SpringBoot后端驗證碼的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下

一、簡介

為了防止網(wǎng)站的用戶被通過密碼典爆破。引入驗證碼的功能是十分有必要的。而前端的驗證碼又僅僅是只防君子不防小人。通過burpsuit等工具很容易就會被繞過。所以后端實現(xiàn)的驗證碼才是對用戶信息安全的一大重要保障。

實現(xiàn)思路:

1.引入圖形生成的依賴

2.生成隨機4字符,并制作成圖片

3.對圖片進行Base64形式數(shù)據(jù)進行傳輸

4.前端顯示

二、引入依賴

<!--        驗證碼模塊-->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version>
</dependency>

三、驗證碼生成工具類

public class CaptchaUtil {

    private static final int WIDTH = 200;
    private static final int HEIGHT = 75;
    private static final int FONT_SIZE = 36;
    private static final String DEFAULT_FONT = "Arial";

    /**
     * 生成驗證碼圖像.
     *
     * @param captchaText 驗證碼原始文本
     * @return Base64編碼的圖像字符串
     */
    public static String generateCaptchaImage(String captchaText) {
        if (captchaText == null || captchaText.isEmpty()) {
            throw new IllegalArgumentException("Captcha text cannot be null or empty.");
        }

        // 創(chuàng)建圖像和圖形上下文
        BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = (Graphics2D) image.getGraphics();

        // 設置背景顏色
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, WIDTH, HEIGHT);

        // 繪制驗證碼文本
        g.setFont(new Font(DEFAULT_FONT, Font.BOLD, FONT_SIZE));
        g.setColor(getRandomColor());
        g.drawString(captchaText, 45, 50);

        // 添加隨機線條作為干擾
        addNoiseLines(g);

        // 關閉圖形上下文
        g.dispose();

        // 將圖像轉換為Base64編碼的字符串
        try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
            ImageIO.write(image, "png", baos);
            return Base64.getEncoder().encodeToString(baos.toByteArray());
        } catch (Exception e) {
            throw new RuntimeException("Error generating captcha image", e);
        }
    }

    private static void addNoiseLines(Graphics2D g) {
        for (int i = 0; i < 5; i++) {
            g.setColor(getRandomColor());
            g.drawLine(
                    getRandomNumber(WIDTH),
                    getRandomNumber(HEIGHT),
                    getRandomNumber(WIDTH),
                    getRandomNumber(HEIGHT)
            );
        }
    }

    private static Color getRandomColor() {
        return new Color((int) (Math.random() * 255),
                         (int) (Math.random() * 255),
                         (int) (Math.random() * 255));
    }

    private static int getRandomNumber(int bound) {
        return (int) (Math.random() * bound);
    }
}

四、通過Http Session存放驗證碼與驗證

獲取(a-z A-Z 0-9)隨機四位的驗證碼功能:

  // 登陸時候獲取驗證碼
    @ApiOperation("獲取驗證碼功能")
    @GetMapping("/GetCaptcha")
    public String GetCaptcha(HttpSession session) {

//        隨機生成四位驗證碼原始數(shù)據(jù)
        String allowedChars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
        String randomString = generateRandomString(allowedChars, 4);
        System.out.println("captchaCode " + randomString);

        // 將驗證碼保存到session中
        session.setAttribute("captcha", randomString); // 使用方法參數(shù)session
        String ImageByBase64 = CaptchaUtil.generateCaptchaImage(randomString);
        return ImageByBase64;
    }

用戶登陸時候校驗驗證碼功能:

// 實現(xiàn)登陸功能
    @ApiOperation("用戶登陸功能")
    @PostMapping("/login")
    public Result Login(@RequestBody LoginDTO loginDTO, HttpSession session) { // 使用同一個HttpSession參數(shù)

        String captcha = (String) session.getAttribute("captcha");

        log.info("用戶調用login方法");
        if (loginDTO.getCaptcha() == null || !loginDTO.getCaptcha().equalsIgnoreCase(captcha)) {
            session.removeAttribute("captcha");
            return Result.error("驗證碼出錯了噢!");
        }

        // 對密碼進行md5加密
        String encryptToMD5 = MD5Util.encryptToMD5(loginDTO.getPassword());

        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(User::getAccount, loginDTO.getAccount())
                .eq(User::getPassword, encryptToMD5);

        User user = userService.getOne(lambdaQueryWrapper);
        if (user == null) {
            return Result.error("很抱歉,查不到此用戶");
        }
        user.setPassword("xxxxx");
        return Result.success(user);
    }

五、前端顯示Base64格式的圖片

前端實現(xiàn)注冊的表單

<el-tab-pane label="登陸" name="first">
                <el-form :model="loginForm" ref="loginFormRef" label-width="80px">
                  <el-form-item label="用戶名:">
                    <el-input v-model="loginForm.account"></el-input>
                  </el-form-item>
                  <el-form-item label="密碼:">
                    <el-input v-model="loginForm.password" show-password></el-input>
                  </el-form-item>
                  <el-form-item label="驗證碼">
                    <el-input v-model="loginForm.captcha" style="width: 20%;"></el-input>
                    <img :src="captchaImageUrl" alt="驗證碼" @click="refreshCaptcha" id="captchaImage">
                  </el-form-item>
                </el-form>
              </el-tab-pane>

 先設置為空

export default {
  data() {
    return {
      captchaImageUrl: '', // 初始化為一個空字符串
    }
  },

在點擊登陸按鈕后,執(zhí)行getCaptcha函數(shù)并設置captchaImageUrl的回顯格式為Base64

  fetchCaptcha() {
      axios.get('/api/user/GetCaptcha')
        .then(response => {

          this.captchaImageUrl = 'data:image/png;base64,' + response.data;
        })
        .catch(error => {
          console.error('獲取驗證碼失敗:', error);
        });
    },

最后進行測試:

注意:實現(xiàn)完成驗證碼功能后,需要注意用戶的操作。如果登陸失敗,刷新頁面,切換頁面。都需要重新更新驗證碼!

到此這篇關于SpringBoot后端驗證碼的實現(xiàn)示例的文章就介紹到這了,更多相關SpringBoot后端驗證碼內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家! 

相關文章

  • java壓縮文件與刪除文件的示例代碼

    java壓縮文件與刪除文件的示例代碼

    這篇文章主要介紹了java壓縮文件與刪除文件的示例代碼,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • SpringBoot項目POM文件的使用小結

    SpringBoot項目POM文件的使用小結

    本文主要詳細介紹了Maven中SpringBoot項目的POM文件配置,包括項目的依賴和插件,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-11-11
  • java生成驗證碼步驟歸納總結

    java生成驗證碼步驟歸納總結

    這篇文章主要為大家詳細介紹了java生成驗證碼的步驟總結,需要的朋友可以參考下
    2017-04-04
  • Springboot實現(xiàn)發(fā)送郵件

    Springboot實現(xiàn)發(fā)送郵件

    這篇文章主要為大家詳細介紹了Springboot實現(xiàn)發(fā)送郵件功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • 如何基于JAVA讀取yml配置文件指定key內容

    如何基于JAVA讀取yml配置文件指定key內容

    這篇文章主要介紹了如何基于JAVA讀取yml配置文件指定key內容,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-01-01
  • 關于Java應用日志與Jaeger的trace關聯(lián)的問題

    關于Java應用日志與Jaeger的trace關聯(lián)的問題

    這篇文章主要介紹了Java應用日志如何與Jaeger的trace關聯(lián),通過jaeger發(fā)現(xiàn)這十次請求中有一次耗時特別長,想定位一下具體原因,感興趣的朋友跟隨小編一起看看吧
    2022-01-01
  • Java設計模式編程中的工廠方法模式和抽象工廠模式

    Java設計模式編程中的工廠方法模式和抽象工廠模式

    這篇文章主要介紹了Java設計模式編程中的工廠方法模式和抽象工廠模式,設計模式的建立有利于團隊協(xié)作時代碼的共同維護,需要的朋友可以參考下
    2016-01-01
  • java 實現(xiàn)簡單圣誕樹的示例代碼(圣誕節(jié)快樂)

    java 實現(xiàn)簡單圣誕樹的示例代碼(圣誕節(jié)快樂)

    這篇文章主要介紹了java 實現(xiàn)簡單圣誕樹的示例代碼(圣誕節(jié)快樂),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12
  • java基礎檢查和未檢查異常處理詳解

    java基礎檢查和未檢查異常處理詳解

    這篇文章介紹了java基礎中異常的處理,主要講解了java檢查和未檢查異常處理的示例詳解有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-10-10
  • Java嵌入式開發(fā)的優(yōu)勢及有點總結

    Java嵌入式開發(fā)的優(yōu)勢及有點總結

    在本篇內容里小編給大家整理了關于Java嵌入式開發(fā)的優(yōu)勢及相關知識點內容,有興趣的朋友們學習下。
    2022-11-11

最新評論

汝南县| 四会市| 大石桥市| 惠东县| 申扎县| 株洲市| 佛山市| 克拉玛依市| 河曲县| 无锡市| 旺苍县| 大石桥市| 望江县| 和平县| 博客| 双辽市| 徐水县| 上栗县| 山西省| 灵寿县| 泸水县| 华容县| 华安县| 洮南市| 湖南省| 商都县| 张掖市| 扶沟县| 东丽区| 瑞丽市| 新巴尔虎左旗| 陇川县| 黄冈市| 德昌县| 工布江达县| 崇礼县| 青海省| 金川县| 扬中市| 裕民县| 龙海市|