개발 낙서장

[Spring] Filter 예외 처리 본문

Java

[Spring] Filter 예외 처리

권승준 2024. 2. 5. 17:38

DispatcherSurvlet으로 넘어가면 Exception을 컨트롤하면서 예외 처리가 가능하지만 Filter 단에서는 해당 방식의 예외 처리가 불가능하다.

결국 예외를 핸들링하기 위해서는 예외를 처리하는 Filter를 만드는 등 다른 방법을 사용해야 하는데 그 중 HttpSurvletResponse에 예외 내용을 담아서 return해주는 방법이 있다.

    @Override
    protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain filterChain) throws ServletException, IOException {
        String tokenValue = jwtUtil.getJwtFromHeader(req);

        if (StringUtils.hasText(tokenValue)) {
            if (!jwtUtil.validateToken(tokenValue)) {
                log.error("Token Error");
                res.setStatus(400);
                res.setContentType("application/json");
                res.setCharacterEncoding("utf-8");
                res.getWriter().write(
                        new ObjectMapper().writeValueAsString(ResponseMessage.builder()
                                .httpCode(400)
                                .msg("토큰이 유효하지 않습니다.")
                                .data(null).build()
                        )
                );

                return;
            }

            Claims info = jwtUtil.getUserInfoFromToken(tokenValue);

            try {
                setAuthentication(info.getSubject());
            } catch (Exception e) {
                log.error(e.getMessage());
                return;
            }
        }

        filterChain.doFilter(req, res);
    }

JWT 토큰을 검증하고 만료됐을 경우 HttpCode 400과 함께 토큰이 유효하지 않다는 메세지를 클라이언트에게 보내는 코드이다.

  • res.setStatus : HttpCode를 설정한다.
  • res.setContentType : 반환 타입을 설정한다. 나는 ResponseMesage라는 객체에 담아 클라이언트에게 보낼 것이기 때문에 Json으로 설정했다.
  • res.setCharacterEncoding : 반환 값의 인코딩을 설정한다.
  • res.getWriter().write(value) : value에 메세지를 담아 Body로 보낸다. int, String, char[]만 넣어 보낼 수 있다.

write 메소드에 객체를 담아 보낼 수는 없어서 Jackson에서 제공하는 ObjectMapper를 통해 Json으로 직렬화하여 전송했다.
(ObjectMapper를 사용할 경우 IOException을 핸들링해주어야 한다.)

'Java' 카테고리의 다른 글

[Spring] DTO와 Entity  (0) 2024.02.15
데이터베이스(DB, DataBase)  (0) 2024.02.13
[Spring] 쿠키와 세션  (0) 2024.01.25
Jackson  (0) 2024.01.18
Spring MVC  (0) 2024.01.18
Comments