@Override
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
      throws IOException, ServletException {
    boolean clear = false;
    if (!ThreadContext.containsKey("id")) {
      clear = true;
      ThreadContext.put("id", UUID.randomUUID().toString());
      HttpSession session = ((HttpServletRequest) request).getSession(false);
      if (session != null) {
        ThreadContext.put("username", (String) session.getAttribute("username"));
      }
    }

    try {
      chain.doFilter(request, response);
    } finally {
      if (clear) {
        ThreadContext.clearAll();
      }
    }
  }