fix 修复 主线程先虚拟线程关闭导致无法获取request问题

This commit is contained in:
疯狂的狮子Li
2026-07-31 12:03:25 +08:00
parent 41ea764a8c
commit c76212003c
4 changed files with 30 additions and 12 deletions
@@ -7,6 +7,7 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Opt; import cn.hutool.core.lang.Opt;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.baomidou.lock.annotation.Lock4j; import com.baomidou.lock.annotation.Lock4j;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import me.zhyd.oauth.model.AuthUser; import me.zhyd.oauth.model.AuthUser;
@@ -136,7 +137,12 @@ public class SysLoginService {
loginInfoEvent.setUsername(username); loginInfoEvent.setUsername(username);
loginInfoEvent.setStatus(status); loginInfoEvent.setStatus(status);
loginInfoEvent.setMessage(message); loginInfoEvent.setMessage(message);
loginInfoEvent.setRequest(ServletUtils.getRequest()); HttpServletRequest request = ServletUtils.getRequest();
if (request != null) {
loginInfoEvent.setIp(ServletUtils.getClientIP(request));
loginInfoEvent.setUserAgent(request.getHeader("User-Agent"));
loginInfoEvent.setClientId(request.getHeader(LoginHelper.CLIENT_KEY));
}
SpringUtils.context().publishEvent(loginInfoEvent); SpringUtils.context().publishEvent(loginInfoEvent);
} }
@@ -1,6 +1,7 @@
package org.dromara.web.service; package org.dromara.web.service;
import cn.hutool.crypto.digest.BCrypt; import cn.hutool.crypto.digest.BCrypt;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.dromara.common.core.constant.Constants; import org.dromara.common.core.constant.Constants;
import org.dromara.common.core.constant.GlobalConstants; import org.dromara.common.core.constant.GlobalConstants;
@@ -14,6 +15,7 @@ import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.log.event.LoginInfoEvent; import org.dromara.common.log.event.LoginInfoEvent;
import org.dromara.common.redis.utils.RedisUtils; import org.dromara.common.redis.utils.RedisUtils;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.web.config.properties.CaptchaProperties; import org.dromara.common.web.config.properties.CaptchaProperties;
import org.dromara.system.api.model.RegisterBody; import org.dromara.system.api.model.RegisterBody;
import org.dromara.system.domain.SysUser; import org.dromara.system.domain.SysUser;
@@ -103,7 +105,12 @@ public class SysRegisterService {
loginInfoEvent.setUsername(username); loginInfoEvent.setUsername(username);
loginInfoEvent.setStatus(status); loginInfoEvent.setStatus(status);
loginInfoEvent.setMessage(message); loginInfoEvent.setMessage(message);
loginInfoEvent.setRequest(ServletUtils.getRequest()); HttpServletRequest request = ServletUtils.getRequest();
if (request != null) {
loginInfoEvent.setIp(ServletUtils.getClientIP(request));
loginInfoEvent.setUserAgent(request.getHeader("User-Agent"));
loginInfoEvent.setClientId(request.getHeader(LoginHelper.CLIENT_KEY));
}
SpringUtils.context().publishEvent(loginInfoEvent); SpringUtils.context().publishEvent(loginInfoEvent);
} }
@@ -1,6 +1,5 @@
package org.dromara.common.log.event; package org.dromara.common.log.event;
import jakarta.servlet.http.HttpServletRequest;
import lombok.Data; import lombok.Data;
import java.io.Serial; import java.io.Serial;
@@ -34,9 +33,19 @@ public class LoginInfoEvent implements Serializable {
private String message; private String message;
/** /**
* 请求体 * 客户端IP
*/ */
private HttpServletRequest request; private String ip;
/**
* 用户代理
*/
private String userAgent;
/**
* 客户端标识
*/
private String clientId;
/** /**
* 其他参数 * 其他参数
@@ -4,19 +4,16 @@ import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.useragent.UserAgent; import cn.hutool.http.useragent.UserAgent;
import cn.hutool.http.useragent.UserAgentUtil; import cn.hutool.http.useragent.UserAgentUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.constant.Constants; import org.dromara.common.core.constant.Constants;
import org.dromara.common.core.domain.PageResult; import org.dromara.common.core.domain.PageResult;
import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.ServletUtils;
import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.core.utils.ip.AddressUtils; import org.dromara.common.core.utils.ip.AddressUtils;
import org.dromara.common.log.event.LoginInfoEvent; import org.dromara.common.log.event.LoginInfoEvent;
import org.dromara.common.mybatis.core.mapper.LambdaCrudChainWrapper; import org.dromara.common.mybatis.core.mapper.LambdaCrudChainWrapper;
import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.system.domain.SysLoginInfo; import org.dromara.system.domain.SysLoginInfo;
import org.dromara.system.domain.bo.SysLoginInfoBo; import org.dromara.system.domain.bo.SysLoginInfoBo;
import org.dromara.system.domain.vo.SysClientVo; import org.dromara.system.domain.vo.SysClientVo;
@@ -55,11 +52,10 @@ public class SysLoginInfoServiceImpl implements ISysLoginInfoService {
@Async @Async
@EventListener @EventListener
public void recordLoginInfo(LoginInfoEvent loginInfoEvent) { public void recordLoginInfo(LoginInfoEvent loginInfoEvent) {
HttpServletRequest request = loginInfoEvent.getRequest(); UserAgent userAgent = UserAgentUtil.parse(loginInfoEvent.getUserAgent());
UserAgent userAgent = UserAgentUtil.parse(request.getHeader("User-Agent")); String ip = loginInfoEvent.getIp();
String ip = ServletUtils.getClientIP(request);
// 客户端信息 // 客户端信息
String clientId = request.getHeader(LoginHelper.CLIENT_KEY); String clientId = loginInfoEvent.getClientId();
SysClientVo client = null; SysClientVo client = null;
if (StringUtils.isNotBlank(clientId)) { if (StringUtils.isNotBlank(clientId)) {
client = clientService.queryByClientId(clientId); client = clientService.queryByClientId(clientId);