Java項目使用AOP打印請求參數和響應信息

方便在後臺日志直接看到請求參數等信息,可以快速定位bug原因

@Aspect
@Configuration
@Slf4j
public class LogAspect {
    @Autowired
    private RedisOperate redisOperate;
    @Pointcut("execution(* com.dkdy.goodsserver.controller.*Controller.*(..))")
    public void excudeService() {
    }
    @Around("excudeService()")
    public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
        RequestAttributes ra = RequestContextHolder.getRequestAttributes();
        ServletRequestAttributes sra = (ServletRequestAttributes) ra;
        HttpServletRequest request = sra.getRequest();
        Enumeration<String> headerNames = request.getHeaderNames();
        Map<String, Object> headerMap = new HashMap<> (10);
        do {
            String header = headerNames.nextElement();
            headerMap.put(header, request.getHeader(header));
        } while (headerNames.hasMoreElements());


        String token = request.getParameter("token");
        if (StringUtil.isEmpty(token)) {
            token = request.getHeader("token");
            if (StringUtil.isEmpty(token)) {
                token = RequestUtil.getCookieValue(request, "token");
            }
        }
        long start=System.currentTimeMillis ();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        log.info("***************************start "+sdf.format(start)+" *************************************************");
        Object userObject = null;
        userObject = redisOperate.getByKey("token:" + token);
        String method = request.getMethod();
        String uri = request.getRequestURI();
        String paraString = JSON.toJSONString(request.getParameterMap());
        String current = sdf.format(System.currentTimeMillis());
        log.info("\n" +
                        "請求地址  >>>  {}\n" +
                        "請求方法  >>>  {}\n" +
                        "請求參數  >>>  {}\n" +
                        "請求來源  >>>  {}\n" +
                        "內容類型  >>>  {}\n" +
                        "用戶令牌  >>>  {}\n" +
                        "用戶實例  >>>  {}\n" +
                        "請求頭部  >>>  {}\n",
                request.getRequestURI(),
                request.getMethod(),
                JSONUtil.toJSON(request.getParameterMap()),
                request.getRemoteAddr(),
                request.getContentType(),
                token,
                accountId,
                JSON.toJSONString(headerMap));
//        log.info("請求開始, URI: {}, method: {}, params: {}", uri, method, paraString);
        Object result = pjp.proceed();
        long end=System.currentTimeMillis ();
        log.info("\n"+
                "請求結束"+uri+" "+sdf.format(end)+"耗時 "+(end-start)+"ms"+"\n"+
                 JSON.toJSONString(result,true));
//        log.info("請求結束,controller的返回值是 " + result);
//        log.info("請求結束,controller的返回值是 " + JSON.toJSON (result));
        log.info("***************************end   "+sdf.format(end)+"耗時 "+(end-start)+"ms");
        return result;
    }

}

添加全局攔截器校驗token

@Slf4j
@Component
public class
RequestTokenInterceptor extends HandlerInterceptorAdapter {

    @Autowired
    private RedisOperate redisOperate;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if (URLFilter.handle(request.getRequestURI())) {
            return true;
        }
        Enumeration<String> headerNames = request.getHeaderNames();
        Map<String, Object> headerMap = Maps.newHashMapWithExpectedSize(10);
        do {
            String header = headerNames.nextElement();
            headerMap.put(header, request.getHeader(header));
        } while (headerNames.hasMoreElements());


        String token = request.getParameter("token");
        if (StringUtil.isEmpty(token)) {
            token = request.getHeader("token");
            if (StringUtil.isEmpty(token)) {
                token = RequestUtil.getCookieValue(request, "token");
            }
        }
        Object userObject = null;
        userObject = redisOperate.getByKey("token:" + token);
        Long accountId = null;
        if (userObject != null) {
            accountId = ((CurrentUser) userObject).getAccount_id();
        }

        log.info("\n-=-=-=-=-=-=-=-=-=-=-=-=-=-■GOODS SERVICE■-=-=-=-=-=-=-=-=-=-=-=-=-=-\n" +
                        "請求地址  >>>  {}\n" +
                        "請求方法  >>>  {}\n" +
                        "請求參數  >>>  {}\n" +
                        "請求來源  >>>  {}\n" +
                        "內容類型  >>>  {}\n" +
                        "用戶令牌  >>>  {}\n" +
                        "用戶實例  >>>  {}\n",
                request.getRequestURI(),
                request.getMethod(),
                JSONUtil.toJSON(request.getParameterMap()),
                request.getRemoteAddr(),
                request.getContentType(),
                token,
                accountId
                //JSON.toJSONString(headerMap)
        );
        return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章