登录信息记录模块实现(UserAgentUtils)
创始人
2024-03-25 02:08:19
0

如果文章对你有帮助欢迎【关注❤️❤️❤️点赞👍👍👍收藏⭐⭐⭐】一键三连!一起努力!

一、UserAgentUtils简介

user-agent-utils 是一个用来解析 User-Agent 字符串的 Java 类库。

其能够识别的内容包括:

  • 超过150种不同的浏览器;
  • 7种不同的浏览器类型;
  • 超过60种不同的操作系统;
  • 6种不同的设备类型;
  • 9种不同的渲染引擎;
  • 9种不同的Web应用,如HttpClient、Bot。

在web应用中我们通过request获取用户的Agent并解析Agent字段 :

// 解析agent字符串
UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent"));
// 获取浏览器对象
Browser browser = userAgent.getBrowser();
// 获取操作系统对象
OperatingSystem operatingSystem = userAgent.getOperatingSystem();
System.out.println("浏览器名:" + browser.getName());
System.out.println("浏览器类型:" + browser.getBrowserType());
System.out.println("浏览器家族:" + browser.getGroup());
System.out.println("浏览器生产厂商:" + browser.getManufacturer());
System.out.println("浏览器使用的渲染引擎:" + browser.getRenderingEngine());
System.out.println("浏览器版本:" + userAgent.getBrowserVersion());
System.out.println("==================================================" );
System.out.println("==================================================" );
System.out.println("操作系统名:" + operatingSystem.getName());
System.out.println("访问设备类型:" + operatingSystem.getDeviceType());
System.out.println("操作系统家族:" + operatingSystem.getGroup());
System.out.println("操作系统生产厂商:" + operatingSystem.getManufacturer());

输出:

浏览器名:Chrome 10
浏览器类型:WEB_BROWSER
浏览器家族:CHROME
浏览器生产厂商:GOOGLE
浏览器使用的渲染引擎:WEBKIT
浏览器版本:107.0.0.0
==================================================
==================================================
操作系统名:Windows 10
访问设备类型:COMPUTER
操作系统家族:WINDOWS
操作系统生产厂商:MICROSOFT

二、登录日志模块实现

实现后的样式:
在这里插入图片描述

1、创建数据库表

CREATE TABLE `sys_login_info` (`info_id` bigint NOT NULL AUTO_INCREMENT COMMENT '访问ID',`user_name` varchar(50) DEFAULT '' COMMENT '用户账号',`ipaddr` varchar(128) DEFAULT '' COMMENT '登录IP地址',`login_location` varchar(255) DEFAULT '' COMMENT '登录地点',`browser` varchar(50) DEFAULT '' COMMENT '浏览器类型',`os` varchar(50) DEFAULT '' COMMENT '操作系统',`status` tinyint(1) DEFAULT '1' COMMENT '登录状态(1成功 0失败)',`msg` varchar(255) DEFAULT '' COMMENT '提示消息',`login_time` datetime DEFAULT NULL COMMENT '访问时间',PRIMARY KEY (`info_id`)
) ENGINE=InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='系统访问记录';

2、准备对应实体类

/*** 

* 系统访问记录*

** @author Xiong* @since 2022-12-06*/ @Data @Builder @AllArgsConstructor @NoArgsConstructor @TableName("sys_login_info") @ApiModel(value = "SysLoginInfo对象", description = "系统访问记录") public class SysLoginInfo implements Serializable {private static final long serialVersionUID = 1L;@ApiModelProperty("访问ID")@TableId(value = "info_id", type = IdType.AUTO)private Long infoId;@ApiModelProperty("用户账号")private String userName;@ApiModelProperty("登录IP地址")private String ipaddr;@ApiModelProperty("登录地点")private String loginLocation;@ApiModelProperty("浏览器类型")private String browser;@ApiModelProperty("操作系统")private String os;@ApiModelProperty("登录状态(1成功 0失败)")private Boolean status;@ApiModelProperty("提示消息")private String msg;@ApiModelProperty("访问时间")private Date loginTime; }

