@Before(value = "within(com.github.prontera..*) " + "&& (@annotation(org.springframework.web.bind.annotation.ResponseBody)" + "|| @annotation(org.springframework.web.bind.annotation.RequestMapping))") public void before(JoinPoint joinPoint) { final String requestId = ServletContextHolder.fetchRequestId(); final HttpServletResponse response = ServletContextHolder.getResponse(); if (response.getHeader(RequestAttributeConst.REQUEST_ID) == null) { response.addHeader(RequestAttributeConst.REQUEST_ID, requestId); } }
public static String fetchRequestId() { String requestId = (String) getRequest().getAttribute(RequestAttributeConst.REQUEST_ID); if (requestId == null) { requestId = Optional.ofNullable(getRequest().getHeader(RequestAttributeConst.REQUEST_ID)).orElse("x-" + UUID.randomUUID()); getRequest().setAttribute(RequestAttributeConst.REQUEST_ID, requestId); } return requestId; } }
@Override public void handleError(ClientHttpResponse response) throws IOException { LOGGER.info("request id '{}' error response '{}'", ServletContextHolder.fetchRequestId(), response); } }
/** * 获取错误的字段名, 如果被{@link JsonProperty}修饰则优先选择 * * @see JsonProperty */ private static String acquireFieldName(BindingResult result, FieldError fieldError) { Preconditions.checkNotNull(result); Preconditions.checkNotNull(fieldError); // 获取错误字段名 String errorFieldName = fieldError.getField(); // 获取校验非法的类 Class<?> clazz = result.getTarget().getClass(); final Field field; try { // 获取其字段名 field = clazz.getDeclaredField(fieldError.getField()); final JsonProperty annotation = field.getAnnotation(JsonProperty.class); // 若JsonProperty里value()不为null则覆盖该值 if (annotation != null) { errorFieldName = annotation.value(); } } catch (NoSuchFieldException e) { Throwables.throwIfUnchecked(e); LOGGER.error("request id: {}, 反射字段名时抛出异常: {}", ServletContextHolder.fetchRequestId(), e.getMessage()); } return errorFieldName; }
final String errorMessage = fieldError.getDefaultMessage(); LOGGER.debug("request id: {}, error field: {}, error msg: {}", ServletContextHolder.fetchRequestId(), errorFieldName, errorMessage); errorMap.put(errorFieldName, errorMessage);
/** * 创建通用的日志输出模式并绑定线程 * * @return 日志模型 */ private RequestDetailsLogger generateJsonRequestDetails() { RequestDetailsLogger logDetails = (RequestDetailsLogger) ServletContextHolder.getRequest().getAttribute(RequestAttributeConst.DETAILS_KEY); if (logDetails == null) { logDetails = new RequestDetailsLogger(); ServletContextHolder.getRequest().setAttribute(RequestAttributeConst.DETAILS_KEY, logDetails); } return logDetails; }
@Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { ResettableStreamHttpServletRequest wrapperRequest = new ResettableStreamHttpServletRequest(request); byte[] body = wrapperRequest.getRequestBody(); if (body != null) { ServletContextHolder.getRequest().setAttribute(RequestAttributeConst.REQUEST_BODY_KEY, new String(body, Charsets.UTF_8)); } super.doFilter(wrapperRequest, response, filterChain); }