@自定义注解AOP注解完成日志记录
创建一个注解 @interface
public @interface User {
String value() default "";
}
创建一个切面
1、配置一个织入点,使用注解就会进来
/**
* 配置织入点
*/
//配置切入点
@Pointcut("@annotation(com.zhang.validator.User)")
public void UserCut() {}
2、切点
(第一种)
@Around("UserCut()")
public void log(ProceedingJoinPoint pointcut) throws Throwable {
//获取传入参数
Object result = pointcut.proceed();
//获取返回参数
System.out.println(pointcut.getArgs());
}*
(第二种)
/**
* 处理完请求后执行
*
* @param joinPoint 切点
*/
@AfterReturning(pointcut = "UserCut()")
public void doAfterReturning(JoinPoint joinPoint){
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
//获取参数
//获取方法
String classType = joinPoint.getTarget().getClass().getName();
String methodName = joinPoint.getSignature().getName(); //获取方法名称
System.out.println("进入切点,准备开切");
// HttpServletRequest request = WebUtils.getRequest();
saveSysAccessLog(joinPoint, request, null);
}
2、异常
@AfterThrowing(pointcut = "logPointCut()", throwing = "e")
public void afterThrowing(JoinPoint joinPoint, Throwable e) {
log.info("系统抛出异常,保存日志信息");
HttpServletRequest request = WebUtils.getRequest();
asyncTaskExecutor.execute(() -> saveSysAccessLog(joinPoint, request, e));
}
完整代码在最后
aop执行顺序
aop异常执行顺序
*
完整代码
controller
@PostMapping("/dologin")
@com.zhang.validator.User
public String dologin(@RequestBody User user){
System.out.println(user.getName());
return "adfasdfas";
}
自定义注解
public @interface User {
String value() default "";
}
UserAspectj
@Aspect
@Component
public class UserAspectj {
private Long beginTime;
/**
* 配置织入点
*/
@Pointcut("@annotation(com.zhang.validator.User)")
public void UserCut() {}
/* @Around("UserCut()")
public void log(ProceedingJoinPoint pointcut) throws Throwable {
//获取传入参数
Object result = pointcut.proceed();
//获取返回参数
System.out.println(pointcut.getArgs());
}*/
/**
* 处理完请求后执行
*
* @param joinPoint 切点
*/
@AfterReturning(pointcut = "UserCut()")
public void doAfterReturning(JoinPoint joinPoint){
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
//获取参数
//获取方法
String classType = joinPoint.getTarget().getClass().getName();
String methodName = joinPoint.getSignature().getName(); //获取方法名称
System.out.println("进入切点,准备开切");
// HttpServletRequest request = WebUtils.getRequest();
saveSysAccessLog(joinPoint, request, null);
}
/*@AfterThrowing(pointcut = "logPointCut()", throwing = "e")
public void afterThrowing(JoinPoint joinPoint, Throwable e) {
log.info("系统抛出异常,保存日志信息");
HttpServletRequest request = WebUtils.getRequest();
asyncTaskExecutor.execute(() -> saveSysAccessLog(joinPoint, request, e));
}*/
/**
* 用于记录用户的操作日志描述
*/
private void saveSysAccessLog(JoinPoint joinPoint, HttpServletRequest request, Throwable e) {
// 执行时间
/* long time = System.currentTimeMillis() - beginTime;
System.out.println("执行时间:"+time);*/
// 用户操作描述
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
// 请求方法名
String typeName = signature.getDeclaringTypeName();
String methodName = signature.getName();
System.out.println("方法明"+typeName + "." + methodName + "()");
// 请求参数
Object[] args = joinPoint.getArgs();
System.out.println("请求参数:"+args);
// 请求路径
String requestPath = request.getRequestURI();
System.out.println("请求路径:"+requestPath);
// 请求方式
String requestType = request.getMethod();
System.out.println("请求方式:"+requestType);
// 请求时间
Date date = new Date();
System.out.println("请求时间:"+date);
// ip地址
String ip = WebUtils.getIpAddress(request);
System.out.println("ip地址:"+ip);
User user = (User) request.getSession().getAttribute("user");
System.out.println(user.getName());
}
}
webutils
/**
* Http与Servlet工具类.
*/
public class WebUtils {
/**
* 获取request对象
*/
public static HttpServletRequest getRequest() {
return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
}
/**
* 获取Response对象
*/
public static HttpServletResponse getResponse() {
return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
}
/**
* 获取Session对象
*/
public static HttpSession getSession() {
return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest().getSession();
}
/**
* 获取IP地址
*
* @param request
* @return
*/
public static String getIpAddress(HttpServletRequest request) {
String unknown = "unknown";
String ip = request.getHeader("X-Forwarded-For");
if (ip == null || ip.length() == 0 || unknown.equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || unknown.equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || unknown.equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
}
if (ip == null || ip.length() == 0 || unknown.equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (ip == null || ip.length() == 0 || unknown.equalsIgnoreCase(ip)) {
ip = request.getHeader("X-Real-IP");
}
if (ip == null || ip.length() == 0 || unknown.equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
//对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
if (ip != null && ip.length() > 0) {
String[] ips = ip.split(",");
if (ips.length > 0) {
ip = ips[0];
}
}
return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip;
}
/**
* 从request中获得参数,并返回可读的Map
* application/x-www-form-urlencode
* application/json
* application/json;charset=UTF-8
* multipart/form-data
*
* @param request
* @return
*/
public static Map<String, String> getParameterMap(HttpServletRequest request) {
String contentType = request.getHeader(org.springframework.http.HttpHeaders.CONTENT_TYPE);
Map<String, String> returnMap = new HashMap();
if (contentType != null && contentType.contains(MediaType.MULTIPART_FORM_DATA_VALUE)) {
// form-data表单
MultipartResolver multipartResolver = SpringUtils.getBean(MultipartResolver.class);
MultipartHttpServletRequest multiReq = multipartResolver.resolveMultipart(request);
returnMap = conventMap(multiReq.getParameterMap());
} else if (MediaType.APPLICATION_JSON_VALUE.equals(contentType) || MediaType.APPLICATION_JSON_UTF8_VALUE.equals(contentType)) {
// json表单
String body = getBodyString(request);
if (StringUtils.isNotBlank(body)) {
try {
returnMap = JSONObject.parseObject(body, Map.class);
} catch (Exception e) {
e.printStackTrace();
}
}
} else {
// 普通表单
returnMap = conventMap(request.getParameterMap());
}
// 参数Map
return returnMap;
}
private static Map conventMap(Map map) {
Map<String, String> returnMap = new HashMap();
// 返回值Map
Iterator entries = map.entrySet().iterator();
Map.Entry entry;
String name = "";
String value = "";
while (entries.hasNext()) {
entry = (Map.Entry) entries.next();
name = (String) entry.getKey();
Object valueObj = entry.getValue();
if (null == valueObj) {
value = "";
} else if (valueObj instanceof String[]) {
String[] values = (String[]) valueObj;
if (values != null && values.length > 0) {
for (int i = 0; i < values.length; i++) {
value = values[i] + ",";
}
value = value.substring(0, value.length() - 1);
}
} else {
value = valueObj.toString();
}
returnMap.put(name, value);
}
return returnMap;
}
/**
* 获取请求Body.
*
* @param request
* @return
*/
public static String getBodyString(final ServletRequest request) {
StringBuilder sb = new StringBuilder();
InputStream inputStream = null;
BufferedReader reader = null;
try {
inputStream = cloneInputStream(request.getInputStream());
reader = new BufferedReader(new InputStreamReader(inputStream, Charset.forName("UTF-8")));
String line = "";
while ((line = reader.readLine()) != null) {
sb.append(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return sb.toString();
}
/**
* 复制输入流.
*
* @param inputStream 读取http请求传入的数据
* @return byteArrayInputStream
*/
public static InputStream cloneInputStream(ServletInputStream inputStream) {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
try {
while ((len = inputStream.read(buffer)) > -1) {
byteArrayOutputStream.write(buffer, 0, len);
}
byteArrayOutputStream.flush();
} catch (IOException e) {
e.printStackTrace();
}
InputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
return byteArrayInputStream;
}
}