“用户多次登录,账号冻结业务”功能实现(代码+详细注释)

目录

设计思路

分析

前后端交互接口

请求

响应

代码实现和详细注释

数据库设计

实体类设计

前后端交互

客户端开发

服务器开发


设计思路


分析

需求:当用户输入的用户名存在,并且密码输错 3 次以上,就触发账号冻结功能(冻结时间自定义0)。

主要分为以下步骤:

  1. 对客户端传入的账号和密码进行非空校验。(防止恶意用户通过 Postman 等工具请求非法数据)
  2. 通过客户端传入的账号获取该用户的所有数据,进行非空校验。
  3. 判断该用户输错密码是否等于 3 次(通过用户表的 state 字段的数值进行判断),若等于 3 次,首先记录下该用户开始冻结的时间(通过用户表中的 createtime 字段记录,这个字段后面会用到),创建一个线程使用 wait 进行冷冻时间等待,当冷冻时间结束,唤醒线程,将用户输错密码次数修改为 0 (state = 0)。
  4. 若输错密码小于 3 次,则校验密码是否正确,若密码错误则 state + 1,若密码正确,则 state = 0。
  5. 若输错密码大于 3 次,则计算剩余冷却时间(剩余冷却时间 = 开始冻结的时间 + 冷冻的时间 - 当前时间),这个计算不难,不好处理的时间格式(代码注释中有详细解释),最后将剩余冷却时间反馈给客户端。

前后端交互接口

请求

POST /user/login
Content-Type: application/json
{"username": username.val(),"password": password.val()
}

响应

Ps:采用同一返回数据格式处理(“code:状态码,msg:信息,data:数据”)

HTTP/1.1 200 OK
Content-Type: application/json
{code: 200,msg: "",data: 1
}

代码实现和详细注释


数据库设计

用户表如下:

create table userinfo(id int primary key auto_increment,username varchar(100) unique,password varchar(65) not null,photo varchar(500) default "img/default.jpg",createtime timestamp default current_timestamp,updatetime timestamp default current_timestamp,`state` int default 0
) default charset 'utf8mb4';

实体类设计

用户实体类如下:

@Data
public class UserInfo {private Integer id;private String username;private String password;private String photo;//格式化时间处理(处理到秒是为了精确冻结时间)@JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss", timezone = "GMT+8")private LocalDateTime createtime;@JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss", timezone = "GMT+8")private LocalDateTime updatetime;private Integer state;}

前后端交互

客户端开发

js代码如下:

