/**
|
* Copyright © 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
|
*/
|
package com.jeeplus.modules.sys.utils;
|
|
import java.lang.reflect.Method;
|
import java.util.List;
|
import java.util.Map;
|
|
import javax.servlet.http.HttpServletRequest;
|
|
import org.apache.shiro.authz.annotation.RequiresPermissions;
|
import org.springframework.web.method.HandlerMethod;
|
|
import com.google.common.collect.Lists;
|
import com.google.common.collect.Maps;
|
import com.jeeplus.common.config.Global;
|
import com.jeeplus.common.utils.CacheUtils;
|
import com.jeeplus.common.utils.Exceptions;
|
import com.jeeplus.common.utils.SpringContextHolder;
|
import com.jeeplus.common.utils.StringUtils;
|
import com.jeeplus.modules.sys.dao.LogDao;
|
import com.jeeplus.modules.sys.dao.MenuDao;
|
import com.jeeplus.modules.sys.entity.Log;
|
import com.jeeplus.modules.sys.entity.Menu;
|
import com.jeeplus.modules.sys.entity.User;
|
|
/**
|
* 字典工具类
|
* @author jeeplus
|
* @version 2014-11-7
|
*/
|
public class LogUtils {
|
|
public static final String CACHE_MENU_NAME_PATH_MAP = "menuNamePathMap";
|
|
private static LogDao logDao = SpringContextHolder.getBean(LogDao.class);
|
private static MenuDao menuDao = SpringContextHolder.getBean(MenuDao.class);
|
|
/**
|
* 保存日志
|
*/
|
public static void saveLog(HttpServletRequest request, String title){
|
saveLog(request, null, null, title);
|
}
|
|
/**
|
* 保存日志
|
*/
|
public static void saveLog(HttpServletRequest request, Object handler, Exception ex, String title){
|
User user = UserUtils.getUser();
|
if (user != null && user.getId() != null){
|
Log log = new Log();
|
log.setTitle(title);
|
log.setType(ex == null ? Log.TYPE_ACCESS : Log.TYPE_EXCEPTION);
|
log.setRemoteAddr(StringUtils.getRemoteAddr(request));
|
log.setUserAgent(request.getHeader("user-agent"));
|
log.setRequestUri(request.getRequestURI());
|
log.setParams(request.getParameterMap());
|
log.setMethod(request.getMethod());
|
// 异步保存日志
|
new SaveLogThread(log, handler, ex).start();
|
}
|
}
|
|
/**
|
* 保存日志线程
|
*/
|
public static class SaveLogThread extends Thread{
|
|
private Log log;
|
private Object handler;
|
private Exception ex;
|
|
public SaveLogThread(Log log, Object handler, Exception ex){
|
super(SaveLogThread.class.getSimpleName());
|
this.log = log;
|
this.handler = handler;
|
this.ex = ex;
|
}
|
|
@Override
|
public void run() {
|
// 获取日志标题
|
if (StringUtils.isBlank(log.getTitle())){
|
String permission = "";
|
if (handler instanceof HandlerMethod){
|
Method m = ((HandlerMethod)handler).getMethod();
|
RequiresPermissions rp = m.getAnnotation(RequiresPermissions.class);
|
permission = (rp != null ? StringUtils.join(rp.value(), ",") : "");
|
}
|
log.setTitle(getMenuNamePath(log.getRequestUri(), permission));
|
}
|
// 如果有异常,设置异常信息
|
log.setException(Exceptions.getStackTraceAsString(ex));
|
// 如果无标题并无异常日志,则不保存信息
|
if (StringUtils.isBlank(log.getTitle()) && StringUtils.isBlank(log.getException())){
|
return;
|
}
|
// 保存日志信息
|
log.preInsert();
|
logDao.insert(log);
|
}
|
}
|
|
/**
|
* 获取菜单名称路径(如:系统设置-机构用户-用户管理-编辑)
|
*/
|
public static String getMenuNamePath(String requestUri, String permission){
|
String href = StringUtils.substringAfter(requestUri, Global.getAdminPath());
|
@SuppressWarnings("unchecked")
|
Map<String, String> menuMap = (Map<String, String>)CacheUtils.get(CACHE_MENU_NAME_PATH_MAP);
|
if (menuMap == null){
|
menuMap = Maps.newHashMap();
|
List<Menu> menuList = menuDao.findAllList(new Menu());
|
for (Menu menu : menuList){
|
// 获取菜单名称路径(如:系统设置-机构用户-用户管理-编辑)
|
String namePath = "";
|
if (menu.getParentIds() != null){
|
List<String> namePathList = Lists.newArrayList();
|
for (String id : StringUtils.split(menu.getParentIds(), ",")){
|
if (Menu.getRootId().equals(id)){
|
continue; // 过滤跟节点
|
}
|
for (Menu m : menuList){
|
if (m.getId().equals(id)){
|
namePathList.add(m.getName());
|
break;
|
}
|
}
|
}
|
namePathList.add(menu.getName());
|
namePath = StringUtils.join(namePathList, "-");
|
}
|
// 设置菜单名称路径
|
if (StringUtils.isNotBlank(menu.getHref())){
|
menuMap.put(menu.getHref(), namePath);
|
}else if (StringUtils.isNotBlank(menu.getPermission())){
|
for (String p : StringUtils.split(menu.getPermission())){
|
menuMap.put(p, namePath);
|
}
|
}
|
|
}
|
CacheUtils.put(CACHE_MENU_NAME_PATH_MAP, menuMap);
|
}
|
String menuNamePath = menuMap.get(href);
|
if (menuNamePath == null){
|
for (String p : StringUtils.split(permission)){
|
menuNamePath = menuMap.get(p);
|
if (StringUtils.isNotBlank(menuNamePath)){
|
break;
|
}
|
}
|
if (menuNamePath == null){
|
return "";
|
}
|
}
|
return menuNamePath;
|
}
|
|
|
}
|