(自用)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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;…