如果文章对你有帮助欢迎【关注❤️❤️❤️点赞👍👍👍收藏⭐⭐⭐】一键三连!一起努力!
user-agent-utils 是一个用来解析 User-Agent 字符串的 Java 类库。
其能够识别的内容包括:
在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.bitwalker UserAgentUtils 1.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
感谢各位家人的观看喜欢的话点帮忙点赞👍👍👍哦