From 8349e631d2cbef27d2f0c841a37ce499e69ecaff Mon Sep 17 00:00:00 2001
From: 疯狂的狮子li <15040126243@163.com>
Date: 星期六, 12 六月 2021 20:14:50 +0800
Subject: [PATCH] update 优化 异步工厂重写 使用 spring 异步处理

---
 ruoyi-framework/src/main/java/com/ruoyi/framework/manager/ShutdownManager.java                  |   54 ++++----
 ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/AsyncService.java                 |   96 ++++++++++++++++
 /dev/null                                                                                       |  111 ------------------
 ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java              |   20 +-
 ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java |   53 ++++----
 ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java                        |    8 
 ruoyi-framework/src/main/java/com/ruoyi/framework/config/AsyncConfig.java                       |   11 +
 7 files changed, 172 insertions(+), 181 deletions(-)

diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java
index 442d258..280a60c 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java
@@ -8,10 +8,8 @@
 import com.ruoyi.common.enums.BusinessStatus;
 import com.ruoyi.common.enums.HttpMethod;
 import com.ruoyi.common.utils.ServletUtils;
-import com.ruoyi.common.utils.ip.IpUtils;
 import com.ruoyi.common.utils.spring.SpringUtils;
-import com.ruoyi.framework.manager.AsyncManager;
-import com.ruoyi.framework.manager.factory.AsyncFactory;
+import com.ruoyi.framework.web.service.AsyncService;
 import com.ruoyi.framework.web.service.TokenService;
 import com.ruoyi.system.domain.SysOperLog;
 import org.aspectj.lang.JoinPoint;
@@ -93,7 +91,7 @@
             SysOperLog operLog = new SysOperLog();
             operLog.setStatus(BusinessStatus.SUCCESS.ordinal());
             // 璇锋眰鐨勫湴鍧�
-            String ip = IpUtils.getIpAddr(ServletUtils.getRequest());
+            String ip = ServletUtils.getClientIP();
             operLog.setOperIp(ip);
             // 杩斿洖鍙傛暟
             operLog.setJsonResult(JSON.toJSONString(jsonResult));
@@ -118,7 +116,7 @@
             // 澶勭悊璁剧疆娉ㄨВ涓婄殑鍙傛暟
             getControllerMethodDescription(joinPoint, controllerLog, operLog);
             // 淇濆瓨鏁版嵁搴�
-            AsyncManager.me().execute(AsyncFactory.recordOper(operLog));
+			SpringUtils.getBean(AsyncService.class).recordOper(operLog);
         }
         catch (Exception exp)
         {
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/AsyncConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/AsyncConfig.java
index 5c11ae6..2eb4eb3 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/AsyncConfig.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/AsyncConfig.java
@@ -2,6 +2,8 @@
 
 import com.ruoyi.common.exception.CustomException;
 import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.scheduling.annotation.AsyncConfigurerSupport;
 import org.springframework.scheduling.annotation.EnableAsync;
@@ -9,7 +11,7 @@
 
 import java.util.Arrays;
 import java.util.concurrent.Executor;
-import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
 
 /**
  * 寮傛閰嶇疆
@@ -20,13 +22,16 @@
 @Configuration
 public class AsyncConfig extends AsyncConfigurerSupport {
 
+	@Autowired
+	@Qualifier("scheduledExecutorService")
+	private ScheduledExecutorService scheduledExecutorService;
+
     /**
      * 寮傛鎵ц闇�瑕佷娇鐢ㄦ潈闄愭鏋惰嚜甯︾殑鍖呰绾跨▼姹�  淇濊瘉鏉冮檺淇℃伅鐨勪紶閫�
      */
     @Override
     public Executor getAsyncExecutor() {
-        return new DelegatingSecurityContextExecutorService(
-        	Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()));
+        return new DelegatingSecurityContextExecutorService(scheduledExecutorService);
     }
 
     /**
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/AsyncManager.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/AsyncManager.java
deleted file mode 100644
index 7387a02..0000000
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/AsyncManager.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package com.ruoyi.framework.manager;
-
-import java.util.TimerTask;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-import com.ruoyi.common.utils.Threads;
-import com.ruoyi.common.utils.spring.SpringUtils;
-
-/**
- * 寮傛浠诲姟绠$悊鍣�
- * 
- * @author ruoyi
- */
-public class AsyncManager
-{
-    /**
-     * 鎿嶄綔寤惰繜10姣
-     */
-    private 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()
-    {
-        Threads.shutdownAndAwaitTermination(executor);
-    }
-}
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/ShutdownManager.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/ShutdownManager.java
index e36ca3c..4ed5366 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/ShutdownManager.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/ShutdownManager.java
@@ -1,39 +1,41 @@
 package com.ruoyi.framework.manager;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import com.ruoyi.common.utils.Threads;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Component;
