1. 程式人生 > >spring boot 專案重新搭建----------mvc配置:攔截器

spring boot 專案重新搭建----------mvc配置:攔截器

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前置攔截,後置攔截,最終攔截