        function login() {//非空校验var username = jQuery("#username");var password = jQuery("#password");var inputCheckPassword = jQuery("#checkpassword");if (username.val() == "") {alert("请先输入用户名!");username.focus();return;}if (password.val() == "") {alert("请先输入密码!");password.focus();return;}if(inputCheckPassword.val() == "") {alert("请先输入验证码!");inputCheckPassword.focus();return;}//比较验证码if(inputCheckPassword.val() != checkPassword) {alert("验证码错误,请重试");inputCheckPassword.focus();return;}//ajax 登录接口jQuery.ajax({type: "POST",url: "/user/login",data: {"username": username.val(),"password": password.val()},success: function (result) {if (result != null && result.code == 200 && result.data != null) {//登录成功location.href = '/myblog_list.html';} else {alert(result.msg);}}});

服务器开发

    private Object lock = new Object();@RequestMapping("/login")public AjaxResult login(HttpServletRequest request, HttpServletResponse response, String username, String password) throws IOException, ParseException {//非空校验if(!StringUtils.hasLength(username) || !StringUtils.hasLength(password)) {return AjaxResult.fail(403, "账号或密码错误,请稍后重试!");}UserInfo userInfo = userService.getUserByName(username);if(userInfo == null || !StringUtils.hasLength(userInfo.getUsername()) ||!StringUtils.hasLength(userInfo.getPassword())) {return AjaxResult.fail(403, "账号不存在!");}//安全校验:当用户输入密码错误 3 次执行冻结(禁止用户登录)SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");if(userService.getStateByName(username) == 3) {//记录该用户开始冻结时间(格式yyyy-MM-ddThh:mm:ss)userInfo.setCreatetime(LocalDateTime.now());//修改用户开始冻结时间userService.updateUserInfoById(userInfo);Thread thread = new Thread(new Runnable() {@Overridepublic void run() {synchronized (lock) {try {//state + 1userService.updateStateByName(username, userInfo.getState() + 1);lock.wait(AppVariable.FREEZE_TIME); //这里为了演示效果,时间设置为 10s//解冻:修改 state 为 0userService.updateStateByName(username, 0);lock.notify();} catch (InterruptedException e) {e.printStackTrace();}}}});thread.start();return AjaxResult.fail(403, "账号已被冻结,请 10s 后重试!");} else if(userService.getStateByName(username) > 3) {//账号错误三次以上,计算剩余时间//将格式话时间转化为时间戳计算String[] time = userInfo.getCreatetime().toString().split("T");Date date = simpleDateFormat.parse(time[0] + " " + time[1]);//计算相差秒数(以下计算都是 毫秒级别,因此最后需要除 1000 换算到秒)return AjaxResult.fail(403, "账号已被冻结,请 "+((date.getTime() +  AppVariable.FREEZE_TIME - System.currentTimeMillis()) / 1000) +"s 后重试");}//ps:这里注意要对加盐密码解密if(userInfo == null || !PasswordUtils.check(password, userInfo.getPassword())) {//用户名不存在或密码错误if(!PasswordUtils.check(password, userInfo.getPassword())) {//密码错误,该用户的 state 需要 +1userService.updateStateByName(username, userInfo.getState() + 1);}return AjaxResult.fail(403, "账号或密码错误,请稍后重试!");}//登录成功HttpSession session = request.getSession(true);session.setAttribute(AppVariable.USER_SESSION_KEY, userInfo);//安全校验,登录成功后将 state 状态改回 0userService.updateStateByName(username, 0);return AjaxResult.success(1);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/46308.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PayPal账号被冻结怎么办?防止PayPal帐号冻结和解冻的经验

最近半年以来,因为PayPal收付款遭到账户冻结的用户不在少数。以至于很多用户举着横幅去PayPal上海办公楼前维权,这件事情闹得沸沸扬,也给我们广大用户敲响了警钟。 因为Paypal作为全球性的支付工具,速卖通等跨境电商的主要支付方式…

WhatsApp Business账户被封?常见封号原因解析(附防封指南)

关键词:WhatsApp Business,WhatsApp封号 目前,WhatsApp在全球拥有超过20亿月活跃用户。由于其主导地位,其已成为企业进行营销、与客户沟通的首选工具。但是,不幸的是,如果你的WhatsAppBusiness账户突然被封…

数据可视化:FineReport公司财务报表制作

前言 在互联网时代下的财务工作中,最大一部分工作是数据展示,如何提取最合适的业务指标,最直观地反应业务价值,使运营人员快速了解前端…

ireport——第一张报表的制作(pdf)

文章目录 前言新建ireport报表信息展示区域划分组件面板常用组件说明添加标题数据表格制作1、数据的查询与表格创建2、设置报表数据的边框属性3、设置数量统计(表格右上角) 右侧组件面板开启关于预览样式选择 前言 在上一篇文章中,讲述了ireport 5.6的安装&#xf…

比ureport好用的报表系统-VeryReport报表系统

随着数据时代的到来,数据成为企业管理和决策的重要依据。然而,在处理海量数据的同时,如何快速准确地生成各种形式的报表却成为了一个痛点。手工制作报表费时费力、容易出错;而传统的报表工具又复杂难用,无法满足不同用…

从Excel到Smartbi,国内头部企业的报表是这样进阶的!

​作为新生代打工人,大家在工作中总免不了要做报表,而做报表这件事真是要从年头做到年尾。比如,每月财务部门需要制作财务报表反映企业的状况,以帮助管理层进行科学决策;每个季度业务部门需要制作运营报表,…

PowerBI 实现中国式报表

本文分享如何用PowerBI实现动态表头、多行表头、行标题合并单元格。 一、动态表头(可变表头) 实现效果:表头(字段名称)随着筛选条件变动,如下: 筛选季度1时,则显示“Q1预测”、“Q…

ireport的简单使用(数据表格)报表

如果出现ireport打不开的问题正常都是因为JDK版本太高了,百度下如何简单,很容易的 首先:文件->new,选择Blank A4,Open this template 2、取个名字,选择下保存的位置,点击完成 3、此时新模板…

让企业报表化繁为简,Smartbi实现报表统一管理

报表作为大家日常工作的关键和必不可少的内容,往往需要定期进行维护和更新。处在工作的不同时间、不同岗位、不同职责,要做的报表也各不相同。 随着时间的推移,手上的报表也会越来越多,而这还只是从个人的角度出发来理解&#xff…

报表模块-report

报表模块是基础模块以外单独开发的一个模块,该模块很好的集成到整个pwdis中,报表模块使用的是第三方报表引擎limereport作为报表的底层库,limereport是一个非常强大的报表引擎,它有报表设计器与报表库两个部分,相关详细…

FineReport 报表模板生成+导出Excel表格

跟spring boot 整合 :https://blog.csdn.net/zhanglixin_1984/article/details/79194145 看官方的文档纠结了一天,好东西,这个怎么下手,但是还是想总结一下。 FineReport报表技术,给我的感觉跟IReport报表的思路差不…

统计报表用的什么软件(制作报表必备的3款软件)

最近因为工作需要,我接触使用了几款报表软件,觉得还不错,推荐给大家使用。 VeryReport VeryReport采用Java编写,B/S结构,无需安装客户端,使用浏览器即可做报表设计。易学易用,轻松解决中国式复…

ChatGPT介绍,与BERT区别及在公司使用方向

浅析ChatGPT ChatGPT介绍 ChatGPT 是OpenAI公司推出人工智能聊天机器人程序。ChatGPT能够以流畅的自然语言跟人聊天,还能根据聊天的上下文进行互动,其答案体现了很强的自然语言理解、信息综合和推理能力,以及其模型中蕴含的丰富的知识。Cha…

ChatGPT会取代MySQL DBA吗?(译自Percona)

让权威网站Percona来回答这个很多人都在关心的问题。 原文网址:ChatGPT 不会取代 MySQL DBA - 关于静态加密的问题示例 - Percona 数据库性能博客 作者:Edwin Wang 译者,姚远 ChatGPT是目前科技界最热门的话题,有人甚至说Chat…

被Chatgpt碾压的打工人与大学生,准备反击!

最近一段时间,chatgpt可谓如火如荼,它的出现引发各行各业的震动,有人利用它实现了一夜暴富,有企业将它纳进人才招聘的技能要求中,国内各大厂商也纷纷下场推出自家的AI大模型,从第一代到GPT-4,所…

神坛上的插画师真的高薪且自由吗?

插画师的定义:就是以绘画插画为职业的人,主要工作包括替书籍、杂志、报纸、说明书、小说、教科书等刊物绘制插画、封面,也从事绘画贺卡、海报、广告、喷画、幽默画等。分为电子插画和纯手绘。 那么,手绘插画师的收入怎么样呢?封面一般1千到8百,内页100-500左右。每个公司…

插画师必备的6个宝藏网站

1、pinterest https://www.pinterest.es/ 国外网站,需要梯子,里面有超多优秀插画作品,非常值得收藏。 ​ 2、花瓣网 https://huaban.com/ 国内素材网站,很多设计、插画、摄影等作品,可以拿来做参考。 ​ 3、站酷网…

插画师培训怎么选,5大插画师培训班排名

插画师培训哪里好,给大家推荐5大插画师培训班排名,各有优势和特色,提供大家选择! 一:5大插画师培训班排名 1、轻微课(五颗星) 主打课程有日系插画、游戏原画、古风插画、动漫漫画,以…

ubantu报错: 正在等待缓存锁:无法获得锁 /var/lib/dpkg/lock-frontend。锁正由进程3228(aptd)

1. 问题描述 有时候终端运行时会进行如下报错: 2. 问题原因 一般出现这种原因是因为文件上锁或者被占用 3. 解决方法 sudo rm /var/cahe/apt/archives/lock sudo rm /var/lib/dpkg/lock运行代码块后,结果如下所示: 出现“…没有那个文件目…

Linux “无法获得锁 /var/lib/dpkg/lock-frontend - open“

问题 在Linux下使用sudo apt install命令时如果出现提示&#xff1a;<mark>无法获得锁 /var/lib/dpkg/lock-frontend - open</mark> 原因 出现这个问题的原因可能是有另外一个程序正在运行&#xff0c;由于它在运行时&#xff0c;会占用软件源更新时的系统锁&…