11package life .mosu .mosuserver .global .filter ;
22
3+ import com .fasterxml .jackson .databind .ObjectMapper ;
4+ import io .jsonwebtoken .ExpiredJwtException ;
35import jakarta .servlet .FilterChain ;
46import jakarta .servlet .ServletException ;
57import jakarta .servlet .http .HttpServletRequest ;
68import jakarta .servlet .http .HttpServletResponse ;
79import java .io .IOException ;
810import life .mosu .mosuserver .global .exception .CustomRuntimeException ;
11+ import life .mosu .mosuserver .global .exception .ErrorResponse ;
912import lombok .RequiredArgsConstructor ;
13+ import org .springframework .http .HttpStatus ;
14+ import org .springframework .http .MediaType ;
1015import org .springframework .stereotype .Component ;
1116import org .springframework .web .filter .OncePerRequestFilter ;
1217
1318@ Component
1419@ RequiredArgsConstructor
1520public class TokenExceptionFilter extends OncePerRequestFilter {
1621
22+ private final ObjectMapper objectMapper ;
23+
1724 @ Override
1825 protected void doFilterInternal (
1926 final HttpServletRequest request ,
@@ -22,11 +29,43 @@ protected void doFilterInternal(
2229 ) throws ServletException , IOException {
2330 try {
2431 filterChain .doFilter (request , response );
25- } catch (CustomRuntimeException exception ) {
26- response .setStatus (HttpServletResponse .SC_UNAUTHORIZED );
27- response .setContentType ("application/json" );
32+ } catch (CustomRuntimeException ex ) {
33+
34+ ErrorResponse errorResponse = ErrorResponse .builder ()
35+ .status (ex .getStatus ().value ())
36+ .message (ex .getMessage ())
37+ .code (ex .getCode ())
38+ .build ();
39+
40+ response .setStatus (HttpStatus .UNAUTHORIZED .value ());
41+ response .setContentType (MediaType .APPLICATION_JSON_VALUE );
42+ response .setCharacterEncoding ("UTF-8" );
43+
44+ objectMapper .writeValue (response .getWriter (), errorResponse );
45+ } catch (ExpiredJwtException ex ) {
46+ ErrorResponse errorResponse = ErrorResponse .builder ()
47+ .status (HttpStatus .NOT_ACCEPTABLE .value ())
48+ .message ("토큰이 만료되었습니다." )
49+ .code ("TOKEN_EXPIRED" )
50+ .build ();
51+
52+ response .setStatus (HttpStatus .NOT_ACCEPTABLE .value ());
53+ response .setContentType (MediaType .APPLICATION_JSON_VALUE );
2854 response .setCharacterEncoding ("UTF-8" );
29- response .sendError (exception .getStatus ().value (), exception .getMessage ());
55+
56+ objectMapper .writeValue (response .getWriter (), errorResponse );
57+ } catch (Exception ex ) {
58+ ErrorResponse errorResponse = ErrorResponse .builder ()
59+ .status (HttpStatus .INTERNAL_SERVER_ERROR .value ())
60+ .message ("서버 오류가 발생했습니다." )
61+ .code ("INTERNAL_SERVER_ERROR" )
62+ .build ();
63+
64+ response .setStatus (HttpStatus .INTERNAL_SERVER_ERROR .value ());
65+ response .setContentType (MediaType .APPLICATION_JSON_VALUE );
66+ response .setCharacterEncoding ("UTF-8" );
67+
68+ objectMapper .writeValue (response .getWriter (), errorResponse );
3069 }
3170 }
3271}
0 commit comments