spring boot 專案重新搭建----------mvc配置:攔截器
阿新 • • 發佈:2018-11-26
6.addInterceptors新增攔截器
registry.addInterceptor(BeanKit.getOfType(DebugInterceptor.class));
實現debug攔截器
@Slf4j @Aspect @Component public class DebugInterceptor extends HandlerInterceptorAdapter { private ThreadLocal<Long> startTime = ThreadLocal.withInitial(System::nanoTime); private ThreadLocal<Signature> signature = ThreadLocal.withInitial(() -> null); private ThreadLocal<Object[]> paramsCache = ThreadLocal.withInitial(() -> null); private ThreadLocal<Object> resultCache = ThreadLocal.withInitial(() -> null); @Pointcut("execution(public * zool.firefly.controller.*.*(..))") public void resultAop() {} @Around("resultAop()") @SneakyThrows public Object resultAround(ProceedingJoinPoint pjp) { val result = pjp.proceed(); resultCache.set(result); return result; } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { startTime.set(System.nanoTime()); paramsCache.set(new Object[]{request.getParameterMap()}); return true; } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { StringBuilder str = new StringBuilder(); str.append("\n===================== DebugInterceptor ====================="); str.append("\nRemote IP : ").append(WebKit.getClientIP()); str.append("\nRequest Method : ").append(request.getMethod()); str.append("\nRequest URL : ") .append(request.getRequestURI()) .append(StringUtils.isEmpty(request.getQueryString()) ? "" : "?" + request.getQueryString()); str.append("\nAction Signature : ").append(Optional.ofNullable(signature.get()).map(Object::toString).orElse("Empty")); str.append("\nRequest Params : "); Object[] param = paramsCache.get(); if (param != null && param.length == 1 && param[0] instanceof Map) { str.append(JSON.toJSONString(param[0])); } else { Object[] params = Optional.ofNullable(paramsCache.get()).orElse(new Object[]{}); for (int i = 0; i < params.length; i++) { Object obj = params[i]; // 需要保證類直接繼承Object 並且沒有實現任何介面 才能用JSON序列化 boolean isPlanObject = Optional .ofNullable(obj) .map(o -> o.getClass().getSuperclass().equals(Object.class) && !o.getClass().isArray() && o.getClass().getInterfaces().length == 0).orElse(true); str.append(i == 0 ? "[" : "\n [") .append(i) .append("] => ") .append(isPlanObject ? JSON.toJSONString(obj) : String.valueOf(obj)); } } str.append("\nResponse Status : ").append(response.getStatus()); //TODO 新增返回結果 str.append("\nHandle Time : ").append(TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime.get())).append("ms"); str.append("\n============================================================"); log.info(str.toString()); signature.remove(); paramsCache.remove(); resultCache.remove(); } }
訪問時的效果:
自定義攔截器繼承HandlerInterceptorAdapter實現
preHandle,postHandle,afterCompletion前置攔截,後置攔截,最終攔截