+
 import javax.annotation.PreDestroy;
+import java.util.concurrent.ScheduledExecutorService;
 
 /**
  * 纭繚搴旂敤閫�鍑烘椂鑳藉叧闂悗鍙扮嚎绋�
  *
- * @author ruoyi
+ * @author Lion Li
  */
+@Slf4j(topic = "sys-user")
 @Component
-public class ShutdownManager
-{
-    private static final Logger logger = LoggerFactory.getLogger("sys-user");
+public class ShutdownManager {
 
-    @PreDestroy
-    public void destroy()
-    {
-        shutdownAsyncManager();
-    }
+	@Autowired
+	@Qualifier("scheduledExecutorService")
+	private ScheduledExecutorService scheduledExecutorService;
 
-    /**
-     * 鍋滄寮傛鎵ц浠诲姟
-     */
-    private void shutdownAsyncManager()
-    {
-        try
-        {
-            logger.info("====鍏抽棴鍚庡彴浠诲姟浠诲姟绾跨▼姹�====");
-            AsyncManager.me().shutdown();
-        }
-        catch (Exception e)
-        {
-            logger.error(e.getMessage(), e);
-        }
-    }
+	@PreDestroy
+	public void destroy() {
+		shutdownAsyncManager();
+	}
+
+	/**
+	 * 鍋滄寮傛鎵ц浠诲姟
+	 */
+	private void shutdownAsyncManager() {
+		try {
+			log.info("====鍏抽棴鍚庡彴浠诲姟浠诲姟绾跨▼姹�====");
+			Threads.shutdownAndAwaitTermination(scheduledExecutorService);
+		} catch (Exception e) {
+			log.error(e.getMessage(), e);
+		}
+	}
 }
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java
deleted file mode 100644
index d0147a2..0000000
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java
+++ /dev/null
@@ -1,111 +0,0 @@
-package com.ruoyi.framework.manager.factory;
-
-import cn.hutool.http.useragent.UserAgent;
-import cn.hutool.http.useragent.UserAgentUtil;
-import com.ruoyi.common.constant.Constants;
-import com.ruoyi.common.utils.ServletUtils;
-import com.ruoyi.common.utils.ip.AddressUtils;
-import com.ruoyi.common.utils.ip.IpUtils;
-import com.ruoyi.common.utils.spring.SpringUtils;
-import com.ruoyi.system.domain.SysLogininfor;
-import com.ruoyi.system.domain.SysOperLog;
-import com.ruoyi.system.service.ISysLogininforService;
-import com.ruoyi.system.service.ISysOperLogService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.TimerTask;
-
-/**
- * 寮傛宸ュ巶锛堜骇鐢熶换鍔$敤锛�
- * 
- * @author ruoyi
- */
-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 recordLogininfor(final String username, final String status, final String message,
-            final Object... args)
-    {
-        final UserAgent userAgent = UserAgentUtil.parse(ServletUtils.getRequest().getHeader("User-Agent"));
-        final String ip = IpUtils.getIpAddr(ServletUtils.getRequest());
-        return new TimerTask()
-        {
-            @Override
-            public void run()
-            {
-                String address = AddressUtils.getRealAddressByIP(ip);
-                StringBuilder s = new StringBuilder();
-                s.append(getBlock(ip));
-                s.append(address);
-                s.append(getBlock(username));
-                s.append(getBlock(status));
-                s.append(getBlock(message));
-                // 鎵撳嵃淇℃伅鍒版棩蹇�
-                sys_user_logger.info(s.toString(), args);
-                // 鑾峰彇瀹㈡埛绔搷浣滅郴缁�
-                String os = userAgent.getOs().getName();
-                // 鑾峰彇瀹㈡埛绔祻瑙堝櫒
-                String browser = userAgent.getBrowser().getName();
-                // 灏佽瀵硅薄
-                SysLogininfor logininfor = new SysLogininfor();
-                logininfor.setUserName(username);
-                logininfor.setIpaddr(ip);
-                logininfor.setLoginLocation(address);
-                logininfor.setBrowser(browser);
-                logininfor.setOs(os);
-                logininfor.setMsg(message);
-                // 鏃ュ織鐘舵��
-                if (Constants.LOGIN_SUCCESS.equals(status) || Constants.LOGOUT.equals(status))
-                {
-                    logininfor.setStatus(Constants.SUCCESS);
-                }
-                else if (Constants.LOGIN_FAIL.equals(status))
-                {
-                    logininfor.setStatus(Constants.FAIL);
-                }
-                // 鎻掑叆鏁版嵁
-                SpringUtils.getBean(ISysLogininforService.class).insertLogininfor(logininfor);
-            }
-        };
-    }
-
-    /**
-     * 鎿嶄綔鏃ュ織璁板綍
-     * 
-     * @param operLog 鎿嶄綔鏃ュ織淇℃伅
-     * @return 浠诲姟task
-     */
-    public static TimerTask recordOper(final SysOperLog operLog)
-    {
-        return new TimerTask()
-        {
-            @Override
-            public void run()
-            {
-                // 杩滅▼鏌ヨ鎿嶄綔鍦扮偣
-                operLog.setOperLocation(AddressUtils.getRealAddressByIP(operLog.getOperIp()));
-                SpringUtils.getBean(ISysOperLogService.class).insertOperlog(operLog);
-            }
-        };
-    }
-
-    public static String getBlock(Object msg)
-    {
-        if (msg == null)
-        {
-            msg = "";
-        }
-        return "[" + msg.toString() + "]";
-    }
-}
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java
index e79f468..3ce2447 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java
@@ -7,8 +7,7 @@
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.core.domain.model.LoginUser;
 import com.ruoyi.common.utils.ServletUtils;
