스프링에서 에러페이지 보여주기

2022. 3. 20. 04:48
반응형

web.xml

    <error-page>
		<error-code>400</error-code>
		<location>/error/error</location>
	</error-page>
	<error-page>
		<error-code>401</error-code>
		<location>/error/error</location>
	</error-page>
	<error-page>
		<error-code>403</error-code>
		<location>/error/error</location>
	</error-page>
	<error-page>
		<error-code>404</error-code>
		<location>/error/error</location>
	</error-page>
	<error-page>
		<error-code>405</error-code>
		<location>/error/error</location>
	</error-page>
	<error-page>
		<error-code>500</error-code>
		<location>/error/error</location>
	</error-page>
	<error-page>
		<error-code>503</error-code>
		<location>/error/error</location>
	</error-page>

</web-app>의 바로 위에 이렇게 넣어주고 Controller를 만들어주면 된다.

에러페이지가 하나 뿐인 것 같다고?

 

Controller

@Controller
@AllArgsConstructor
@Log4j
public class ErrorController {

	@RequestMapping(value = "/error/error", method = RequestMethod.GET)
    public String renderErrorPage(Model model, HttpServletRequest request) {

        String errorMsg = "";
        int httpErrorCode = getErrorCode(request);

        switch (httpErrorCode) {
            case 400: {
                errorMsg = "잘못된 요청입니다.";
                break;
            }
            case 401: {
                errorMsg = "인증에 실패하였습니다.";
                break;
            }
            case 403: {
                errorMsg = "접근 권한이 없습니다.";
                break;
            }
            case 404: {
                errorMsg = "요청하신 페이지를 찾을 수 없습니다.";
                break;
            }
            case 500: {
                errorMsg = "서버 오류입니다.";
                break;
            }
        }
        
		model.addAttribute("error", httpErrorCode);
        model.addAttribute("msg", errorMsg);
        
        log.info("status_code : " + request.getAttribute("javax.servlet.error.status_code"));
        log.info("exception_type : " + request.getAttribute("javax.servlet.error.exception_type"));
        log.info("message : " + request.getAttribute("javax.servlet.error.message"));
        log.info("request_uri : " + request.getAttribute("javax.servlet.error.request_uri"));
        log.info("exception : " + request.getAttribute("javax.servlet.error.exception"));
        log.info("servlet_name : " + request.getAttribute("javax.servlet.error.servlet_name"));
        
        return "/error/error";
    }
    
    private int getErrorCode(HttpServletRequest request) {
        return (Integer) request.getAttribute("javax.servlet.error.status_code");
    }

}

Switch Case 문으로 분기해주면 된다.

※ error message는 null이 뜨는데 그 이유를 아직 잘 모르겠다.


404에러의 경우에는

<init-param>
	<param-name>throwExceptionIfNoHandlerFound</param-name>
	<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>

위와 같이 error-page로 처리해주지 않고 <servlet></servlet> 안에서 처리하기도 한다.

서블릿 컨테이너에서 처리하느냐 아니면 스프링에서 처리하느냐의 차이인 것 같다.

 

스프링부트는 ErrorController를 자체적으로 제공하므로 스프링보단 커스텀하기가 한결 편하다.

이 글은 스프링 레거시를 위한 것이다.


https://goodteacher.tistory.com/413

 

[spring]spring 에서의 error page 설정

error 페이지는 예상치 못했던 클라이언트의 요청에 대해 WAS가 응답하는 결과라고 볼 수 있다. 하지만 WAS가 보여주는 error 페이지는 너무나 흉찍하고 여기서 보여지는 error 정보들을 헤커의 먹이

goodteacher.tistory.com

https://jhgan.tistory.com/13

 

jsp 공통 에러 페이지 처리 (Servlet Exception Handling)

0. 들어가기 전에..  - 해당 내용은 Spring Framework 3.x기반으로 작성  - 모델 2 서블릿도 비슷할 거라 생각은 되지만...  - 바쁘다. 본문만 보자. 1. 공통 에러 페이지 처리 (Servlet Exception Handling) 1..

jhgan.tistory.com

 

반응형

BELATED ARTICLES

more