diff --git a/WebContent/WEB-INF/web.xml b/WebContent/WEB-INF/web.xml index c6a0fb80..00c1a79a 100644 --- a/WebContent/WEB-INF/web.xml +++ b/WebContent/WEB-INF/web.xml @@ -5,17 +5,29 @@ index.html + + 400 + /error/json + + + 403 + /error/json + 404 - /error/404error.html + /error/json + + + 416 + /error/json 500 - /error/error.html + /error/json java.lang.Throwable - /error/error.html + /error/json @@ -574,6 +586,15 @@ --> + + + JsonErrorServlet + prerna.web.conf.JsonErrorServlet + + + JsonErrorServlet + /error/json + MainApplication diff --git a/src/prerna/web/conf/JsonErrorServlet.java b/src/prerna/web/conf/JsonErrorServlet.java new file mode 100644 index 00000000..b61fcbe1 --- /dev/null +++ b/src/prerna/web/conf/JsonErrorServlet.java @@ -0,0 +1,60 @@ +package prerna.web.conf; + +import java.io.IOException; + +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.google.gson.Gson; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * Servlet that handles Tomcat error pages and returns JSON responses + * instead of the default HTML error pages. + */ +public class JsonErrorServlet extends HttpServlet { + + private static final long serialVersionUID = 1L; + private static final Gson GSON = new Gson(); + + @Override + protected void service(HttpServletRequest request, HttpServletResponse response) throws IOException { + // Tomcat sets these request attributes when forwarding to error pages + Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code"); + String message = (String) request.getAttribute("javax.servlet.error.message"); + String requestUri = (String) request.getAttribute("javax.servlet.error.request_uri"); + + if (statusCode == null) { + statusCode = HttpServletResponse.SC_INTERNAL_SERVER_ERROR; + } + if (message == null || message.isEmpty()) { + message = getDefaultMessage(statusCode); + } + + Map errorBody = new LinkedHashMap<>(); + errorBody.put("status", statusCode); + errorBody.put("message", message); + if (requestUri != null) { + errorBody.put("request_uri", requestUri); + } + + response.setStatus(statusCode); + response.setContentType("application/json"); + response.setCharacterEncoding("UTF-8"); + response.getWriter().write(GSON.toJson(errorBody)); + } + + private static String getDefaultMessage(int statusCode) { + switch (statusCode) { + case 400: return "Bad Request"; + case 403: return "Forbidden"; + case 404: return "Not Found"; + case 416: return "Requested Range Not Satisfiable"; + case 500: return "Internal Server Error"; + default: return "Error"; + } + } +}