-import com.ruoyi.framework.manager.AsyncManager;
-import com.ruoyi.framework.manager.factory.AsyncFactory;
+import com.ruoyi.framework.web.service.AsyncService;
 import com.ruoyi.framework.web.service.TokenService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Configuration;
@@ -22,33 +21,33 @@
 
 /**
  * 鑷畾涔夐��鍑哄鐞嗙被 杩斿洖鎴愬姛
- * 
+ *
  * @author ruoyi
  */
 @Configuration
-public class LogoutSuccessHandlerImpl implements LogoutSuccessHandler
-{
-    @Autowired
-    private TokenService tokenService;
+public class LogoutSuccessHandlerImpl implements LogoutSuccessHandler {
 
-    /**
-     * 閫�鍑哄鐞�
-     * 
-     * @return
-     */
-    @Override
-    public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication)
-            throws IOException, ServletException
-    {
-        LoginUser loginUser = tokenService.getLoginUser(request);
-        if (Validator.isNotNull(loginUser))
-        {
-            String userName = loginUser.getUsername();
-            // 鍒犻櫎鐢ㄦ埛缂撳瓨璁板綍
-            tokenService.delLoginUser(loginUser.getToken());
-            // 璁板綍鐢ㄦ埛閫�鍑烘棩蹇�
-            AsyncManager.me().execute(AsyncFactory.recordLogininfor(userName, Constants.LOGOUT, "閫�鍑烘垚鍔�"));
-        }
-        ServletUtils.renderString(response, JSON.toJSONString(AjaxResult.error(HttpStatus.HTTP_OK, "閫�鍑烘垚鍔�")));
-    }
+	@Autowired
+	private TokenService tokenService;
+
+	@Autowired
+	private AsyncService asyncService;
+
+	/**
+	 * 閫�鍑哄鐞�
+	 */
+	@Override
+	public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication)
+		throws IOException, ServletException {
+		LoginUser loginUser = tokenService.getLoginUser(request);
+		if (Validator.isNotNull(loginUser)) {
+			String userName = loginUser.getUsername();
+			// 鍒犻櫎鐢ㄦ埛缂撳瓨璁板綍
+			tokenService.delLoginUser(loginUser.getToken());
+			// 璁板綍鐢ㄦ埛閫�鍑烘棩蹇�
+			asyncService.recordLogininfor(userName, Constants.LOGOUT, "閫�鍑烘垚鍔�", request);
+		}
+		ServletUtils.renderString(response, JSON.toJSONString(AjaxResult.error(HttpStatus.HTTP_OK, "閫�鍑烘垚鍔�")));
+	}
+
 }
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/AsyncService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/AsyncService.java
new file mode 100644
index 0000000..e64fbc1
--- /dev/null
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/AsyncService.java
@@ -0,0 +1,96 @@
+package com.ruoyi.framework.web.service;
+
+import cn.hutool.http.useragent.UserAgent;
+import cn.hutool.http.useragent.UserAgentUtil;
+import com.ruoyi.common.constant.Constants;
+import com.ruoyi.common.utils.ServletUtils;
+import com.ruoyi.common.utils.ip.AddressUtils;
+import com.ruoyi.system.domain.SysLogininfor;
+import com.ruoyi.system.domain.SysOperLog;
+import com.ruoyi.system.service.ISysLogininforService;
+import com.ruoyi.system.service.ISysOperLogService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * 寮傛宸ュ巶锛堜骇鐢熶换鍔$敤锛�
+ *
+ * @author Lion Li
+ */
+@Slf4j(topic = "sys-user")
+@Async
+@Component
+public class AsyncService {
+
+	@Autowired
+	private ISysLogininforService iSysLogininforService;
+
+	@Autowired
+	private ISysOperLogService iSysOperLogService;
+
+	/**
+	 * 璁板綍鐧诲綍淇℃伅
+	 *
+	 * @param username 鐢ㄦ埛鍚�
+	 * @param status   鐘舵��
+	 * @param message  娑堟伅
+	 * @param args     鍒楄〃
+	 */
+	public void recordLogininfor(final String username, final String status, final String message,
+								 HttpServletRequest request, final Object... args) {
+		final UserAgent userAgent = UserAgentUtil.parse(request.getHeader("User-Agent"));
+		final String ip = ServletUtils.getClientIP(request);
+
+		String address = AddressUtils.getRealAddressByIP(ip);
+		StringBuilder s = new StringBuilder();
+		s.append(getBlock(ip));
+		s.append(address);
+		s.append(getBlock(username));
+		s.append(getBlock(status));
+		s.append(getBlock(message));
+		// 鎵撳嵃淇℃伅鍒版棩蹇�
+		log.info(s.toString(), args);
+		// 鑾峰彇瀹㈡埛绔搷浣滅郴缁�
+		String os = userAgent.getOs().getName();
+		// 鑾峰彇瀹㈡埛绔祻瑙堝櫒
+		String browser = userAgent.getBrowser().getName();
+		// 灏佽瀵硅薄
+		SysLogininfor logininfor = new SysLogininfor();
+		logininfor.setUserName(username);
+		logininfor.setIpaddr(ip);
+		logininfor.setLoginLocation(address);
+		logininfor.setBrowser(browser);
+		logininfor.setOs(os);
+		logininfor.setMsg(message);
+		// 鏃ュ織鐘舵��
+		if (Constants.LOGIN_SUCCESS.equals(status) || Constants.LOGOUT.equals(status)) {
+			logininfor.setStatus(Constants.SUCCESS);
+		} else if (Constants.LOGIN_FAIL.equals(status)) {
+			logininfor.setStatus(Constants.FAIL);
+		}
+		// 鎻掑叆鏁版嵁
+		iSysLogininforService.insertLogininfor(logininfor);
+	}
+
+	/**
+	 * 鎿嶄綔鏃ュ織璁板綍
+	 *
+	 * @param operLog 鎿嶄綔鏃ュ織淇℃伅
+	 */
+	public void recordOper(final SysOperLog operLog) {
+		// 杩滅▼鏌ヨ鎿嶄綔鍦扮偣
+		operLog.setOperLocation(AddressUtils.getRealAddressByIP(operLog.getOperIp()));
+		iSysOperLogService.insertOperlog(operLog);
+	}
+
+	private String getBlock(Object msg) {
+		if (msg == null) {
+			msg = "";
+		}
+		return "[" + msg.toString() + "]";
+	}
+}
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
index bc22ca0..d0b9511 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
@@ -11,10 +11,7 @@
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.MessageUtils;
 import com.ruoyi.common.utils.ServletUtils;
