基于 Spring Boot 的登錄功能實現詳解

在 Web 應用開發中,登錄功能是保障系統安全的第一道防線。本文將結合實際代碼,詳細解析一個基于 Spring Boot 框架的登錄功能實現,包括驗證碼生成、用戶驗證、Token 機制等關鍵環節。

技術棧概覽

本登錄功能實現涉及以下核心技術和組件:

  • Spring Boot:后端開發框架
  • MyBatis-Plus:數據庫操作增強工具
  • Redis:用于存儲驗證碼和 Token
  • JWT:生成和驗證用戶令牌
  • Hutool:提供 UUID 生成、加密等工具類
  • 驗證碼工具:生成圖形驗證碼

核心功能實現

1. 驗證碼生成與驗證

驗證碼是防止惡意登錄的重要手段,實現代碼如下:

@RequestMapping("/captcha")
public Result getCaptcha(){// 生成驗證碼圖片對象Captcha captcha = new SpecCaptcha(130, 38, 4);// 將驗證碼轉為大寫字符串String code = captcha.text().toUpperCase();// 生成UUID作為驗證碼的唯一標識String uuid = IdUtil.simpleUUID();// 存入redis并設置2分鐘過期時間redisTemplate.opsForValue().set(uuid, code, 120, TimeUnit.SECONDS);// 構建返回數據Map<String,Object> map = new HashMap<>();map.put("uuid", uuid);       // 驗證碼唯一標識map.put("code", code);       // 驗證碼文本map.put("captcha", captcha.toBase64());  // 驗證碼圖片(base64格式)return Result.ok().put("data", map);
}

驗證碼實現流程:

  1. 生成指定尺寸的圖形驗證碼
  2. 將驗證碼文本轉為大寫并與 UUID 綁定
  3. 存儲到 Redis 并設置過期時間
  4. 將 UUID、驗證碼圖片(base64 格式)返回給前端

2. 登錄核心邏輯

登錄功能是整個流程的核心,負責驗證用戶身份并生成訪問令牌:

@RequestMapping("/login")
public Result login(@RequestBody LoginForm loginForm, HttpSession session){// 1. 驗證驗證碼是否存在String uuid = loginForm.getUuid();String code = (String)redisTemplate.opsForValue().get(uuid);if(code == null){return Result.ok().put("status","驗證碼已過期");}// 2. 驗證驗證碼是否正確String captcha = loginForm.getCaptcha().toUpperCase();if(!code.equals(captcha)){return Result.ok().put("status","驗證碼錯誤");}// 3. 驗證用戶名是否存在String username = loginForm.getUsername();QueryWrapper<UserEntity> queryWrapper = new QueryWrapper<>();queryWrapper.eq("username", username);UserEntity user = userService.getOne(queryWrapper);if(user == null){return Result.ok().put("status","用戶名不存在");}// 4. 驗證密碼是否正確(使用SHA256加密)String password = SecureUtil.sha256(loginForm.getPassword());if(!password.equals(user.getPassword())){return Result.ok().put("status","密碼錯誤");}// 5. 將用戶信息存入sessionsession.setAttribute("user", user);// 6. 生成JWT令牌String token = jwtUtil.createToken(String.valueOf(user.getUserId()));// 7. 準備返回數據Map<String,Object> map = new HashMap<>();map.put("token", token);map.put("expire", jwtUtil.getExpire());return Result.ok().put("data", map);
}

登錄流程解析:

  1. 前端提交包含用戶名、密碼、驗證碼和 UUID 的登錄表單
  2. 后端通過 UUID 從 Redis 獲取驗證碼進行驗證
  3. 驗證通過后查詢數據庫檢查用戶名是否存在
  4. 對輸入密碼進行 SHA256 加密后與數據庫存儲的密碼比對
  5. 驗證成功后,將用戶信息存入 session
  6. 生成 JWT 令牌并返回給前端,用于后續請求的身份驗證

3. Token 驗證機制

為了避免每次請求都需要重新登錄,實現了基于 JWT 的 Token 驗證機制:

@RequestMapping("/checkToken")
public Result checkToken(HttpServletRequest request){String token = request.getHeader("token");boolean result = jwtUtil.checkToken(token);if (result) return Result.ok().put("status","ok");else {return Result.ok().put("status", "error");}
}

Token 驗證流程:

  1. 前端在請求頭中攜帶 Token
  2. 后端從請求頭獲取 Token 并驗證其有效性
  3. 返回驗證結果,前端根據結果判斷是否需要重新登錄

4. 退出登錄功能

@RequestMapping("/logout")
public Result logout(HttpSession session) {session.invalidate();  // 使當前session失效return Result.ok().put("status", "操作成功");
}

退出登錄通過使當前 session 失效,清除用戶的登錄狀態。

