Java实现用户每天登录次数的限制
正常的用户每天的登录退出不会太频繁,遇到频繁的登录则很可能是黑客行为。对于黑客行为,我们可以使用登录次数限制来应对。本文将介绍如何限制用户每天的登录次数,包括:“记录当天用户账号的登录次数”、“用户进行登录请求时,检查当天账号的登录次数”、“用户正常退出登录,更新登录次数”。
1、记录当天用户账号的登录次数。
定义hashmap类型的属性mapLoginCountIn1Day,用来存储当前用户账号(key)和登录账号的次数(value):
protected static Map<String, Object> mapLoginCountIn1Day = new HashMap<String, Object>();
定义另一个hashmap类型的属性mapLoginDay,用户存储当前日期(key)和mapLoginCountIn1Day(value):
protected static Map<String, Object> mapLoginDay = new HashMap<String, Object>();
2、用户进行登录请求时,检查当天账号的登录次数。
在checkLoginCount方法检查登录次数:
@SuppressWarnings("unchecked")protected boolean checkLoginCount(Object phone, ErrorInfo ecOut) {boolean bLoginToManyTimes = false; // 检查Staff是否登录次数过多lock.writeLock().lock();try {BxConfigGeneral cgMaxRequestCountIn1Day = (BxConfigGeneral) CacheManager.getCache(BaseAction.DBName_Public, EnumCacheType.ECT_BXConfigGeneral).read1(BaseCache.MaxLoginCountIn1Day, BaseBO.SYSTEM, ecOut, BaseAction.DBName_Public);int MAX_LoginCountIn1Day = Integer.valueOf(cgMaxRequestCountIn1Day.getValue());// MAX_LoginCountIn1Day = 5;String dateForDay = sdfLoginCountIn1Day.format(new Date());if (mapLoginDay.get(dateForDay) == null) {mapLoginDay.clear();mapLoginCountIn1Day.put(String.valueOf(phone), 1);mapLoginDay.put(dateForDay, mapLoginCountIn1Day);} else {mapLoginCountIn1Day = (Map<String, Object>) mapLoginDay.get(dateForDay);if (mapLoginCountIn1Day.get(phone) == null) {mapLoginCountIn1Day.put(String.valueOf(phone), 1);} else {int currentLoginCountIn1Day = (int) mapLoginCountIn1Day.get(phone);mapLoginCountIn1Day.put(String.valueOf(phone), ++currentLoginCountIn1Day);if (currentLoginCountIn1Day >= MAX_LoginCountIn1Day) {if (currentLoginCountIn1Day % MAX_LoginCountIn1Day == 0) {logger.error("手机号码" + phone + "当天已超过登录次数,已登录" + currentLoginCountIn1Day + "次");}bLoginToManyTimes = true;}}}} catch (Exception e) {logger.error(e.getMessage());}lock.writeLock().unlock();//if (bLoginToManyTimes) {return false;// 从此禁止用户再次登录。那么,用户什么时候可以再次登录?1、重启Tomcat。2、给OP开发一个接口。(后面再做)}return true;}
首先判断在当前日期有没有用户登录过mapLoginDay.get(dateForDay),没有登录过则清空mapLoginDay,并将该账号的登录次数设为1,缓存到mapLoginDay。
如果当前日期有用户登录过:
判断当前用户有无登录过,没有登录过将该账号的登录次数设为1,缓存到mapLoginDay。登录过就将账号的登录次数加1。如果登录次数大于设定的值MAX_LoginCountIn1Day(可以在数据库定义、读取),就阻止用户在当天的登录。
3、用户正常退出登录,更新登录次数。
用户退出登录请求接口:
@RequestMapping(value = "/logoutEx", produces = "plain/text; charset=UTF-8", method = RequestMethod.GET)@ResponseBodypublic String logout(HttpSession session) {if (!canCallCurrentAction(session, BaseAction.EnumUserScope.STAFF.getIndex())) {logger.debug("无权访问本Action");return null;}Company company = getCompanyFromSession(session);Staff staff = (Staff) session.getAttribute(EnumSession.SESSION_Staff.getName()); // ...定义常量logger.info("服务器的登出,staff=" + staff);Map<String, Object> params = new HashMap<String, Object>();if (staff != null) {// 更新Staff登录次数updateLoginCount(staff.getPhone());params.put(BaseAction.JSON_ERROR_KEY, EnumErrorCode.EC_NoError.toString());Pos pos = (Pos) session.getAttribute(EnumSession.SESSION_POS.getName());if (pos != null && pos.getID() != BaseAction.INVALID_POS_ID) {sendLogoutMsgToWx(staff, company);}// if (staff.getInt3() == 1 || Staff.DEFINE_GET_RoleID(staff.getInt1()) == 1) {// sendMsgToWx(staff, company);// }} else {logger.info("其他错误");params.put(BaseAction.JSON_ERROR_KEY, EnumErrorCode.EC_OtherError.toString());}params.put(KEY_HTMLTable_Parameter_msg, staffBO.getLastErrorMessage());logger.info("返回的数据=" + params);EnumSession.clearAllSession(session);session.invalidate();return JSONObject.fromObject(params, JsonUtil.jsonConfig).toString();}
updateLoginCount方法更新登录次数:
@SuppressWarnings("unchecked")protected void updateLoginCount(Object phone) {lock.writeLock().lock();//try {String dateForDay = sdfLoginCountIn1Day.format(new Date());if (mapLoginDay.get(dateForDay) != null) {mapLoginCountIn1Day = (Map<String, Object>) mapLoginDay.get(dateForDay);if (mapLoginCountIn1Day.get(phone) != null) {int currentLoginCountIn1Day = (int) mapLoginCountIn1Day.get(phone);mapLoginCountIn1Day.put(String.valueOf(phone), --currentLoginCountIn1Day);}}} catch (Exception e) {logger.error(e.getMessage());}//lock.writeLock().unlock();}
Java实现用户每天登录次数的限制相关推荐
- php错误密码也能登陆账号,php用户登陆代码(限制用户错误登录次数)(1/2
php用户登陆代码(限制用户错误登录次数)(1/2)php用户登陆代码(限制用户错误登录次数) php教程用户登陆代码(限制用户错误登录次数) session_start(); include(&qu ...
- java连接数据库用户 'sa' 登录失败。 ClientConnectionId:解决方法
转载▼ 使用 JDBC 连接数据库时候,前些天还好好的,突然就不能用了,报了下边的错误 at com.microsoft.sqlserver.jdbc.SQLServerException: ...
- java 防止用户重复登录_JAVA 如何避免用户的重复登录
展开全部 读懂下面代码,就知道如何实现 一个用户登陆 踢掉之前登陆的用户了//第一步 // 此监听62616964757a686964616fe4b893e5b19e31333337626166器用来 ...
- java实现用户登录异常统计、锁定及解锁功能
写在前面 现在很多互联网项目.app等都会有登录异常提醒.登录异常次数限制,基本都是5次异常后就会锁定一定时间的账户,让该账户无法进行登录操作.需要注册用户使用安全验证手段(如动态验证码等),解除锁定 ...
- java判断用户是否在某一个区域登录_Java实现QQ登录和微博第三方登录
来源:http://www.cnblogs.com/liuxianan转自公众号:Java后端 1. 前言 个人网站最近增加了评论功能,为了方便用户不用注册就可以评论,对接了 QQ 和微博这 2 大常 ...
- aix用户登录次数受限问题(3004-300 输入了无效的登录名或password)
当登录AIX系统.username或password不对以至于多次登录,超过系统设定的次数,怎样解锁: 1.用root用户登录系统 2.chuser unsuccessful_login_count= ...
- java ee用户登录_EE Servlet 3:使用会话和过滤器开发用户登录
java ee用户登录 我在上一篇文章中介绍了Application类,您可以在其中设置后端服务. 我添加的一个示例服务是UserService . 该服务将加载包含用户名和密码集的Java用户属性文 ...
- java用户的登录图片_Java 如何用 token 做用户登录认证
1.什么是 token??? Token 是服务端生成的一串字符串,以作客户端进行请求的一个令牌. 2.token 做用户登录认证 ● 流程 3. Java 实现 ● 用户登录生成 token,保存到 ...
- java检测用户是否重复登录_Java web工程判断用户是否重复登录
前几天,网上找了些朋友的资料,做了一个小功能,验证用户是否重复登录. 原理就是:每一个用户,登录前有一个验证,当第一次登录时,会把其session信息,添加到一个特定的静态变量中.当第二次登录时,验证 ...
最新文章
- Python matplotlib可视化:自定义轴标签格式化函数(在轴刻度上添加自定义的数值以及符号形式)、使用自定义函数在Matplotlib中为坐标轴刻度添加自定义符号(例如,货币符号¥$等)
- vscode设置eslint检验无效_大整理!JavaScript开发者的27个神奇VSCode工具
- 什么是数据中心,它们是如何变化的?
- linux raid和mdadm,linux的raid和mdadm
- 如何使用ZBrush和3DMAX雕刻一个百夫长?
- 函数计算搭建 Serverless Web 应用(二)- 自定义域名
- 使用Eclipse调试Android程序时无法安装控制台报错INSTALL_FAILED_UPDATE_INCOMPATIBLE
- Julia : Some, something, Nothing
- Java怎么安装 详细教程来了 附带安装包
- 使用树莓派4B最新官方烧录软件烧录镜像设置密码,直接登录wifi
- Dell电脑重装系统
- 服务器磁盘阵列数据恢复方法和数据恢复过程详解
- 取次花丛懒回顾,半缘修道半缘君。
- 视频教程-Java异常原理剖析-Java
- MATLAB泰勒级数展开
- java注解和反射详解
- 金蝶KIS商贸版实现'条码标签打印'功能进行商品条码打印
- 文件服务器定时开关机,服务器设置定时开关机
- Python 3.x + 阿里云SDK 实现DDNS
- 较详细的MongDB工具类
热门文章
- 驾驭和取悦-《后宫甄嬛传》看后感
- 2014.11.20
- 容器编排——Kubeadm在线或离线搭建kubernetes高可用集群
- 基础实验2-2.2 求集合数据的均方差
- 一桩婚姻引发的数学建模
- Vue 响应式系统(二)- observe 工厂函数
- 第6章 实战电影公众号 6-1 第六天简介
- [UE4] UI部分
- PyQt5、PySide2、PySide6使用QLabel显示图片,缩放图片并保持长宽比
- 【elementUI样式优化】之el-input输入数字类型 type=‘number‘ 不显示右侧上下箭头 == 修改箭头右边距