-import com.ruoyi.common.utils.ip.IpUtils;
 import com.ruoyi.framework.config.properties.CaptchaProperties;
-import com.ruoyi.framework.manager.AsyncManager;
-import com.ruoyi.framework.manager.factory.AsyncFactory;
 import com.ruoyi.system.service.ISysUserService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.authentication.AuthenticationManager;
@@ -24,6 +21,7 @@
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
 
 /**
  * 鐧诲綍鏍¢獙鏂规硶
@@ -48,6 +46,9 @@
 	@Autowired
     private ISysUserService userService;
 
+	@Autowired
+	private AsyncService asyncService;
+
     /**
      * 鐧诲綍楠岃瘉
      *
@@ -59,16 +60,17 @@
      */
     public String login(String username, String password, String code, String uuid)
     {
+		HttpServletRequest request = ServletUtils.getRequest();
 		if(captchaProperties.getEnabled()) {
 			String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid;
 			String captcha = redisCache.getCacheObject(verifyKey);
 			redisCache.deleteObject(verifyKey);
 			if (captcha == null) {
-				AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")));
+				asyncService.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"), request);
 				throw new CaptchaExpireException();
 			}
 			if (!code.equalsIgnoreCase(captcha)) {
-				AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error")));
+				asyncService.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"), request);
 				throw new CaptchaException();
 			}
 		}
@@ -84,16 +86,16 @@
         {
             if (e instanceof BadCredentialsException)
             {
-                AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
+				asyncService.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match"), request);
                 throw new UserPasswordNotMatchException();
             }
             else
             {
-                AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage()));
+				asyncService.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage(), request);
                 throw new CustomException(e.getMessage());
             }
         }
-        AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
+		asyncService.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"), request);
         LoginUser loginUser = (LoginUser) authentication.getPrincipal();
         recordLoginInfo(loginUser.getUser());
         // 鐢熸垚token
@@ -105,7 +107,7 @@
      */
     public void recordLoginInfo(SysUser user)
     {
-        user.setLoginIp(IpUtils.getIpAddr(ServletUtils.getRequest()));
+        user.setLoginIp(ServletUtils.getClientIP());
         user.setLoginDate(DateUtils.getNowDate());
 		user.setUpdateBy(user.getUserName());
         userService.updateUserProfile(user);

--
Gitblit v1.9.3