安全性考慮

  1. 密碼加密:使用 SHA256 算法對密碼進行加密存儲,避免明文存儲
  2. 驗證碼機制:防止機器人自動登錄和暴力破解
  3. Token 過期機制:JWT 令牌有有效期,降低被盜用風險
  4. Redis 存儲:驗證碼和 Token 都存儲在 Redis 中并設置過期時間,自動清理

總結

本登錄功能實現了從驗證碼生成、用戶身份驗證到 Token 發放的完整流程,結合了 Redis 和 JWT 技術,既保證了系統安全性,又提升了用戶體驗。在實際應用中,還可以根據需求進一步增強,如添加登錄次數限制、異常登錄檢測等功能。

通過分層驗證(驗證碼 -> 用戶名 -> 密碼)的方式,逐步過濾無效請求,既提高了安全性,也能給用戶提供更明確的錯誤提示。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/92701.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/92701.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/92701.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vue+django 大模型心理學智能診斷評測系統干預治療輔助系統、智慧心理醫療、帶知識圖譜

vuedjango 大模型心理學智能診斷評測系統干預治療輔助系統、智慧心理醫療、帶知識圖譜文章結尾部分有CSDN官方提供的學長 聯系方式名片 文章結尾部分有CSDN官方提供的學長 聯系方式名片 關注B站&#xff0c;有好處&#xff01;編號:D003 pro基于大模型心理學問卷、智能診斷&…

【linux】企業級WEB應用服務器tomcat

一 WEB技術1.1 HTTP協議和B/S 結構操作系統有進程子系統&#xff0c;使用多進程就可以充分利用硬件資源。進程中可以多個線程&#xff0c;每一個線程可以被CPU調度執行&#xff0c;這樣就可以讓程序并行的執行。這樣一臺主機就可以作為一個服務器為多個客戶端提供計算服務。客戶…

【Unity優化】Unity多場景加載優化與資源釋放完整指南:解決Additive加載卡頓、預熱、卸載與內存釋放問題

【Unity優化】Unity多場景加載優化與資源釋放完整指南&#xff1a;解決Additive加載卡頓、預熱、卸載與內存釋放問題 本文將完整梳理 Unity 中通過 SceneManager.LoadSceneAsync 使用 Additive 模式加載子場景時出現的卡頓問題&#xff0c;分析其本質&#xff0c;提出不同階段的…

B 樹與 B + 樹解析與實現

一、磁盤存儲優化的核心邏輯 在大規模數據處理場景中&#xff0c;磁盤 I/O 效率是性能瓶頸的核心。磁盤訪問具有以下特性&#xff1a; 隨機訪問成本高&#xff1a;磁頭尋道時間&#xff08;Seek Time&#xff09;可達毫秒級&#xff0c;相比內存訪問&#xff08;納秒級&#…

MySQL 查詢相同記錄并保留時間最晚的一條

要在 MySQL 中查詢相同記錄并僅保留時間最晚的那一條&#xff0c;你可以使用以下幾種方法&#xff1a;方法一&#xff1a;使用子查詢和 GROUP BY假設你的表名為 your_table&#xff0c;時間字段為 create_time&#xff0c;其他用于判斷記錄相同的字段為 field1, field2 等&…

在 .NET Core 5.0 中啟用 Gzip 壓縮 Response

在 .NET Core 5.0 中啟用 Gzip 壓縮 Response 在 .NET Core 5.0 (ASP.NET Core 5.0) 中啟用 Gzip 壓縮主要通過響應壓縮中間件實現。以下是詳細配置步驟&#xff1a; 1. 安裝必要的 NuGet 包 首先確保已安裝響應壓縮包&#xff1a; dotnet add package Microsoft.AspNetCore.Re…

[Oracle] TRUNC()函數

TRUNC() 是 Oracle 中一個多功能函數&#xff0c;主要用于對數值、日期進行截斷操作1.TRUNC()函數用于數值處理語法格式TRUNC(number, decimal_places)參數說明number&#xff1a;要截斷的數值 decimal_places&#xff1a;保留的小數位數(可選)&#xff0c;默認為0(截斷所有小數…

GPT-oss:OpenAI再次開源新模型,技術報告解讀

1.簡介OpenAI 發布了兩款開源權重推理模型 gpt-oss-120b 與 gpt-oss-20b&#xff0c;均采用 Apache 2.0 許可&#xff0c;主打在代理工作流中執行復雜推理、調用工具&#xff08;如搜索、Python 代碼執行&#xff09;并嚴格遵循指令。120b 為 36 層 MoE 結構&#xff0c;活躍參…

python tcp 框架

目錄 python tcp 框架 asyncio websockets python tcp 框架 asyncio import asyncio import json import timeclass TCPClient:def __init__(self, host, port, heartbeat_interval10):self.host hostself.port portself.heartbeat_interval heartbeat_intervalself.read…

