톰캣 오류처리하기 400
[Tomcat] 톰캣 오류 처리하기 만들기 ErrorReportValve Custom Tomcat Valve
프로그램 자료/Java & Spring 2019. 10. 31. 11:31
출처1 : http://jagadesh4java.blogspot.com/2014/09/custom-error-page-in-tomcat.html
출처2 : https://aspiresoftware.in/blog/catalinatomcat-custom-error-report-valve-to-handle-errors-exceptions/
출처4 : https://server0.tistory.com/39
얼마전에 납품한 솔루션의 웹 보안 리포트를 받았다.
특정 url에서 페이지 없음 오류가 떠야하는데 톰캣 에러가 예쁘게 뜨더라.

대충 이렇게??
좀 찾다보니까 톰캣 8.5.31(?) 이상, 9.0.8(?) 이상, 8.0.52(?) 버전부터는 RFC 7230, RFC 3986에 의해 특수문자를 받지 않는다고 하더라.
이미 톰캣 설정에 relaxedQueryChars를 사용하고 있어서 당당히 [] 문자를 넣었다.
그런데 다음과 같은 url로 접속하면 여전히 톰캣 오류가 뜨는 증상이 있었다.
http://127.0.0.1:8080/[
어떻게 해야하나 고민했었는데 톰캣에서는 Valve라는 것을 자바 클래스로 만들고, 이걸 상속받아서 구현하면 가져다가 쓸 수 있다고 하더라.
package com.motolies.config;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.logging.Logger;
import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.Response;
import org.apache.catalina.valves.ErrorReportValve;
public class CustomErrorReportValve extends ErrorReportValve {
// Create a simple logger
private static final Logger logger = Logger.getLogger(CustomErrorReportValve.class.getName());
@Override
protected void report(Request request, Response response, Throwable t) {
try {
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(response.getOutputStream(), "UTF8"));
out.write("<!DOCTYPE html>");
out.write("<html xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:th=\"http://www.thymeleaf.org\">");
out.write("<head>");
out.write(" <meta charset=\"utf-8\"/>");
out.write(" <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"/>");
out.write(" <meta name=\"description\" content=\"\"/>");
out.write("</head>");
out.write("<body> ");
out.write(" <script type=\"text/javascript\">");
out.write(" alert(\"비정상적인 접근입니다.\");");
out.write(" history.back();");
out.write(" </script>");
out.write("</body>");
out.write("</html>");
out.close();
// Log the error with your favorite logging framework...
logger.severe("Uncaught throwable was thrown: " + t.getMessage());
} catch (IOException e) {
e.printStackTrace();
}
}
}
대충 위와 같은 클래스를 만들고 jar 파일로 만들어야 한다.
jar는 다음과 같이 만들면 된다.

해당 파일을 우클릭해서 Export 클릭.

Export type에 JAR file 선택.

만들어질 위치 선택하고 Finish.
그럼 jar파일이 만들어지는데 이것을 다음의 경로에 복사한다.
..\tomcat\lib
아마 이미 많은 jar파일들이 있을 것이다.
마지막으로 tomcat\conf\server.xml 에서 수정을 좀 해야한다.
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"
errorReportValveClass="com.motolies.config.CustomErrorReportValve">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" />
</Host>
다음과 같이 빨간색 부분을 추가해주고 톰캣을 재시작하면 된다.