登录日志
实体类:
public class LoginLog {
private Long id;
private String account;
private String loginIp;
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
private Date loginTime;
private String address;
private String lat;
private String lng;
}
登录日志有关的一些方法:
@Autowired
private LoginLogMapper<LoginLog, LoginLogQuery> loginLogMapper;
@Override
public void addLoginLog(LoginLog loginLog) {
loginLogMapper.insert(loginLog);
}
@Override
public List<LoginLog> findLoginLog() {
LoginLogQuery loginLogQuery = new LoginLogQuery();
return loginLogMapper.selectList(loginLogQuery);
}
@Override
public List<LoginLog> findLoginLogGroupByIp() {
LoginLogQuery loginLogQuery = new LoginLogQuery();
return loginLogMapper.selectListGroupByIp(loginLogQuery);
}
接口:
@Repository
public interface LoginLogMapper<T,Q> extends BaseMapper<T, Q> {
List<T> selectListGroupByIp(Q q);
}
系统日志:
方便调试,可以知道调用了哪一个类的什么方法,方便检查报错
实体类
public class SysLog {
private Long id;
private String account;
private String opContent;
private String clientIp;
private String address;
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
private Date createTime;
}
具体的方法调用:
获取用户IP,打印使用的方法以及传入的参数
@Around("cutController()")
public Object recordLog(ProceedingJoinPoint point) throws Throwable {
// 获取HttpServletRequest
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
executorService.execute(new Runnable() {
@Override
public void run() {
// 获取执行类名称
String strClassName = point.getTarget().getClass().getName();
// 获取执行方法名称
String strMethodName = point.getSignature().getName();
// 获取执行方法参数
Object[] params = point.getArgs();
StringBuffer bfParams = new StringBuffer();
Enumeration<String> paraNames;
if (params != null && params.length > 0) {
paraNames = request.getParameterNames();
String key;
String value;
while (paraNames.hasMoreElements()) {
key = paraNames.nextElement();
value = request.getParameter(key);
bfParams.append(key).append("=").append(value);
if (paraNames.hasMoreElements()) {
bfParams.append("&");
}
}
if (StringUtil.isEmpty(bfParams.toString())) {
// 获取查询字符串, 只对get请求有效
bfParams.append(request.getQueryString());
}
}
// 如果请求方法为登录
if (strMethodName.equals("logindo")) {
LoginLog loginLog = new LoginLog();
// 获取ip地址
String ip = IpUtil.getIpAddr(request);
loginLog.setLoginIp(ip);
loginLog.setLoginTime(new Date());
Point ipPoint = PointUtil.getPoint(ip);
if(ipPoint != null) {
Data data = ipPoint.getData();
if (data != null) {
// 纬度
loginLog.setLat(data.getLat());
// 城市
loginLog.setAddress(data.getCity());
// 经度
loginLog.setLng(data.getLnt());
}
}
// 截取用户名
loginLog.setAccount(bfParams.substring(8,bfParams.indexOf("&")));
loginLogService.addLoginLog(loginLog);
} else {
// 系统日志记录
SysLog sysLog = new SysLog();
String ip = request.getRemoteAddr();
String strMessage = String.format("[类名]:%s,[方法]:%s,[参数]:%s", strClassName, strMethodName,
bfParams.toString());
HttpSession session = request.getSession();
SessionUser sessionUser = null;
if(session != null) {
sessionUser = (SessionUser) session.getAttribute(userConfig.getSession_User_Key());
}
Point ipPoint = PointUtil.getPoint(ip);
if(ipPoint != null) {
Data data = ipPoint.getData();
if (data != null) {
sysLog.setAddress(data.getCity());
}
}
sysLog.setCreateTime(new Date());
sysLog.setClientIp(ip);
sysLog.setOpContent(strMessage);
if (sessionUser != null) {
String account = sessionUser.getUserName();
sysLog.setAccount(account);
}
sysLogService.addSysLog(sysLog);
}
try {
Thread.sleep(1*100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
//调用目标方法
return point.proceed();
}
}