javassist
    
javassist
    
3.12.1.GA
org.aspectj
aspectjweaver
1.8.8
package com.try2better.daily.component;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;import org.springframework.core.Ordered;import org.springframework.core.annotation.Order;@Retention(RetentionPolicy.RUNTIME)  @Target({ElementType.METHOD,ElementType.TYPE})  @Documented//最高优先级  @Order(Ordered.HIGHEST_PRECEDENCE)  public @interface Try2betterAspectLog {	String name() default "";  }
package com.try2better.daily.component;import java.lang.reflect.Modifier;import java.util.HashMap;import java.util.Map;import javassist.ClassClassPath;import javassist.ClassPool;import javassist.CtClass;import javassist.CtMethod;import javassist.bytecode.CodeAttribute;import javassist.bytecode.LocalVariableAttribute;import javax.servlet.http.HttpServletRequest;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.annotation.AfterReturning;import org.aspectj.lang.annotation.Aspect;import org.springframework.stereotype.Component;import org.springframework.web.context.request.RequestContextHolder;import org.springframework.web.context.request.ServletRequestAttributes;import com.try2better.daily.entity.LogRecordEntity;import com.try2better.daily.util.LoggerUtil;@Aspect@Componentpublic class LogAspect {	    @AfterReturning(returning="result", pointcut="@annotation(com.try2better.daily.component.Try2betterAspectLog)")    public void after(JoinPoint joinPoint,Object result) throws ClassNotFoundException{    	Object target = joinPoint.getTarget();    	if(target == null || !(target instanceof BaseController)){    		throw new RuntimeException("此controller没有继承BaseController!");    	}    	BaseController controller = (BaseController)joinPoint.getTarget();    	HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();    	String uri = request.getRequestURI();    	String url = request.getRequestURL().toString();    	String queryString = request.getQueryString();    	String classType = joinPoint.getTarget().getClass().getName();            Class
 clazz = Class.forName(classType);            String className = clazz.getName();            String methodName = joinPoint.getSignature().getName(); //获取方法名称         //获取参数名称和值          Map
 parameterMap = getFieldsNameValueMap(joinPoint);                 LogRecordEntity logRecordEntity = new LogRecordEntity();        logRecordEntity.setUrl(url);;        logRecordEntity.setUri(uri);;        logRecordEntity.setQueryString(queryString);;             logRecordEntity.setUserId("admin");;        logRecordEntity.setRequestDate(new java.util.Date());;             logRecordEntity.setClassName(className);;        logRecordEntity.setMethodName(methodName);;        logRecordEntity.setParameterMap(parameterMap);;        logRecordEntity.setResult(result);;     LoggerUtil.info(controller.getLogger(), logRecordEntity);    }              private Map
 getFieldsNameValueMap(JoinPoint joinPoint){       Map
 map=new HashMap
();       try {     Object[] args = joinPoint.getArgs();         String classType = joinPoint.getTarget().getClass().getName();                Class
 clazz = Class.forName(classType);                String clazzName = clazz.getName();                String methodName = joinPoint.getSignature().getName(); //获取方法名称                          ClassPool pool = ClassPool.getDefault();                ClassClassPath classPath = new ClassClassPath(this.getClass());                pool.insertClassPath(classPath);                CtClass cc = pool.get(clazzName);                CtMethod cm = cc.getDeclaredMethod(methodName);                javassist.bytecode.MethodInfo methodInfo = cm.getMethodInfo();              CodeAttribute codeAttribute = methodInfo.getCodeAttribute();                LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag);                if (attr == null) {                    throw new RuntimeException();            }                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即参数名                }     } catch (Exception e) { e.printStackTrace(); }        return map;        }    }
package com.try2better.daily.entity;import java.util.Date;import java.util.Map;public class LogRecordEntity {	private String url;	private String uri;	private String queryString;		private String userId;	private Date requestDate;		private String className;	private String methodName;	private Map
 parameterMap; private Object result; public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getUri() { return uri; } public void setUri(String uri) { this.uri = uri; } public String getQueryString() { return queryString; } public void setQueryString(String queryString) { this.queryString = queryString; } public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public Date getRequestDate() { return requestDate; } public void setRequestDate(Date requestDate) { this.requestDate = requestDate; } public String getClassName() { return className; } public void setClassName(String className) { this.className = className; } public String getMethodName() { return methodName; } public void setMethodName(String methodName) { this.methodName = methodName; } public Map
 getParameterMap() { return parameterMap; } public void setParameterMap(Map
 parameterMap) { this.parameterMap = parameterMap; } public Object getResult() { return result; } public void setResult(Object result) { this.result = result; } }
package com.try2better.daily.util;import org.slf4j.Logger;import com.alibaba.fastjson.JSONObject;import com.try2better.daily.entity.LogRecordEntity;public class LoggerUtil {	public static void info(Logger logger,LogRecordEntity logRecordEntity){		logger.info(JSONObject.toJSONString(logRecordEntity));	}}
package com.try2better.daily.controller;import java.io.BufferedInputStream;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.OutputStream;import java.net.URLEncoder;import java.util.HashMap;import java.util.List;import java.util.Map;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import com.try2better.daily.component.BaseController;import com.try2better.daily.component.Try2betterAspectLog;import com.try2better.daily.entity.Task;import com.try2better.daily.util.qrcode.EncodeRequestEntity;import com.try2better.daily.util.qrcode.EncodeResultEntity;import com.try2better.daily.util.qrcode.QRCodeHelper;@Controller@RequestMapping("/")public class QRCodeController extends BaseController{		@Try2betterAspectLog	@ResponseBody	@RequestMapping("/method")	public Map
 method1(String a,Integer b){ Map
 map = new HashMap
(); map.put("1", "1"); return map; } }
package com.try2better.daily.component;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class BaseController {	protected final Logger logger = LoggerFactory.getLogger(getClass());	public Logger getLogger() {		return logger;	}	}