ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-framework/src/main/java/com/ruoyi/framework/config/AsyncConfig.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-framework/src/main/java/com/ruoyi/framework/manager/AsyncManager.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-framework/src/main/java/com/ruoyi/framework/manager/ShutdownManager.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-framework/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/AsyncService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
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) { 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); } /** ruoyi-framework/src/main/java/com/ruoyi/framework/manager/AsyncManager.java
ÎļþÒÑɾ³ý 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); } } } ruoyi-framework/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java
ÎļþÒÑɾ³ý 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, "éåºæå"))); } } 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() + "]"; } } 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);