Преглед изворни кода

登录系统日志

git-svn-id: https://192.168.57.71/svn/jsgkj@1178 931142cf-59ea-a443-aa0e-51397b428577
ld_zhouk пре 8 година
родитељ
комит
2942545502

+ 2 - 0
gkaqv2/trunk/modules/frame/src/main/java/com/xt/js/gkaq/frame/service/SysLogService.java

@@ -2,6 +2,7 @@ package com.xt.js.gkaq.frame.service;
 
 import com.xt.js.gkaq.common.BaseUUIDModelService;
 import com.xt.js.gkaq.frame.model.SysLogModel;
+import com.xt.js.gkaq.frame.model.UserModel;
 
 /**
  * ϵͳÈÕÖ¾·þÎñ½Ó¿Ú
@@ -10,4 +11,5 @@ import com.xt.js.gkaq.frame.model.SysLogModel;
  *
  */
 public interface SysLogService extends BaseUUIDModelService<SysLogModel> {
+    public int add(SysLogModel record, UserModel user);
 }

+ 18 - 0
gkaqv2/trunk/modules/frame/src/main/java/com/xt/js/gkaq/frame/service/impl/SysLogServiceImpl.java

@@ -1,12 +1,17 @@
 package com.xt.js.gkaq.frame.service.impl;
 
+import java.util.Date;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import com.xt.js.gkaq.common.BaseMapper;
+import com.xt.js.gkaq.common.BaseUUIDModel;
 import com.xt.js.gkaq.common.BaseUUIDModelServiceImpl;
 import com.xt.js.gkaq.frame.mappers.SysLogModelMapper;
 import com.xt.js.gkaq.frame.model.SysLogModel;
+import com.xt.js.gkaq.frame.model.UserModel;
 import com.xt.js.gkaq.frame.service.SysLogService;
 
 @Service
@@ -18,4 +23,17 @@ public class SysLogServiceImpl extends BaseUUIDModelServiceImpl<SysLogModel> imp
 	protected BaseMapper<SysLogModel> getMapper() {
 		return mapper;
 	}
+
+    @Transactional
+    public int add(SysLogModel record, UserModel user) {
+        record.setId(idGenerator.generateStringId());
+        Date now = new Date();
+        record.setCreateTime(now);
+        record.setUpdateTime(now);
+        record.setCreateUser(user.getLoginName());
+        record.setUpdateUser(user.getLoginName());
+        record.setState(BaseUUIDModel.STATE_DRAFT);
+        return mapper.insert(record);
+    }
+
 }

+ 25 - 0
gkaqv2/trunk/modules/frame/src/main/java/com/xt/js/gkaq/frame/system/GkaqFormAuthenticationFilter.java

@@ -4,21 +4,26 @@ import java.util.List;
 
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
 
 import org.apache.shiro.SecurityUtils;
 import org.apache.shiro.authc.AuthenticationToken;
 import org.apache.shiro.session.Session;
 import org.apache.shiro.web.filter.authc.FormAuthenticationFilter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 
 import com.xt.js.gkaq.common.Constants;
 import com.xt.js.gkaq.frame.model.ButtonModel;
 import com.xt.js.gkaq.frame.model.GroupModelDto;
 import com.xt.js.gkaq.frame.model.MenuModel;
+import com.xt.js.gkaq.frame.model.SysLogModel;
 import com.xt.js.gkaq.frame.model.UserModel;
 import com.xt.js.gkaq.frame.service.ButtonService;
 import com.xt.js.gkaq.frame.service.GroupService;
 import com.xt.js.gkaq.frame.service.MenuService;
