代码拉取完成,页面将自动刷新
@EventListener注解是立即执行的,应该单独建一个java文件放@Async,在异步方法中写入事件。另外启动类上增加注解@EnableAsync,使异步生效。已测试,异步生效了
以下是部分代码(以登录为例)。
SysLoginService.java
public String login(String tenantId, String username, String password, String code, String uuid) {
boolean captchaEnabled = captchaProperties.getEnable();
// 验证码开关
if (captchaEnabled) {
validateCaptcha(tenantId, username, code, uuid);
}
// 校验租户
checkTenant(tenantId);
//未登录前临时设置租户id
LoginHelper.setTenantId(tenantId);
SysUserVo user = loadUserByUsername(tenantId, username);
user.setTenantId(tenantId);
checkLogin(LoginType.PASSWORD, tenantId, username, () -> !BCrypt.checkpw(password, user.getPassword()));
// 此处可根据登录用户的数据不同 自行创建 loginUser
LoginUser loginUser = buildLoginUser(user);
// 生成token
LoginHelper.loginByDevice(loginUser, DeviceType.PC);
HttpServletRequest request = ServletUtils.getRequest();
final UserAgent userAgent = UserAgentUtil.parse(request.getHeader("User-Agent"));
final String ip = IpUtils.getRealIP(request);
Logininfor logininfor = this.fillLogininfor(loginUser.getTenantId(), username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"), userAgent, ip);
asyncLoginInfoService.recordLoginInfo(logininfor);
System.out.println("-------------------------1111");
recordLoginInfo(user.getId());
return StpUtil.getTokenValue();
}
//填充信息
private Logininfor fillLogininfor(String tenantId, String username, String status,
String message, UserAgent userAgent, String ip){
Logininfor logininfor = new Logininfor();
logininfor.setTenantId(tenantId);
logininfor.setUsername(username);
logininfor.setStatus(status);
logininfor.setMessage(message);
// logininfor.setRequest(request);
logininfor.setIp(ip);
logininfor.setUserAgent(userAgent);
return logininfor;
}
异步方法:AsyncLoginInfoService.java
package cc.iotkit.system.async;
import cc.iotkit.common.log.event.LogininforEvent;
import cc.iotkit.common.log.model.Logininfor;
import cc.iotkit.common.utils.SpringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
@Slf4j
@Service
public class AsyncLoginInfoService {
/**
* 记录登录信息
*
*/
@Async
public void recordLoginInfo(Logininfor logininfor) {
LogininforEvent logininforE = new LogininforEvent(logininfor);
SpringUtils.context().publishEvent(logininforE);
}
}
SysLogininforServiceImpl.java
/**
* 记录登录信息
*
* @param logininforEvent 登录事件
*/
@EventListener(classes = {LogininforEvent.class})
public void recordLogininforListener(LogininforEvent logininforEvent) {
Logininfor logininfor1 = logininforEvent.getLogininfor();
final UserAgent userAgent = logininfor1.getUserAgent();
final String ip = logininfor1.getIp();
String address = AddressUtils.getRealAddressByIP(ip);
StringBuilder s = new StringBuilder();
s.append(getBlock(ip));
s.append(address);
s.append(getBlock(logininfor1.getUsername()));
s.append(getBlock(logininfor1.getStatus()));
s.append(getBlock(logininfor1.getMessage()));
// 打印信息到日志
log.info(s.toString(), logininfor1.getArgs());
// 获取客户端操作系统
String os = userAgent.getOs().getName();
// 获取客户端浏览器
String browser = userAgent.getBrowser().getName();
// 封装对象
SysLoginInfoBo logininfor = new SysLoginInfoBo();
logininfor.setTenantId(logininfor1.getTenantId());
logininfor.setUserName(logininfor1.getUsername());
logininfor.setIpaddr(ip);
logininfor.setLoginLocation(address);
logininfor.setBrowser(browser);
logininfor.setOs(os);
logininfor.setMsg(logininfor1.getMessage());
// 日志状态
if (StringUtils.equalsAny(logininfor1.getStatus(), Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER)) {
logininfor.setStatus(Constants.SUCCESS);
} else if (Constants.LOGIN_FAIL.equals(logininfor1.getStatus())) {
logininfor.setStatus(Constants.FAIL);
}
// 插入数据
insertLogininfor(logininfor);
}