(自用)Java學習-5.14(注冊,鹽值加密,模糊查詢)

一、核心功能實現

1. 用戶注冊功能

前端實現
  • 用戶名實時校驗:通過AJAX異步請求檢查用戶名是否已存在。

    function checkName() {$.ajax({url: '/users/checkUserName?uname=' + uname,success: function(resp) {if (resp.code == 200) alert("用戶名可用");else $("#info").html("<font color='red'>用戶名已被注冊</font>");}});
    }

  • 密碼一致性校驗:提交前驗證兩次輸入的密碼是否一致

    if (ps != rps) {alert("兩次密碼輸入不一致");return;
    }

  • 表單提交:使用serialize()方法序列化表單數據并發送POST請求。

    $.ajax({url: '/users/register',data: $("#form-reg").serialize(),success: function(resp) {if (resp.code == 200) window.location.href = "/login.html";}
    });

后端實現
  • 控制器層:處理注冊請求,返回JSON結果。

    @RestController
    @RequestMapping("/users")
    public class UserController {@PostMapping("/register")public JsonResult register(User user) {boolean flag = userService.register(user);return flag ? new JsonResult(OK) : new JsonResult(FALL);}
    }

  • 服務層:密碼加密(MD5加鹽)及用戶數據持久化。

    public boolean register(User user) {String md5Password = getMd5Password(user.getPassword(), user.getUsername());user.setPassword(md5Password);return userMapper.insert(user) > 0;
    }

  • 數據層:通過MyBatis操作數據庫。

    <insert id="register">INSERT INTO t_user (username, password, salt) VALUES (#{username}, #{password}, #{salt});
    </insert>


2. 用戶登錄功能

前端實現
  • 回車鍵觸發登錄:監聽鍵盤事件,回車鍵提交表單。

    $(window).keydown(function(e) {if (e.keyCode == 13) $("#btn-login").click();
    });

  • 登錄請求:提交用戶名和密碼至后端驗證。

    $.ajax({url: '/users/login',data: $("#form-login").serialize(),success: function(resp) {if (resp.code == 200) window.location.href = "/index.html";}
    });

后端實現
  • 控制器層:驗證用戶信息并存儲會話。

    @PostMapping("/login")
    public JsonResult login(User user, HttpSession session) {User dbUser = userService.login(user);session.setAttribute("uid", dbUser.getUid());return new JsonResult(OK);
    }

  • 服務層:校驗用戶狀態與密碼。

    public User login(User user) {User dbUser = userMapper.getUserByUsername(user.getUsername());if (dbUser == null) throw new UserNotFoundException("用戶不存在");if (!validatePassword(user.getPassword(), dbUser.getSalt(), dbUser.getPassword())) {throw new PasswordNotMatchException("密碼錯誤");}return dbUser;
    }


二、安全與優化策略

1. 密碼安全

  • 加密方式:使用MD5加鹽(鹽值為用戶名)加密密碼。

    private String getMd5Password(String password, String salt) {for (int i = 0; i < 3; i++) {password = DigestUtils.md5DigestAsHex((salt + password + salt).getBytes());}return password;
    }

  • 改進建議:推薦使用BCrypt等更安全的哈希算法,并生成隨機鹽值。

2. 防御措施

  • SQL注入防護:通過MyBatis參數綁定(#{param})避免注入。

  • 會話管理:用戶登錄后通過Session存儲UID,敏感操作需校驗Session有效性。

  • 輸入校驗:后端需重復驗證用戶名和密碼格式(如長度、特殊字符)。


三、頁面狀態管理

1. 動態菜單顯示

  • 未登錄狀態:顯示“登錄”和“注冊”鏈接。

    if (id == 0) {$("#mymenu").append("<li><a href='/login'>登錄</a></li>");
    }

  • 已登錄狀態:顯示用戶ID和“退出”按鈕。

    if (id != 0) {$("#mymenu").append("<li>用戶ID:" + id + "</li>");$("#mymenu").append("<li><a href='javascript:logout()'>退出</a></li>");
    }


四、商品檢索功能

1. 前端實現

  • 搜索表單提交:跳轉至搜索頁并攜帶參數。

    <form action="/search.html" onsubmit="return validateSearch()"><input type="text" id="search" name="keyword"><button type="submit">搜索</button>
    </form>

  • 解析URL參數:獲取關鍵字并發送請求。

    const keyword = new URLSearchParams(window.location.search).get("keyword");
    $.ajax({url: '/product/search?keyword=' + keyword,success: function(resp) { /* 渲染結果 */ }
    });

2. 后端實現

  • 模糊查詢:通過SQL的LIKE實現。

    <select id="searchProducts">SELECT * FROM t_product WHERE title LIKE CONCAT('%', #{keyword}, '%');
    </select>

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

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

相關文章

【雜談】STM32使用快速傅里葉變換庫函數后如何比較準確地找到n次諧波幅值

目錄 1.簡單介紹傅里葉變換的作用 2.諧波是什么 3.解決方法 1.簡單介紹傅里葉變換的作用 任何復雜的波形歸根結底都是由多個頻率和相位不一樣的正弦波組成的 通過傅里葉變換可以找到組成一個復雜的波形的所有正弦波的頻率和幅度信息 2.諧波是什么 假設有一個復雜的波形&a…

芯科科技推出首批第三代無線開發平臺SoC,高度集成的解決方案推動下一波物聯網實現突破

SiXG301和SiXG302是芯科科技采用22納米工藝節點推出的首批無線SoC系列產品&#xff0c;在計算能力、功效、集成度和安全性方面實現突破性進展 低功耗無線解決方案領導性創新廠商Silicon Labs&#xff08;亦稱“芯科科技”&#xff0c;NASDAQ&#xff1a;SLAB&#xff09;近日宣…

寫作即是生活

一個問題 “我是什么時候開始寫作的呢&#xff1f;”請你先暫停一下&#xff0c;別往下讀&#xff0c;先想想這個問題。 什么才是寫作&#xff1f; 或許在想上個問題之后&#xff0c;你就會開始想問另外一個問題&#xff0c;什么才算是寫作呢&#xff1f; 我的回答是&#x…

SpringBoot 執行Lua腳本 服務端執行 減少性能損耗 優化性能 優化連接性能

介紹 通過 Redis 執行 Lua 腳本時&#xff0c;所有的操作都在服務器端完成&#xff0c;而不是多次通過網絡進行請求。這可以顯著減少網絡延遲&#xff0c;尤其是在需要多次與 Redis 交互的場景中。多個操作可以在 Lua 腳本中組合成一個操作&#xff0c;而不是分多次請求&#…

Nginx代理、緩存與Rewrite

目錄 一、正向代理 &#xff08;一&#xff09;核心概念與應用場景 &#xff08;二&#xff09;Nginx正向代理編譯安裝&#xff08;以OpenEuler為例&#xff09; &#xff08;三&#xff09;驗證正向代理 二、反向代理 &#xff08;一&#xff09;七層代理&#xff08;HT…

PortSwigger-02-XXE

一&#xff1a;漏洞原理 1、XXE XXE全稱xml外部實體注入 XML&#xff1a;是一種用于標記電子文件使其具有結構性的標記語言&#xff0c;提供統一的方法來描述和交換獨立于應用程序或者供應商的結構化數據&#xff0c;它可以用來標記數據&#xff0c;定義數據類型、是一種允許…

常規算法學習

算法 1. 排序算法1. 歸并排序1.1 普通歸并排序1.2 優化后的歸并排序&#xff08;TimSort&#xff09; 2. 插入排序2.1 直接插入排序2.2 二分插入排序2.3 成對插入排序 3. 快速排序3.1 單軸快速排序3.2 雙軸快排 4. 計數排序 2. 樹1. 紅黑樹&#xff08;Red Black Tree&#xff…

關于線程死鎖的相關知識

前言 今天學習了線程死鎖的相關知識。線程死鎖是非常重要的知識&#xff0c;寫成博客&#xff0c;加深自己對于知識的理解。 線程死鎖 結語 希望可以幫助到大家~

EMQX啟用單向認證的SSl/TLS連接的配置步驟

先確保您已經安裝了 OpenSSL 執行openssl version -a 獲取 openssl.cnf 目錄 生成自簽名服務端證書 CA 證書生成 server-ca.crt openssl req \-new \-newkey rsa:2048 \-days 365 \-nodes \-x509 \-subj "/CCN/OEMQ Technologies Co., Ltd/CNEMQ CA" \-keyout s…

依賴nacos實例動態創建線程池并監聽服務上下線

版本 Spring Booot 版本 3.2.4Spring Cloud 版本 2023.0.1Spring Cloud Alibaba 版本 2023.0.1.2 依賴 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </depe…

全面指南:使用Node.js和Python連接與操作MongoDB

在現代Web開發中&#xff0c;數據庫是存儲和管理數據的核心組件。MongoDB作為一款流行的NoSQL數據庫&#xff0c;以其靈活的數據模型、高性能和易擴展性廣受開發者歡迎。無論是使用Node.js還是Python&#xff0c;MongoDB都提供了強大的官方驅動和第三方庫&#xff0c;使得數據庫…

LeetCode 3068.最大節點價值之和:腦筋急轉彎+動態規劃(O(1)空間)

【LetMeFly】3068.最大節點價值之和&#xff1a;腦筋急轉彎動態規劃&#xff08;O(1)空間&#xff09; 力扣題目鏈接&#xff1a;https://leetcode.cn/problems/find-the-maximum-sum-of-node-values/ 給你一棵 n 個節點的 無向 樹&#xff0c;節點從 0 到 n - 1 編號。樹以長…

HTTPS加密通信詳解及在Spring Boot中的實現

HTTPS&#xff08;Hyper Text Transfer Protocol Secure&#xff09;是HTTP的安全版本&#xff0c;通過SSL/TLS協議為通訊提供加密、身份驗證和數據完整性保護。 一、HTTPS核心原理 1.加密流程概述 客戶端發起HTTPS請求&#xff08;連接到服務器443端口&#xff09;服務器返…

解決線程安全問題

前言 昨天學習了如何去解決線程不安全的問題。一般方法都是通過加鎖來處理&#xff0c;跟大家分享一波 。 解決線程安全問題 結語 希望可以幫助到大家~ byebye

網絡常識:網線和光纖的區別

網絡常識&#xff1a;網線和光纖的區別 一. 介紹二. 網線2.1 什么是網線&#xff1f;2.2 網線的主要類別2.3 網線的優勢2.4 網線的劣勢 三. 光纖3.1 什么是光纖&#xff1f;3.2 光纖的主要類別3.3 光纖的優勢3.4 光纖的劣勢 四. 網線 vs 光纖&#xff1a;誰更適合你&#xff1f…

win11 禁用/恢復 內置筆記本鍵盤(保證管用)

文章目錄 禁用啟用 禁用 1&#xff09;按下 win x&#xff0c;點擊 設備管理器 2&#xff09;拔掉所有筆記本外設&#xff08;一定要都拔掉&#xff0c;不然后面禁用設備會混淆&#xff09;&#xff0c;然后右鍵點擊 鍵盤 > HID Keyboard Device 2&#xff09;點擊 更新…

Three.js搭建小米SU7三維汽車實戰(5)su7登場

汽車模型加載 我們在sktechfab上下載的汽車是glb的文件格式&#xff0c;所以使用gltfLoader進行加載。這里將小車直接加載進來看看效果&#xff1b; import { GLTFLoader } from "three/addons/loaders/GLTFLoader.js"; ....其余代碼省略 const gltfLoader new GLT…

ETL怎么實現多流自定義合并?

隨著信息技術的迅猛發展以及數據生成環境的多樣化&#xff0c;互聯網、物聯網和社交媒體的廣泛應用導致各種設備和平臺不斷產生大量數據&#xff0c;需要整合這些數據&#xff0c;從而進行數據融合。數據集成和管理平臺ETLCloud&#xff0c;主要用于支持數據的抽取&#xff08;…

數據結構- 10種常見樹:二叉樹、平衡二叉樹、完全二叉樹

一、樹 樹型結構是一類重要的非線性數據結構。其中以樹和二叉樹最為常用&#xff0c;直觀看來&#xff0c;樹是以分支關系定義的層次結構。把它叫做“樹”是因為它常看起來像一棵倒掛的樹&#xff0c;也就是說它常是根朝上&#xff0c;而葉朝下的。 1.樹的定義&#xff1a; 樹…

Java常用加密方式

一&#xff0c;加密算法分類 對稱加密&#xff1a;指加密和解密的密鑰相同&#xff0c;優點就是加解密的效率高且易于實現。 非對稱加密&#xff1a;指加密和解密的密鑰不相同&#xff0c;也稱為公私要加密。 不可逆加密&#xff1a;特征就是加密過程不需要密鑰&#xff0c;…