正常的用户每天的登录退出不会太频繁,遇到频繁的登录则很可能是黑客行为。对于黑客行为,我们可以使用登录次数限制来应对。本文将介绍如何限制用户每天的登录次数,包括:“记录当天用户账号的登录次数”、“用户进行登录请求时,检查当天账号的登录次数”、“用户正常退出登录,更新登录次数”。

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实现用户每天登录次数的限制相关推荐

  1. php错误密码也能登陆账号,php用户登陆代码(限制用户错误登录次数)(1/2

    php用户登陆代码(限制用户错误登录次数)(1/2)php用户登陆代码(限制用户错误登录次数) php教程用户登陆代码(限制用户错误登录次数) session_start(); include(&qu ...

  2. java连接数据库用户 'sa' 登录失败。 ClientConnectionId:解决方法

    转载▼     使用 JDBC 连接数据库时候,前些天还好好的,突然就不能用了,报了下边的错误 at com.microsoft.sqlserver.jdbc.SQLServerException: ...

  3. java 防止用户重复登录_JAVA 如何避免用户的重复登录

    展开全部 读懂下面代码,就知道如何实现 一个用户登陆 踢掉之前登陆的用户了//第一步 // 此监听62616964757a686964616fe4b893e5b19e31333337626166器用来 ...

  4. java实现用户登录异常统计、锁定及解锁功能

    写在前面 现在很多互联网项目.app等都会有登录异常提醒.登录异常次数限制,基本都是5次异常后就会锁定一定时间的账户,让该账户无法进行登录操作.需要注册用户使用安全验证手段(如动态验证码等),解除锁定 ...

  5. java判断用户是否在某一个区域登录_Java实现QQ登录和微博第三方登录

    来源:http://www.cnblogs.com/liuxianan转自公众号:Java后端 1. 前言 个人网站最近增加了评论功能,为了方便用户不用注册就可以评论,对接了 QQ 和微博这 2 大常 ...

  6. aix用户登录次数受限问题(3004-300 输入了无效的登录名或password)

    当登录AIX系统.username或password不对以至于多次登录,超过系统设定的次数,怎样解锁: 1.用root用户登录系统 2.chuser unsuccessful_login_count= ...

  7. java ee用户登录_EE Servlet 3:使用会话和过滤器开发用户登录

    java ee用户登录 我在上一篇文章中介绍了Application类,您可以在其中设置后端服务. 我添加的一个示例服务是UserService . 该服务将加载包含用户名和密码集的Java用户属性文 ...

  8. java用户的登录图片_Java 如何用 token 做用户登录认证

    1.什么是 token??? Token 是服务端生成的一串字符串,以作客户端进行请求的一个令牌. 2.token 做用户登录认证 ● 流程 3. Java 实现 ● 用户登录生成 token,保存到 ...

  9. java检测用户是否重复登录_Java web工程判断用户是否重复登录

    前几天,网上找了些朋友的资料,做了一个小功能,验证用户是否重复登录. 原理就是:每一个用户,登录前有一个验证,当第一次登录时,会把其session信息,添加到一个特定的静态变量中.当第二次登录时,验证 ...

最新文章

  1. Python matplotlib可视化:自定义轴标签格式化函数(在轴刻度上添加自定义的数值以及符号形式)、使用自定义函数在Matplotlib中为坐标轴刻度添加自定义符号(例如,货币符号¥$等)
  2. vscode设置eslint检验无效_大整理!JavaScript开发者的27个神奇VSCode工具
  3. 什么是数据中心,它们是如何变化的?
  4. linux raid和mdadm,linux的raid和mdadm
  5. 如何使用ZBrush和3DMAX雕刻一个百夫长?
  6. 函数计算搭建 Serverless Web 应用(二)- 自定义域名
  7. 使用Eclipse调试Android程序时无法安装控制台报错INSTALL_FAILED_UPDATE_INCOMPATIBLE
  8. Julia : Some, something, Nothing
  9. Java怎么安装 详细教程来了 附带安装包
  10. 使用树莓派4B最新官方烧录软件烧录镜像设置密码,直接登录wifi
  11. Dell电脑重装系统
  12. 服务器磁盘阵列数据恢复方法和数据恢复过程详解
  13. 取次花丛懒回顾,半缘修道半缘君。
  14. 视频教程-Java异常原理剖析-Java
  15. MATLAB泰勒级数展开
  16. java注解和反射详解
  17. 金蝶KIS商贸版实现'条码标签打印'功能进行商品条码打印
  18. 文件服务器定时开关机,服务器设置定时开关机
  19. Python 3.x + 阿里云SDK 实现DDNS
  20. 较详细的MongDB工具类

热门文章

  1. 驾驭和取悦-《后宫甄嬛传》看后感
  2. 2014.11.20
  3. 容器编排——Kubeadm在线或离线搭建kubernetes高可用集群
  4. 基础实验2-2.2 求集合数据的均方差
  5. 一桩婚姻引发的数学建模
  6. Vue 响应式系统(二)- observe 工厂函数
  7. 第6章 实战电影公众号 6-1 第六天简介
  8. [UE4] UI部分
  9. PyQt5、PySide2、PySide6使用QLabel显示图片,缩放图片并保持长宽比
  10. 【elementUI样式优化】之el-input输入数字类型 type=‘number‘ 不显示右侧上下箭头 == 修改箭头右边距