+import com.xt.js.gkaq.frame.service.SysLogService;
 import com.yuanxd.tools.utils.Assert;
 
 /**
@@ -34,6 +39,10 @@ public class GkaqFormAuthenticationFilter extends FormAuthenticationFilter {
     private MenuService menuService;
     @Autowired
     private ButtonService buttonService;
+    @Autowired
+    private SysLogService sysLogService;
+    // 日志对象
+    private static final Logger logger = LoggerFactory.getLogger(GkaqFormAuthenticationFilter.class);
 
     @Override
     protected boolean onLoginSuccess(AuthenticationToken token, org.apache.shiro.subject.Subject subject,
@@ -46,8 +55,24 @@ public class GkaqFormAuthenticationFilter extends FormAuthenticationFilter {
         List<MenuModel> menuList = menuService.selectAllByUser(userGroup);
         List<ButtonModel> btnList = buttonService.selectAllByUser(userGroup);
         Session session = SecurityUtils.getSubject().getSession();
+        session.setAttribute(Constants.SESSION_KEY_USER, user);
         session.setAttribute(Constants.SESSION_KEY_MENUS, menuList);
         session.setAttribute(Constants.SESSION_KEY_BTNS, btnList);
+        // 登入日志
+        HttpServletRequest httpRequest = (HttpServletRequest) request;
+        String clientIp = IpUtil.getIpAddr(httpRequest);
+        session.setAttribute(Constants.SESSION_KEY_IP, clientIp);
+
+        // 数据库日志
+        SysLogModel log = new SysLogModel();
+        log.setLogType(Constants.LOG_TYPE_3);
+        log.setLogPath(GkaqFormAuthenticationFilter.class.getName());
+        log.setLogParam("");
+        log.setLogMsg("用户:[" + user.getLoginName() + "|" + user.getRealName() + "]登入系统!");
+        log.setClientIp(clientIp);
+        // 保存数据库
+        sysLogService.save(log);
+        logger.info("生成系统日志[日志描述:{},客户端IP:{}]", log.getLogMsg(), clientIp);
         return super.onLoginSuccess(token, subject, request, response);
     }
 

+ 43 - 0
gkaqv2/trunk/modules/frame/src/main/java/com/xt/js/gkaq/frame/system/GkaqLogoutFilter.java

@@ -0,0 +1,43 @@
+package com.xt.js.gkaq.frame.system;
+
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.shiro.subject.Subject;
+import org.apache.shiro.web.filter.authc.LogoutFilter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import com.xt.js.gkaq.common.Constants;
+import com.xt.js.gkaq.frame.model.SysLogModel;
+import com.xt.js.gkaq.frame.model.UserModel;
+import com.xt.js.gkaq.frame.service.SysLogService;
+
+public class GkaqLogoutFilter extends LogoutFilter {
+    @Autowired
+    private SysLogService sysLogService;
+    // 日志对象
+    private static final Logger logger = LoggerFactory.getLogger(GkaqLogoutFilter.class);
+
+    @Override
+    protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception {
+        // 登出日志
+        Subject subject = getSubject(request, response);
+        UserModel user = (UserModel) subject.getPrincipal();
+        HttpServletRequest httpRequest = (HttpServletRequest) request;
+        String clientIp = IpUtil.getIpAddr(httpRequest);
+        // 数据库日志
+        SysLogModel log = new SysLogModel();
+        log.setLogType(Constants.LOG_TYPE_4);
+        log.setLogPath(GkaqLogoutFilter.class.getName());
+        log.setLogParam("");
+        log.setLogMsg("用户:[" + user.getLoginName() + "|" + user.getRealName() + "]登出系统!");
+        log.setClientIp(clientIp);
+        // 保存数据库
+        sysLogService.save(log);
+        logger.info("生成系统日志[日志描述:{},客户端IP:{}]", log.getLogMsg(), clientIp);
+        return super.preHandle(request, response);
+    }
+}

+ 64 - 0
gkaqv2/trunk/modules/frame/src/main/java/com/xt/js/gkaq/frame/system/IpUtil.java

@@ -0,0 +1,64 @@
+package com.xt.js.gkaq.frame.system;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * IP工具类
+ */
+public class IpUtil {
+
+    /**
+     * 获取客户端IP地址
+     * 
+     * @param request
+     * @return
+     */
+    public static String getIpAddr(HttpServletRequest request) {
+        String ip = request.getHeader("x-forwarded-for");
+        if (unknownIp(ip)) {
+            ip = request.getHeader("Proxy-Client-IP");
+        }
+        if (unknownIp(ip)) {
+            ip = request.getHeader("WL-Proxy-Client-IP");
+        }
+        if (unknownIp(ip)) {
+            ip = request.getHeader("HTTP_CLIENT_IP");
+        }
+        if (unknownIp(ip)) {
+            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
+        }
+        if (unknownIp(ip)) {
+            ip = request.getRemoteAddr();
+            if ("127.0.0.1".equals(ip) || "0:0:0:0:0:0:0:1".equals(ip)) {
+                // 根据网卡取本机配置的IP
+                InetAddress inet = null;
+                try {
+                    inet = InetAddress.getLocalHost();
+                } catch (UnknownHostException e) {
+                    e.printStackTrace();
+                }
+                ip = inet.getHostAddress();
+            }
+        }
+        // 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
+        if (ip != null && ip.length() > 15) {
+            if (ip.indexOf(",") > 0) {
+                ip = ip.substring(0, ip.indexOf(","));
+            }
+        }
+        return ip;
+    }
+
+    /**
+     * 是否未知IP
+     * 
+     * @param ip
+     * @return
+     */
+    private static boolean unknownIp(String ip) {
+        return ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip);
+    }
+}