낭만 프로그래머

Tomcat 9 에서 에러(ERROR) 페이지 설정 본문

Java/Tomcat

Tomcat 9 에서 에러(ERROR) 페이지 설정

조영래 2022. 6. 30. 10:17

Tomcat 에서 에러 페이지 설정하는 방법은 일반적으로 web.xml 을 수정해야 함. 하지만 모든 경우에 적용되는 것이 아니라고 하여 server.xml 을 수정하면 된다고 하니 적용해 보자

방법 1. {Tomcat설치폴더}/conf/server.xml 에 적용
* 주의 : jsp 파일을 사용할 수 없으며 html 파일을 사용해야 함

...
<Host name="localhost"  appBase="webapps"
    unpackWARs="true" autoDeploy="true">

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
       prefix="localhost_access_log" suffix=".txt"
       pattern="%h %l %u %t &quot;%r&quot; %s %b" />
       
<!-- 에러페이지 처리 방식 추가 -->
<Valve className="org.apache.catalina.valves.ErrorReportValve" 
       showReport="false" 
       showServerInfo="false" 
       errorCode.0="C:\servers\apache-tomcat-9.0.36\webapps\ROOT\error.html"/>
<!--     -->

</Host>
...


방법 2. Custom으로 {Tomcat설치폴더}/conf/server.xml 에 적용
* JSP파일을 사용할 수 있음
    a. ErrorReportValue를 상속 받은 CustomErrorReportValue 생성

package com.ariulsoft.tomcat.config;

import javax.servlet.RequestDispatcher;

import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.Response;
import org.apache.catalina.valves.ErrorReportValve;

public class CustomErrorReportValve extends ErrorReportValve {
    private String errorPagePath = "./error.jsp";

    public void setErrorPagePath(String errorPagePath) {
        this.errorPagePath = errorPagePath;
    }

    @Override
    protected void report(Request request, Response response, Throwable throwable) {
        int statusCode = response.getStatus();
        if (statusCode >= 400) {
            try{
                RequestDispatcher dispatcher = request.getRequestDispatcher(errorPagePath);
                dispatcher.forward(request, response);
            }
            catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

}

    b. jar 파일 생성하여 {Tomcat설치폴더}/lib 폴더에 복사

    c. {Tomcat설치폴더}/conf/server.xml 파일 수정
      - errorReportValveClass="com.ariulsoft.tomcat.config.CustomErrorReportValve" 추가

...
<Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true"
            errorReportValveClass="com.ariulsoft.tomcat.config.CustomErrorReportValve">
	...
	<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
       		prefix="localhost_access_log" suffix=".txt"
       		pattern="%h %l %u %t &quot;%r&quot; %s %b" />
	...       
</Host>
...



방법 3. {Application 패스}/WEB-INF/web.xml 에 적용

...
<error-page>
	<error-code>404</error-code>
	<location>/404.jsp</location>
</error-page>
<error-page>
	<error-code>500</error-code>
	<location>/500.jsp</location>
</error-page>
<error-page>
	<exception-type>java.lang.Throwable</exception-type>
	<location>/error.jsp</location>
</error-page>
...


* JSP 에러페이지에서 항상 200을 전달해야 할 경우 아래 내용을 추가

..
<%
    response.setStatus(HttpServletResponse.SC_OK);
%>
..


<참고> 테스트 해본 결과 방법1(또는 방법2) 과 방법3을 동시에 적용하였을 경우 방법3이 우선순위를 가진다.