You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

188 lines
7.7 KiB
Java

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package com.manage.controller; /**
* <p>Title: LogAopAction.java</p>
* <p>Description: 操作日志Controller</p>
*/
import com.manage.annotation.OptionalLog;
import com.manage.entity.Power_Log;
import com.manage.service.LogService;
import com.manage.util.ExceptionPrintUtil;
import org.apache.commons.lang3.CharUtils;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.DefaultParameterNameDiscoverer;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
@Aspect
@Component
public class LogAopAction {
// 注入service,用来将日志信息保存在数据库
@Resource
private LogService logService;
// 配置接入点即为所要记录的action操作目录
@Pointcut("@annotation(com.manage.annotation.OptionalLog)")
private void controllerAspect() {
}
@Around("controllerAspect()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
.getRequest();
// 拦截的实体类就是当前正在执行的controller
Object target = pjp.getTarget();
// 拦截的方法名称。当前正在执行的方法
String methodName = pjp.getSignature().getName();
// 拦截的放参数类型
Signature sig = pjp.getSignature();
MethodSignature msig = null;
if (!(sig instanceof MethodSignature)) {
throw new IllegalArgumentException("该注解只能用于方法");
}
msig = (MethodSignature) sig;
Class[] parameterTypes = msig.getMethod().getParameterTypes();
Object object = null;
// 获得被拦截的方法
Method method = null;
try {
method = target.getClass().getMethod(methodName, parameterTypes);
} catch (NoSuchMethodException e1) {
e1.printStackTrace();
}
if (null != method) {
//插入表操作
insertLog(method,pjp);
}
object = pjp.proceed();
//接受客户端的数据
Map<String,String[]> map = request.getParameterMap();
// 解决获取参数乱码
Map<String,String[]> newmap = new HashMap<String,String[]>();
for(Map.Entry<String, String[]> entry : map.entrySet()){
String name = entry.getKey();
String[] values = entry.getValue();
if(values==null){
newmap.put(name, new String[]{});
continue;
}
String[] newvalues = new String[values.length];
for(int i=0; i<values.length;i++){
String value = values[i];
value = new String(value.getBytes("iso8859-1"),request.getCharacterEncoding());
newvalues[i] = value; //解决乱码后封装到Map中
}
newmap.put(name, newvalues);
}
return object;
}
//对象字段转数据库字段
private static String propertyToField(String property) {
if (StringUtils.isEmpty(property)) {
return "";
}
if (property.length() == 1) {
return property.toLowerCase();
}
char[] chars = property.toCharArray();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < chars.length; i++) {
char c = chars[i];
if (i == 0) {
sb.append(StringUtils.lowerCase(CharUtils.toString(c)));
} else {
if (CharUtils.isAsciiAlphaUpper(c)) {
sb.append("_").append(StringUtils.lowerCase(CharUtils.toString(c)));
} else {
sb.append(c);
}
}
}
return sb.toString();
}
private void insertLog(Method method,ProceedingJoinPoint pjp) {
//日志实体对象
Power_Log logBo = new Power_Log();
// 获取方法(此为自定义注解)
OptionalLog op = method.getAnnotation(OptionalLog.class);
String module = op.module();
// 拦截的方法参数
//判断操作类型
if (StringUtils.isNoneBlank(module)) {
Object[] args = pjp.getArgs();
try {
if (null != args && StringUtils.isNotBlank(op.fieldName())) {
if (("新增".equals(module)) || "修改".equals(module) || "保存".equals(module)) {
Object obj = args[0];
//通过反射获取值
Class c = obj.getClass();
// 获取该类的成员变量
Field f = c.getDeclaredField(op.fieldName());
// 取消语言访问检查
f.setAccessible(true);
logBo.setRemark(f.get(obj).toString());
}
if ("删除".equals(module) || "重置密码".equals(module) || "修改分配".equals(module)) {
String tableName = op.tableName();
String fieldName = op.fieldName();
fieldName = propertyToField(fieldName);
DefaultParameterNameDiscoverer discover = new DefaultParameterNameDiscoverer();
String[] parameterNames = discover.getParameterNames(method);
//拼接查询语句
String sqlWhere = "";
//一个参数如id
sqlWhere = " " + propertyToField(parameterNames[0]) + " = '" + args[0] +"'";
Map<String, Object> obj = logService.selectObjectByKey(tableName, sqlWhere);
Object o = null;
if(obj != null){
o = obj.get(fieldName);
String remark = "";
//第一个字段
if(o != null){
remark = obj.get(fieldName).toString();
}else{
//否则取备用字段
fieldName = propertyToField(op.fieldName1());
if(StringUtils.isNotBlank(fieldName)){
o = obj.get(fieldName);
if(o != null){
remark = obj.get(fieldName).toString();
}
}
}
logBo.setRemark(remark);
}
}
}
// 获取注解的modules 设为操作模块
logBo.setLogTitle(module);
// 获取注解的methods 设为执行方法
logBo.setLogContent(op.methods());
// 添加到数据库
logService.insert(logBo);
} catch (Exception e) {
ExceptionPrintUtil.printException(e);
e.printStackTrace();
throw new RuntimeException();
}
}
}
}