packagecom.ideal.manage.guest.service.log;importcom.alibaba.fastjson.JSONObject;importcom.ideal.manage.guest.bean.DTO.PageDto;importcom.ideal.manage.guest.bean.log.Log;importcom.ideal.manage.guest.config.shiro.MyShiroRealm;importcom.ideal.manage.guest.repository.framework.MySpecification;importcom.ideal.manage.guest.repository.framework.SpecificationOperator;importcom.ideal.manage.guest.repository.log.LogRepository;importcom.ideal.manage.guest.util.Const;importcom.ideal.manage.guest.util.HttpRequests;importcom.ideal.manage.guest.util.IPUtils;/*import org.apache.ibatis.javassist.*;
import org.apache.ibatis.javassist.bytecode.CodeAttribute;
import org.apache.ibatis.javassist.bytecode.LocalVariableAttribute;
import org.apache.ibatis.javassist.bytecode.MethodInfo;*/
import javassist.*;importjavassist.bytecode.CodeAttribute;importjavassist.bytecode.LocalVariableAttribute;importjavassist.bytecode.MethodInfo;importorg.apache.shiro.SecurityUtils;importorg.aspectj.lang.JoinPoint;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.data.domain.Page;importorg.springframework.data.domain.PageRequest;importorg.springframework.data.domain.Pageable;importorg.springframework.data.domain.Sort;importorg.springframework.stereotype.Service;importorg.springframework.util.CollectionUtils;importorg.springframework.util.StringUtils;importorg.springframework.web.context.request.RequestContextHolder;importorg.springframework.web.context.request.ServletRequestAttributes;importjavax.servlet.http.HttpServletRequest;importjava.util.HashMap;importjava.util.Iterator;importjava.util.List;importjava.util.Map;/***
* 服务实现类
*
*
*@author*@since2017-09-05*/@Servicepublic classLogService{private static final String LOG_CONTENT = "[类名]:%s,[方法]:%s,[参数]:%s,[IP]:%s";privateString username;
@AutowiredprivateLogRepository logRepository;publicString initUsername(String username) {if(!StringUtils.isEmpty(username)){this.username =username;
}return this.username;
}public voidput(JoinPoint joinPoint, String methodName, String module, String description) {try{
HttpServletRequest request=((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
Log log= newLog();//username = ((JwtClient) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getUsername();//获取当前登录用户
MyShiroRealm.ShiroUser shiroUser =(MyShiroRealm.ShiroUser) SecurityUtils.getSubject().getPrincipal();//User user = userRepository.findOne(shiroUser.getId());
username =shiroUser.getUsername();if(StringUtils.isEmpty(username)) {
username= Const.USERNAME_IN_CONTEXT != null ? Const.USERNAME_IN_CONTEXT : "未知用户";
}
String ip=IPUtils.getIpAddr(request);
log.setUsername(username);
log.setModule(module);
log.setDescription(description);
log.setIp(ip);
log.setContent(operateContent(joinPoint, methodName, ip, request));
log.setAble(1);//insert(log);
logRepository.save(log);
}catch(Exception e) {
e.printStackTrace();
}
}/*public Page page(LogRequest request, Page page) {
if(request == null){
request = new LogRequest();
}
request.setIsDeleted(Config.ABLE_CONFIG.ABLE);
List logs = baseMapper.page(request,page);
page.setRecords(logs);
return page;
}*/
/*** 查询所有日志
*@parampageNum
*@paramrequest
*@return
*/
public PageDto findAll(intpageNum, HttpServletRequest request) {
Sort sort= new Sort(Sort.Direction.DESC, "updateAt");
List operators = HttpRequests.getParametersStartingWith(request, "Q_");//增加删除标识的过滤
SpecificationOperator isValid = new SpecificationOperator("able", "1", "EQ");
operators.add(isValid);
MySpecification mySpecifications = new MySpecification<>(operators);
Pageable pageable= new PageRequest(pageNum, 10, sort);
Page page =logRepository.findAll(mySpecifications, pageable);//设置PageDto
List parameters =page.getContent();long total =page.getTotalElements();
PageDto pageDto= newPageDto();
pageDto.setRows(parameters);
pageDto.setTotal(total);returnpageDto;
}public String operateContent(JoinPoint joinPoint, String methodName, String ip, HttpServletRequest request) throwsClassNotFoundException, NotFoundException {
String className=joinPoint.getTarget().getClass().getName();
Object[] params=joinPoint.getArgs();
String classType=joinPoint.getTarget().getClass().getName();
Class> clazz =Class.forName(classType);
String clazzName=clazz.getName();
Map nameAndArgs = getFieldsName(this.getClass(), clazzName, methodName,params);
StringBuffer bf= newStringBuffer();if (!CollectionUtils.isEmpty(nameAndArgs)){
Iterator it=nameAndArgs.entrySet().iterator();while(it.hasNext()){
Map.Entry entry=(Map.Entry) it.next();
String key=(String) entry.getKey();
String value=JSONObject.toJSONString(entry.getValue());
bf.append(key).append("=");
bf.append(value).append("&");
}
}if(StringUtils.isEmpty(bf.toString())){
bf.append(request.getQueryString());
}returnString.format(LOG_CONTENT, className, methodName, bf.toString(), ip);
}private Map getFieldsName(Class cls, String clazzName, String methodName, Object[] args) throwsNotFoundException {
Map map=new HashMap();
ClassPool pool=ClassPool.getDefault();
ClassClassPath classPath= newClassClassPath(cls);
pool.insertClassPath(classPath);
CtClass cc=pool.get(clazzName);
CtMethod cm=cc.getDeclaredMethod(methodName);
MethodInfo methodInfo=cm.getMethodInfo();
CodeAttribute codeAttribute=methodInfo.getCodeAttribute();
LocalVariableAttribute attr=(LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag);if (attr == null) {//exception
returnmap;
}int pos = Modifier.isStatic(cm.getModifiers()) ? 0 : 1;for (int i = 0; i < cm.getParameterTypes().length; i++){
map.put( attr.variableName(i+ pos),args[i]);//paramNames即参数名
}returnmap;
}
}