프로젝트/트러블슈팅

[Spring]Filter 예외처리

코딩로봇 2025. 4. 3. 18:39

intro

  • 프로젝트를 진행하며 발생한 문제 상황과 해결 과정들을 상세히 기록하고 추후에 같은 문제가 발생 했을때 빠르게 문제 해결하기 위해 트러블 슈팅을 정리할려고 한다.
  • 기록하는 습관을 기르기 위해 프로젝트 기간동안 꾸준히 작성할 것 이다.

JPA 를 활용한 TodoList 프로젝트에서 예외처리를 하는 중 Filter 에서 던지는 예외처리를 ErrorResponse 로 안받아진다.

 

⚠️ 1.문제 상황 발생

비밀번호를 잘못 입력해서 예외가 발생하면  Valid를 이용하여 처리가 가능했다.

 

BUT,,

 

 Filter 에서 던져주는 예외처리를 위의 형식으로 처리해주지 못한다.

 

🔎 2.원인 추론

API 가 실행되면 Servlet 을 통해 Controller 로 가기이전 Filter를 이용하여 값을 처리 해준다.

그런데 @ControllAdvice 는 servelet 까지 요청이 넘어온후 그후 요청이 처리되는 Controller 와 같은 과정에서 발생한 예외만 처리 가능하다.

 

그래서 Servlet 이전에 처리하는 Filter 에서 발생한 예외는 처리하지 못한다.

 

 

📝  3.해결방안

필터 내에서 따로 예외를 처리하면 됐다. Http에 보여질 HttpServletResponse 메소드를 이용해 예외를 JSON 형태로 보여준다.

 

  •  HttpServletResponse 메소드
HttpServletRequest httpRequest = (HttpServletRequest) request;
        String requestURI = httpRequest.getRequestURI();

        HttpServletResponse httpResponse = (HttpServletResponse) response;

        if(!isWhiteList(requestURI)){
            HttpSession session = httpRequest.getSession(false);
            if (session == null || session.getAttribute(Const.LOGIN_USER) == null){
                httpResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
                httpResponse.setContentType("application/json");
                httpResponse.setCharacterEncoding("UTF-8");
                httpResponse.getWriter().write("{ message : 로그인 해주세요 }");
                return;
            }
        }

        chain.doFilter(request,response);
    }

 

📌4.결과 확인

 

로그인하지 않고 일정을 생성하면 401Unauthorized 코드와 함께 로그인을 해달라는 메시지를 전달한다.