@Override
  public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException {
    HttpChannel connection = HttpConnection.getCurrentConnection().getHttpChannel();
    connection.getRequest().setHandled(true);

    response.setContentType(MimeTypes.Type.TEXT_PLAIN.asString());

    Map<String, Object> errorMap = new LinkedHashMap<>();
    int code = connection.getResponse().getStatus();
    errorMap.put("status", code);
    String message = connection.getResponse().getReason();
    if (message == null) {
      message = HttpStatus.getMessage(code);
    }
    errorMap.put("message", message);


    Throwable th = (Throwable) request.getAttribute(RequestDispatcher.ERROR_EXCEPTION);
    if (th != null) {
      if (code == org.apache.http.HttpStatus.SC_INTERNAL_SERVER_ERROR) {
        UUID requestId = UUID.randomUUID();
        message = "Internal server error, please refer the exception by " + requestId + " in the server log file";
        errorMap.put("message", message);
        LOG.error(message + ", requestURI: " + request.getRequestURI(), th);
      }

      if (this.isShowStacks()) {
        StringWriter writer = new StringWriter();
        writeErrorPageStacks(request, writer);
        errorMap.put("reason:", writer.toString());
      }
    }

    if ((code == HttpServletResponse.SC_FORBIDDEN) || (code == HttpServletResponse.SC_UNAUTHORIZED)) {
      //if SSO is configured we should provide info about it in case of access error
      JwtAuthenticationProperties jwtProperties = jwtAuthenticationPropertiesProvider.get();
      if ((jwtProperties != null) && jwtProperties.isEnabledForAmbari()) {
        String providerUrl = jwtProperties.getAuthenticationProviderUrl();
        String originalUrl = jwtProperties.getOriginalUrlQueryParam();

        if (StringUtils.isEmpty(providerUrl)) {
          LOG.warn("The SSO provider URL is not available, forwarding to the SSO provider is not possible");
        } else if (StringUtils.isEmpty(originalUrl)) {
          LOG.warn("The original URL parameter name is not available, forwarding to the SSO provider is not possible");
        } else {
          errorMap.put("jwtProviderUrl", String.format("%s?%s=", providerUrl, originalUrl));
        }
      }
    }

    gson.toJson(errorMap, response.getWriter());
  }
Custom error handler for Jetty to return response as JSON instead of stub http page
ambari-server/src/main/java/org/apache/ambari/server/api/AmbariErrorHandler.java