数据库表结构:
CREATE TABLE `sys_login_log` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '访问ID',
`username` varchar(50) DEFAULT '' COMMENT '用户账号',
`ipaddr` varchar(128) DEFAULT '' COMMENT '登录IP地址',
`status` tinyint(1) DEFAULT '0' COMMENT '登录状态(0成功 1失败)',
`msg` varchar(255) DEFAULT '' COMMENT '提示信息',
`access_time` datetime DEFAULT NULL COMMENT '访问时间',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
`is_deleted` tinyint NOT NULL DEFAULT '0' COMMENT '删除标记(0:可用 1:已删除)',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1632762939813396576 DEFAULT CHARSET=utf8mb3 COMMENT='系统访问记录';
SysLoginLogQueryVo.java
package com.chen.entity.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class SysLoginLogQueryVo {
@ApiModelProperty(value = "用户账号")
private String username;
private String createTimeBegin;
private String createTimeEnd;
}
SysLoginLog.java
package com.chen.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
@Data
@ApiModel(description = "SysLoginLog")
@TableName("sys_login_log")
public class SysLoginLog implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "用户账号")
@TableField("username")
private String username;
@ApiModelProperty(value = "登录IP地址")
@TableField("ipaddr")
private String ipaddr;
@ApiModelProperty(value = "登录状态(0成功 1失败)")
@TableField("status")
private Integer status;
@ApiModelProperty(value = "提示信息")
@TableField("msg")
private String msg;
@ApiModelProperty(value = "访问时间")
@TableField("access_time")
private Date accessTime;
@ApiModelProperty(value = "创建时间")
@TableField("create_time")
private Date createTime;
}
LoginLogService.java
package com.chen.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.chen.entity.SysLoginLog;
import com.chen.entity.dto.SysLoginLogQueryVo;
public interface LoginLogService extends IService<SysLoginLog> {
//登录日志
public void recordLoginLog(String username,Integer status,
String ipaddr,String message);
//条件分页查询登录日志
IPage<SysLoginLog> selectPage(long page, long limit, SysLoginLogQueryVo sysLoginLogQueryVo);
}
LoginLogServiceImpl.java
package com.chen.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.chen.entity.SysLoginLog;
import com.chen.entity.dto.SysLoginLogQueryVo;
import com.chen.mapper.LoginLogMapper;
import com.chen.service.LoginLogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
@Service
public class LoginLogServiceImpl extends ServiceImpl<LoginLogMapper,SysLoginLog> implements LoginLogService {
@Autowired
private LoginLogMapper loginLogMapper;
@Override
public void recordLoginLog(String username, Integer status,
String ipaddr, String message) {
SysLoginLog sysLoginLog = new SysLoginLog();
sysLoginLog.setUsername(username);
sysLoginLog.setStatus(status);
sysLoginLog.setIpaddr(ipaddr);
sysLoginLog.setMsg(message);
loginLogMapper.insert(sysLoginLog);
}
//条件分页查询登录日志
@Override
public IPage<SysLoginLog> selectPage(long page, long limit, SysLoginLogQueryVo sysLoginLogQueryVo) {
//创建page对象
Page<SysLoginLog> pageParam = new Page(page,limit);
//获取条件值
String username = sysLoginLogQueryVo.getUsername();
String createTimeBegin = sysLoginLogQueryVo.getCreateTimeBegin();
String createTimeEnd = sysLoginLogQueryVo.getCreateTimeEnd();
//封装条件
QueryWrapper<SysLoginLog> wrapper = new QueryWrapper<>();
if(!StringUtils.isEmpty(username)) {
wrapper.like("username",username);
}
if(!StringUtils.isEmpty(createTimeBegin)) {
wrapper.ge("create_time",createTimeBegin);
}
if(!StringUtils.isEmpty(createTimeBegin)) {
wrapper.le("create_time",createTimeEnd);
}
//调用mapper方法
IPage<SysLoginLog> pageModel = loginLogMapper.selectPage(pageParam, wrapper);
return pageModel;
}
}
IpUtil.java
package com.chen.utils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.server.reactive.ServerHttpRequest;
import javax.servlet.http.HttpServletRequest;
import java.net.InetAddress;
import java.net.UnknownHostException;
/**
* <p>
* 获取ip地址
* </p>
* @author Y·C
* @since 2023-03-07
*/
public class IpUtil {
public static String getIpAddress(HttpServletRequest request) {
String ipAddress = null;
try {
ipAddress = request.getHeader("x-forwarded-for");
if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader("Proxy-Client-IP");
}
if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader("WL-Proxy-Client-IP");
}
if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getRemoteAddr();
if (ipAddress.equals("127.0.0.1")) {
// 根据网卡取本机配置的IP
InetAddress inet = null;
try {
inet = InetAddress.getLocalHost();
} catch (UnknownHostException e) {
e.printStackTrace();
}
ipAddress = inet.getHostAddress();
}
}
// 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
if (ipAddress != null && ipAddress.length() > 15) { // "***.***.***.***".length()
// = 15
if (ipAddress.indexOf(",") > 0) {
ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));
}
}
} catch (Exception e) {
ipAddress="";
}
// ipAddress = this.getRequest().getRemoteAddr();
return ipAddress;
}
public static String getGatwayIpAddress(ServerHttpRequest request) {
HttpHeaders headers = request.getHeaders();
String ip = headers.getFirst("x-forwarded-for");
if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {
// 多次反向代理后会有多个ip值,第一个ip才是真实ip
if (ip.indexOf(",") != -1) {
ip = ip.split(",")[0];
}
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = headers.getFirst("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = headers.getFirst("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = headers.getFirst("HTTP_CLIENT_IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = headers.getFirst("HTTP_X_FORWARDED_FOR");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = headers.getFirst("X-Real-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddress().getAddress().getHostAddress();
}
return ip;
}
}