zhibing.pu
2024-08-12 34d18c08f04de78eccb42b88b7484b0531d263ff
ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysRecordLogService.java
@@ -1,48 +1,134 @@
package com.ruoyi.auth.service;
import org.springframework.beans.factory.annotation.Autowired;
import com.ruoyi.system.api.feignClient.SysLoginLogClient;
import com.ruoyi.system.domain.SysLoginLog;
import org.springframework.stereotype.Component;
import com.ruoyi.common.core.constant.Constants;
import com.ruoyi.common.core.constant.SecurityConstants;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.core.utils.ip.IpUtils;
import com.ruoyi.system.api.RemoteLogService;
import com.ruoyi.system.api.domain.SysLogininfor;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;
/**
 * 记录日志方法
 *
 *
 * @author ruoyi
 */
@Component
public class SysRecordLogService
{
    @Autowired
    private RemoteLogService remoteLogService;
    /**
     * 记录登录信息
     *
     * @param username 用户名
     * @param status 状态
     * @param message 消息内容
     * @return
     */
    public void recordLogininfor(String username, String status, String message)
    {
        SysLogininfor logininfor = new SysLogininfor();
        logininfor.setUserName(username);
        logininfor.setIpaddr(IpUtils.getIpAddr());
        logininfor.setMsg(message);
        // 日志状态
        if (StringUtils.equalsAny(status, Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER))
        {
            logininfor.setStatus(Constants.LOGIN_SUCCESS_STATUS);
        }
        else if (Constants.LOGIN_FAIL.equals(status))
        {
            logininfor.setStatus(Constants.LOGIN_FAIL_STATUS);
        }
        remoteLogService.saveLogininfor(logininfor, SecurityConstants.INNER);
    }
public class SysRecordLogService {
   @Resource
   private SysLoginLogClient sysLoginLogClient;
   /**
    * 记录登录信息
    *
    * @param username 用户名
    * @param status   状态
    * @param message  消息内容
    * @return
    */
   public void recordLogininfor(HttpServletRequest request, Integer userId, String username, String status, String message) {
      Map<String, String> headerData = getHeaderData(request);
      //添加登录日志
      SysLoginLog loginLog = new SysLoginLog();
      loginLog.setUserId(userId);
      loginLog.setUsername(username);
      loginLog.setIpAddress(headerData.get("ip"));
      loginLog.setAddress("");// todo 待完善  https://www.juhe.cn/docs/api/id/1
      loginLog.setBrowserType(headerData.get("browser"));
      loginLog.setOperatingSystem(headerData.get("os"));
      loginLog.setLoginTime(LocalDateTime.now());
      loginLog.setLoginStatus(Integer.valueOf(status));
      loginLog.setMessage(message);
      sysLoginLogClient.saveLoginLog(loginLog);
   }
   public Map<String, String> getHeaderData(HttpServletRequest request) {
      //Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0
      String browserDetails = request.getHeader("User-Agent");
      String userAgent = browserDetails;
      String user = userAgent.toLowerCase();
      Map<String, String> map = new HashMap<>();
      String os = "";
      String browser = "";
      if (userAgent.toLowerCase().indexOf("windows") >= 0) {
         os = "Windows";
      } else if (userAgent.toLowerCase().indexOf("mac") >= 0) {
         os = "Mac";
      } else if (userAgent.toLowerCase().indexOf("x11") >= 0) {
         os = "Unix";
      } else if (userAgent.toLowerCase().indexOf("android") >= 0) {
         os = "Android";
      } else if (userAgent.toLowerCase().indexOf("iphone") >= 0) {
         os = "IPhone";
      } else {
         os = "UnKnown, More-Info: " + userAgent;
      }
      if (user.contains("edge")) {
         browser = (userAgent.substring(userAgent.indexOf("Edge")).split(" ")[0]).replace("/", "-");
      } else if (user.contains("msie")) {
         String substring = userAgent.substring(userAgent.indexOf("MSIE")).split(";")[0];
         browser = substring.split(" ")[0].replace("MSIE", "IE") + "-" + substring.split(" ")[1];
      } else if (user.contains("safari") && user.contains("version")) {
         browser = (userAgent.substring(userAgent.indexOf("Safari")).split(" ")[0]).split("/")[0]
               + "-" + (userAgent.substring(userAgent.indexOf("Version")).split(" ")[0]).split("/")[1];
      } else if (user.contains("opr") || user.contains("opera")) {
         if (user.contains("opera")) {
            browser = (userAgent.substring(userAgent.indexOf("Opera")).split(" ")[0]).split("/")[0]
                  + "-" + (userAgent.substring(userAgent.indexOf("Version")).split(" ")[0]).split("/")[1];
         } else if (user.contains("opr")) {
            browser = ((userAgent.substring(userAgent.indexOf("OPR")).split(" ")[0]).replace("/", "-"))
                  .replace("OPR", "Opera");
         }
      } else if (user.contains("chrome")) {
         browser = (userAgent.substring(userAgent.indexOf("Chrome")).split(" ")[0]).replace("/", "-");
      } else if ((user.indexOf("mozilla/7.0") > -1) || (user.indexOf("netscape6") != -1) ||
            (user.indexOf("mozilla/4.7") != -1) || (user.indexOf("mozilla/4.78") != -1) ||
            (user.indexOf("mozilla/4.08") != -1) || (user.indexOf("mozilla/3") != -1)) {
         browser = "Netscape-?";
      } else if (user.contains("firefox")) {
         browser = (userAgent.substring(userAgent.indexOf("Firefox")).split(" ")[0]).replace("/", "-");
      } else if (user.contains("rv")) {
         String IEVersion = (userAgent.substring(userAgent.indexOf("rv")).split(" ")[0]).replace("rv:", "-");
         browser = "IE" + IEVersion.substring(0, IEVersion.length() - 1);
      } else {
         browser = "UnKnown, More-Info: " + userAgent;
      }
      String ip = request.getHeader("x-forwarded-for");
      if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {
         // 多次反向代理后会有多个ip值,第一个ip才是真实ip
         if (ip.indexOf(",") != -1) {
            ip = ip.split(",")[0];
         }
      }
      if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
         ip = request.getHeader("Proxy-Client-IP");
      }
      if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
         ip = request.getHeader("WL-Proxy-Client-IP");
      }
      if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
         ip = request.getHeader("HTTP_CLIENT_IP");
      }
      if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
         ip = request.getHeader("HTTP_X_FORWARDED_FOR");
      }
      if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
         ip = request.getHeader("X-Real-IP");
      }
      if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
         ip = request.getRemoteAddr();
      }
      map.put("os", os);
      map.put("browser", browser);
      map.put("ip", ip);
      return map;
   }
}