HTML 與 CSS:從 “認識標簽” 到 “美化頁面” 的入門指南

個人主頁&#xff1a;?喜歡做夢 目錄 &#x1f3a0;HTML &#x1f3a1;一、什么是HTML&#xff1f; ??1.定義 ??2.核心特點 ??3.HTML的基本結構 ??4.標簽的層次結構關系 &#x1f3a1;二、HTML的常用標簽 &#x1f305;1.文本列表標簽 標題標簽&#xff1a;h…

【MATLAB 2025a】安裝離線幫助文檔

文章目錄一、在 MATLAB 設置中安裝二、從math works 網站下載ISO&#xff1a;適用于給無法聯網的電腦安裝或自定義路徑三、startup文件說明四、重要說明&#x1f9e9;&#x1f9e9;【Matlab】最新版2025a發布&#xff0c;深色模式、Copilot編程助手上線&#xff01; 版本&#…

Linux系統編程Day8 -- Git 教程(初階)

往期內容回顧 基于Linux系統知識的第一個程序 自動化構建工具-make/Makefile gcc/g編譯及鏈接 Vim工具的使用 Linux常用工具&#xff08;yum與vim&#xff09; ?????? Linux系統編程Day4-- Shell與權限 回顧進度條程序的編寫&#xff1a; //.h文件內容 #include<stdio…

React18 Transition特性詳解

Transition 核心概念&#xff1a;Transition是一種標記非緊急任務更新的機制&#xff0c;它允許React在用戶交互&#xff08;如輸入&#xff09;期間保持界面的響應&#xff0c;同時準備后臺更新 主要特點&#xff1a; 區分優先級&#xff1a;可以將更新分為緊急非緊急任務可中…

OpenHarmony概述與使用

1. OpenHarmony Hi3861 學習目標與任務 硬件基礎知識&#xff1a;涵蓋嵌入式硬件體系架構&#xff08;如 MCU 基礎、硬件接口原理 &#xff09;、硬件設計流程&#xff08;原理圖繪制、PCB Layout 規范 &#xff09;&#xff0c;了解常見硬件外設&#xff08;傳感器、通信模…

大模型提示詞工程實踐:大語言模型文本轉換實踐

大模型文本轉換 學習目標 在本課程中&#xff0c;我們將探究如何使用大語言模型來完成文本轉換任務&#xff0c;例如語言翻譯、拼寫和語法檢查、語氣調整以及格式轉換。 相關知識點 大模型文本轉換 學習內容 1. 大模型文本轉換 文本轉換的核心定義與范疇 文本轉換 是指通過技術…

力扣LCR024:反轉鏈表206.反轉鏈表雙解法(經典面試題)

LCR 024. 反轉鏈表 - 力扣&#xff08;LeetCode&#xff09;LCR 024. 反轉鏈表 - 給定單鏈表的頭節點 head &#xff0c;請反轉鏈表&#xff0c;并返回反轉后的鏈表的頭節點。 示例 1&#xff1a;[https://assets.leetcode.com/uploads/2021/02/19/rev1ex1.jpg]輸入&#xff1a…

Day 6: CNN卷積神經網絡 - 計算機視覺的核心引擎

Day 6: CNN卷積神經網絡 - 計算機視覺的核心引擎 ?? 核心概念(5分鐘理解) 什么是CNN卷積神經網絡? 核心概念解釋: CNN(Convolutional Neural Network): 專門處理具有網格狀拓撲結構數據的深度學習模型,特別擅長圖像識別 為什么需要: 傳統全連接神經網絡處理圖像時參數量…

MacBook 本地化部署 Dify 指南

Dify 安裝前的準備工作 確認系統滿足最低配置要求&#xff0c;包括操作系統版本、內存、CPU 和存儲空間。 檢查是否已安裝必要的依賴項&#xff0c;如 Python、Docker 確保網絡環境穩定&#xff0c;能夠訪問所需的軟件源或鏡像倉庫。 獲取 Dify 安裝包 https://docs.dify.ai…

疫情可視化:基孔肯雅熱風險地圖實戰解析

> 一只白紋伊蚊的飛行半徑是100米,而一套WebGIS系統能將疫情防控范圍精確到每平方米。 2025年夏季,基孔肯雅熱疫情在廣東佛山爆發,短短一個月內感染病例占全省95%以上。這種由伊蚊傳播的病毒性疾病,以**突發高熱、劇烈關節痛和全身皮疹**為特征,患者關節疼痛可能持續數…

【14-模型訓練細節】

訓練步驟 1、指定輸入和輸出&#xff0c;即模型定義&#xff1b; 2、指定損失函數和成本函數&#xff1b; 3、指定訓練算法&#xff0c;如梯度下降算法&#xff1b;訓練細節 損失函數和成本函數用梯度下降算法訓練模型 主要是求成本函數的偏導數&#xff0c;使用的是反向傳播算…