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";
+ }
+ }
+}