From e852a35bdcc6e3472309fd216d5c21bd5c24f8a0 Mon Sep 17 00:00:00 2001 From: rex.tan <rex.tan@qq.com> Date: Wed, 28 Oct 2020 09:55:22 +0800 Subject: [PATCH] fix --- src/main/java/cn/timer/api/aspect/RequestAop.java | 217 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 217 insertions(+) create mode 100644 src/main/java/cn/timer/api/aspect/RequestAop.java diff --git a/src/main/java/cn/timer/api/aspect/RequestAop.java b/src/main/java/cn/timer/api/aspect/RequestAop.java new file mode 100644 index 0000000..86da60c --- /dev/null +++ b/src/main/java/cn/timer/api/aspect/RequestAop.java @@ -0,0 +1,217 @@ +package cn.timer.api.aspect; + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; + +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.aspectj.lang.annotation.Pointcut; +import org.springframework.core.annotation.Order; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +import cn.timer.api.config.exception.CustomException; +import cn.timer.api.utils.DateUtil; +import lombok.extern.slf4j.Slf4j; + +/** + * 拦截输出异常堆栈(改用fluentd方式) + * + * @author Rex.Tan + * @date 2018年12月13日 上午9:18:58 + */ +@Slf4j +@Aspect +@Component +@Order(999) +public class RequestAop { + /** + * 排除拦截的url列表 + */ + static final List<String> LOGIN_URL = new ArrayList<String>() { + private static final long serialVersionUID = 1L; + { + // 第三方数据同步接口 + add("/rest/sync/data"); + // 版本检查接口 + add("/rest/base/app/baseVersionUpgrade"); + } + }; + + @Pointcut("execution(* cn.timer..*.*Controller.*(..))") + public void init() { + + } + + @Before("init()") + public void beforeAdvice(JoinPoint joinPoint) { + // 进入方法前拦截 + } + + @Around("init()") + public Object around(ProceedingJoinPoint pjp) { + long startTime = System.currentTimeMillis(); + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + String url = request.getRequestURI(); + + /** + * 输出url + */ + Object obj = null; + String bodyArgs = this.bodyArgs2String(request, pjp.getArgs(), url); + JSONObject urlArgs = this.urlArgs2String(request, request.getParameterNames(), url); + try { + obj = pjp.proceed(); + long endTime = System.currentTimeMillis(); + this.logInfo2Kafka(request, url, bodyArgs, urlArgs, "success", 0, endTime - startTime, true); + } catch (Throwable e) { + e.printStackTrace(); + long endTime = System.currentTimeMillis(); + if (e instanceof CustomException) { + /** + * 拦截到主动抛出的异常 + */ + CustomException ex = (CustomException) e; + this.logInfo2Kafka(request, url, bodyArgs, urlArgs, ex.getMessage(), 400, endTime - startTime, false); + throw ex; + } else { + /** + * 拦截到未知异常 + */ + StringWriter stringWriter = new StringWriter(); + e.printStackTrace(new PrintWriter(stringWriter)); + this.logInfo2Kafka(request, url, bodyArgs, urlArgs, "未捕获异常: " + stringWriter.toString(), 500, endTime - startTime, false); + throw new CustomException("未捕获异常," + e.getMessage()); + } + } finally { + + } + + return obj; + } + + /** + * 请录请求耗时 + * + * @author Rex.Tan + * @date 2018年12月13日 下午2:51:31 + * @param url 请求地址 + * @param args requestBody中的参数 + * @param args2 url中的参数 + * @param message 消息 + * @param status 接口调用返回状态 + * @param executionTime 执行耗时 + * @param isSuccess 是否调用成功 + */ + @Async + public void logInfo2Kafka(HttpServletRequest request, String url, String bodyArgs, JSONObject urlArgs, + String message, Integer status, long executionTime, boolean isSuccess) { + JSONObject json = new JSONObject(); + json.put("logType", "___rest___"); + // if (UserContext.get() != null) { + // json.put("userName", UserContext.get().getUsername()); + // } + json.put("url", url); + json.put("timestamp", System.currentTimeMillis()); + json.put("visitTime", DateUtil.now2String()); + json.put("message", message); + json.put("status", status); + json.put("executionTime", executionTime); + json.put("channel", request.getHeader("channel")); + json.put("projectName", "8timer"); + json.put("requestType", request.getMethod()); + /** + * 1.requestBody中的参数 + */ + json.put("bodyArgs", bodyArgs); + /** + * 2.url中的参数 + */ + json.put("urlArgs", urlArgs); + /** + * 3.如果请求状态不为0, 在控制台输入请求信息 + */ + if (status != 0) { + log.error("\r\n" + json.toJSONString()); + } else { + log.info("\r\n" + json.toJSONString()); + } + } + + /** + * 读取requestBody中的参数 + * + * @author Rex.Tan + * @date 2018年12月13日 下午2:54:31 + * @param bodyArgs + * @param url + * @return + */ + private String bodyArgs2String(HttpServletRequest request, Object[] bodyArgs, String url) { + if ("GET".equals(request.getMethod())) { + return ""; + } + if (url != null && url.matches("upload")) { + return ""; + } + if (url != null && url.matches("image")) { + return ""; + } + try { + if (bodyArgs != null && bodyArgs.length > 0) { + String body = JSONArray.toJSONString(bodyArgs); + if (body.matches("image")) { + return ""; + } + return body; + } + } catch (Exception e) { + log.error("=============序列化requestBody中的参数出错, " + url); + } + return ""; + } + + /** + * 读取url中的参数 + * + * @author Rex.Tan + * @date 2019年9月12日 下午2:54:40 + * @param request + * @param urlArgs + * @param url + * @return + */ + private JSONObject urlArgs2String(HttpServletRequest request, Enumeration<String> urlArgs, String url) { + JSONObject urlArgsJson = new JSONObject(); + try { + if (urlArgs != null) { + while (urlArgs.hasMoreElements()) { + try { + String paraName = (String) urlArgs.nextElement(); + urlArgsJson.put(paraName, request.getParameter(paraName)); + } catch (Exception e) { + log.error("=============记录url中的参数出错", url); + break; + } + } + } + } catch (Exception e) { + log.error("=============记录url中的参数出错, " + url); + } + return urlArgsJson; + } + +} -- libgit2 0.26.0