3、导入对应依赖


eu.bitwalkerUserAgentUtils1.21

4、修改登录接口

@Override
public UserDTO login(UserDTO userDTO) {// 用户密码 md5加密userDTO.setPassword(SecureUtil.md5(userDTO.getPassword()));User one = getUser(userDTO);if (one != null) {BeanUtil.copyProperties(one, userDTO, true);// 设置tokenString token = TokenUtils.getToken(one.getUserId().toString(), one.getPassword());userDTO.setToken(token);// 设置菜单userDTO.setMenus(getRoleMenus(one));// 将用户信息存到redisstringRedisTemplate.opsForValue().set(USER_INFO, JSONUtil.toJsonStr(userDTO));// 记录登录日志AsyncManager.me().execute(AsyncFactory.recordLoginInfo(one.getUserName(), Constants.LOGIN_SUCCESS, "登录成功!"));return userDTO;} else {throw new ServiceException(HttpStatus.NO_CONTENT, "用户名或密码不正确");}
}

异步任务管理器:

/*** @description: 异步任务管理器* @author: Xiong* @date: 2022/12/7 10:58*/
public class AsyncManager {/*** 操作延迟10毫秒*/private static final int OPERATE_DELAY_TIME = 10;/*** 异步操作任务调度线程池*/private ScheduledExecutorService executor = SpringUtils.getBean("scheduledExecutorService");/*** 单例模式*/private AsyncManager() {}private static AsyncManager me = new AsyncManager();public static AsyncManager me() {return me;}/*** 执行任务** @param task 任务*/public void execute(TimerTask task) {executor.schedule(task, OPERATE_DELAY_TIME, TimeUnit.MILLISECONDS);}/*** 停止任务线程池*/public void shutdown() {executor.shutdown();}
}

异步工厂:

/*** @description: 异步工厂(产生任务用)* @author: Xiong* @date: 2022/12/7 10:45*/
public class AsyncFactory {private static final Logger sys_user_logger = LoggerFactory.getLogger("sys-user" );/*** 记录登录信息** @param username 用户名* @param status   状态* @param message  消息* @param args     列表* @return 任务task*/public static TimerTask recordLoginInfo(final String username, final String status, final String message,final Object... args) {final UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent" ));final String ip = IpUtils.getIpAddr(ServletUtils.getRequest());return new TimerTask() {@Overridepublic void run() {String address = AddressUtils.getRealAddressByIP(ip);// 获取操作系统String os = userAgent.getOperatingSystem().getName();// 获取客户端浏览器String browser = userAgent.getBrowser().getName();// 封装对象SysLoginInfo loginInfo = new SysLoginInfo();loginInfo.setUserName(username);loginInfo.setIpaddr(ip);loginInfo.setLoginLocation(address);loginInfo.setBrowser(browser);loginInfo.setOs(os);loginInfo.setMsg(message);loginInfo.setLoginTime(new Date());// 日志状态if (StringUtils.equalsAny(status, Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER)) {loginInfo.setStatus(Boolean.TRUE);} else if (Constants.LOGIN_FAIL.equals(status)) {loginInfo.setStatus(Boolean.FALSE);}// 插入数据SpringUtils.getBean(ISysLoginInfoService.class).saveOrUpdate(loginInfo);}};}}

其中涉及到很多工具类,大家可以根据自己的项目自行实现所需要信息的获取,这里不做过多的解释。

如果需要可以从项目中获取git地址如下:
https://gitee.com/mr_xiongs_gitee/Jesus

感谢各位家人的观看喜欢的话点帮忙点赞👍👍👍哦

相关内容

热门资讯

【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
【前端】‘??‘与‘||‘有什... 0 问题 经常写const data = res.data.a ?? ''或者const d...
ChatGPT 怎么用最新详细... ChatGPT 以其强大的信息整合和对话能力惊艳了全球,在自然语言处理上面表现出了惊人...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...