@ -4,13 +4,16 @@ import java.util.Collection;
import java.util.Map ;
import java.util.Map ;
import javax.servlet.http.HttpServletRequest ;
import javax.servlet.http.HttpServletRequest ;
import javax.servlet.http.HttpServletResponse ;
import javax.servlet.http.HttpServletResponse ;
import org.apache.commons.lang3.ArrayUtils ;
import org.aspectj.lang.JoinPoint ;
import org.aspectj.lang.JoinPoint ;
import org.aspectj.lang.annotation.AfterReturning ;
import org.aspectj.lang.annotation.AfterReturning ;
import org.aspectj.lang.annotation.AfterThrowing ;
import org.aspectj.lang.annotation.AfterThrowing ;
import org.aspectj.lang.annotation.Aspect ;
import org.aspectj.lang.annotation.Aspect ;
import org.aspectj.lang.annotation.Before ;
import org.slf4j.Logger ;
import org.slf4j.Logger ;
import org.slf4j.LoggerFactory ;
import org.slf4j.LoggerFactory ;
import org.springframework.beans.factory.annotation.Autowired ;
import org.springframework.beans.factory.annotation.Autowired ;
import org.springframework.core.NamedThreadLocal ;
import org.springframework.http.HttpMethod ;
import org.springframework.http.HttpMethod ;
import org.springframework.stereotype.Component ;
import org.springframework.stereotype.Component ;
import org.springframework.validation.BindingResult ;
import org.springframework.validation.BindingResult ;
@ -40,9 +43,21 @@ public class LogAspect
/** 排除敏感属性字段 */
/** 排除敏感属性字段 */
public static final String [ ] EXCLUDE_PROPERTIES = { "password" , "oldPassword" , "newPassword" , "confirmPassword" } ;
public static final String [ ] EXCLUDE_PROPERTIES = { "password" , "oldPassword" , "newPassword" , "confirmPassword" } ;
/** 计算操作消耗时间 */
private static final ThreadLocal < Long > TIME_THREADLOCAL = new NamedThreadLocal < Long > ( "Cost Time" ) ;
@Autowired
@Autowired
private AsyncLogService asyncLogService ;
private AsyncLogService asyncLogService ;
/ * *
* 处 理 请 求 前 执 行
* /
@Before ( value = "@annotation(controllerLog)" )
public void boBefore ( JoinPoint joinPoint , Log controllerLog )
{
TIME_THREADLOCAL . set ( System . currentTimeMillis ( ) ) ;
}
/ * *
/ * *
* 处 理 完 请 求 后 执 行
* 处 理 完 请 求 后 执 行
*
*
@ -74,7 +89,7 @@ public class LogAspect
SysOperLog operLog = new SysOperLog ( ) ;
SysOperLog operLog = new SysOperLog ( ) ;
operLog . setStatus ( BusinessStatus . SUCCESS . ordinal ( ) ) ;
operLog . setStatus ( BusinessStatus . SUCCESS . ordinal ( ) ) ;
// 请求的地址
// 请求的地址
String ip = IpUtils . getIpAddr ( ServletUtils . getRequest ( ) ) ;
String ip = IpUtils . getIpAddr ( ) ;
operLog . setOperIp ( ip ) ;
operLog . setOperIp ( ip ) ;
operLog . setOperUrl ( StringUtils . substring ( ServletUtils . getRequest ( ) . getRequestURI ( ) , 0 , 255 ) ) ;
operLog . setOperUrl ( StringUtils . substring ( ServletUtils . getRequest ( ) . getRequestURI ( ) , 0 , 255 ) ) ;
String username = SecurityUtils . getUsername ( ) ;
String username = SecurityUtils . getUsername ( ) ;
@ -96,16 +111,21 @@ public class LogAspect
operLog . setRequestMethod ( ServletUtils . getRequest ( ) . getMethod ( ) ) ;
operLog . setRequestMethod ( ServletUtils . getRequest ( ) . getMethod ( ) ) ;
// 处理设置注解上的参数
// 处理设置注解上的参数
getControllerMethodDescription ( joinPoint , controllerLog , operLog , jsonResult ) ;
getControllerMethodDescription ( joinPoint , controllerLog , operLog , jsonResult ) ;
// 设置消耗时间
operLog . setCostTime ( System . currentTimeMillis ( ) - TIME_THREADLOCAL . get ( ) ) ;
// 保存数据库
// 保存数据库
asyncLogService . saveSysLog ( operLog ) ;
asyncLogService . saveSysLog ( operLog ) ;
}
}
catch ( Exception exp )
catch ( Exception exp )
{
{
// 记录本地异常日志
// 记录本地异常日志
log . error ( "==前置通知异常==" ) ;
log . error ( "异常信息:{}" , exp . getMessage ( ) ) ;
log . error ( "异常信息:{}" , exp . getMessage ( ) ) ;
exp . printStackTrace ( ) ;
exp . printStackTrace ( ) ;
}
}
finally
{
TIME_THREADLOCAL . remove ( ) ;
}
}
}
/ * *
/ * *
@ -127,7 +147,7 @@ public class LogAspect
if ( log . isSaveRequestData ( ) )
if ( log . isSaveRequestData ( ) )
{
{
// 获取参数的信息,传入到数据库中。
// 获取参数的信息,传入到数据库中。
setRequestValue ( joinPoint , operLog );
setRequestValue ( joinPoint , operLog , log . excludeParamNames ( ) );
}
}
// 是否需要保存response, 参数和值
// 是否需要保存response, 参数和值
if ( log . isSaveResponseData ( ) & & StringUtils . isNotNull ( jsonResult ) )
if ( log . isSaveResponseData ( ) & & StringUtils . isNotNull ( jsonResult ) )
@ -142,20 +162,26 @@ public class LogAspect
* @param operLog 操 作 日 志
* @param operLog 操 作 日 志
* @throws Exception 异 常
* @throws Exception 异 常
* /
* /
private void setRequestValue ( JoinPoint joinPoint , SysOperLog operLog ) throws Exception
private void setRequestValue ( JoinPoint joinPoint , SysOperLog operLog , String [ ] excludeParamNames ) throws Exception
{
{
String requestMethod = operLog . getRequestMethod ( ) ;
String requestMethod = operLog . getRequestMethod ( ) ;
if ( HttpMethod . PUT . name ( ) . equals ( requestMethod ) | | HttpMethod . POST . name ( ) . equals ( requestMethod ) )
Map < ? , ? > paramsMap = ServletUtils . getParamMap ( ServletUtils . getRequest ( ) ) ;
if ( StringUtils . isEmpty ( paramsMap )
& & ( HttpMethod . PUT . name ( ) . equals ( requestMethod ) | | HttpMethod . POST . name ( ) . equals ( requestMethod ) ) )
{
{
String params = argsArrayToString ( joinPoint . getArgs ( ) ) ;
String params = argsArrayToString ( joinPoint . getArgs ( ) , excludeParamNames );
operLog . setOperParam ( StringUtils . substring ( params , 0 , 2000 ) ) ;
operLog . setOperParam ( StringUtils . substring ( params , 0 , 2000 ) ) ;
}
}
else
{
operLog . setOperParam ( StringUtils . substring ( JSON . toJSONString ( paramsMap , excludePropertyPreFilter ( excludeParamNames ) ) , 0 , 2000 ) ) ;
}
}
}
/ * *
/ * *
* 参 数 拼 装
* 参 数 拼 装
* /
* /
private String argsArrayToString ( Object [ ] paramsArray )
private String argsArrayToString ( Object [ ] paramsArray , String [ ] excludeParamNames )
{
{
String params = "" ;
String params = "" ;
if ( paramsArray ! = null & & paramsArray . length > 0 )
if ( paramsArray ! = null & & paramsArray . length > 0 )
@ -166,7 +192,7 @@ public class LogAspect
{
{
try
try
{
{
String jsonObj = JSON . toJSONString ( o , excludePropertyPreFilter ( ) ) ;
String jsonObj = JSON . toJSONString ( o , excludePropertyPreFilter ( excludeParamNames ) ) ;
params + = jsonObj . toString ( ) + " " ;
params + = jsonObj . toString ( ) + " " ;
}
}
catch ( Exception e )
catch ( Exception e )
@ -181,9 +207,9 @@ public class LogAspect
/ * *
/ * *
* 忽 略 敏 感 属 性
* 忽 略 敏 感 属 性
* /
* /
public PropertyPreExcludeFilter excludePropertyPreFilter ( )
public PropertyPreExcludeFilter excludePropertyPreFilter ( String [ ] excludeParamNames )
{
{
return new PropertyPreExcludeFilter ( ) . addExcludes ( EXCLUDE_PROPERTIES) ;
return new PropertyPreExcludeFilter ( ) . addExcludes ( ArrayUtils. addAll ( EXCLUDE_PROPERTIES, excludeParamNames ) ) ;
}
}
/ * *
/ * *