Error zip
[Spring] JWT Filter 구현 중 NullPointerException 발생
JANNNNNN
2024. 6. 28. 12:32
에러
nio-8000-exec-4] o.a.c.c.C.[Tomcat].[localhost] : Exception Processing ErrorPage[errorCode=0, location=/error]
java.lang.NullPointerException: null
상황
JWT에서 필터 구현 테스트 중 갑자기 회원가입, 로그인 기능에서 계속 NullpointerException이 발생함..
근데 알아보니 Filter에서 문제가 발생했던 것이었다
해결책
- 원래 기존 MyFilter3
public class MyFilter3 implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse res = (HttpServletResponse) servletResponse;
//로그 추가
System.out.println("filter3 ====");
// 만약, token을 검증하여, Controller에 접근 여부 설정!
if (req.getMethod().equals("POST")) {
String auth_header = req.getHeader("Authorization");
if (auth_header.equals("secret")) { // 여기서 auth_header가 null이면 NullPointerException이 발생
filterChain.doFilter(req, res);
} else {
PrintWriter writer = res.getWriter();
writer.println("인증 안됨");
}
} else {
filterChain.doFilter(servletRequest, servletResponse);
}
}
}
MyFilter3에서 NullPointerException이 발생했던 이유는 req.getHeader("Authorization")의 반환 값이 null일 때 auth_header.equals("secret")를 호출하기 때문입니다!
null 객체에서 메서드를 호출하려고 하면 NullPointerException이 발생합니다.
그래서 해결 방안을 찾아 코드를 다시 수정했습니다.
- Authorization 헤더가 null인지 확인: auth_header가 null인지 확인하고, null일 경우 적절히 처리합니다.
- null 안전 코드 작성: null을 안전하게 처리하기 위해 조건문을 추가합니다
- 수정된 Filter3
public class MyFilter3 implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse res = (HttpServletResponse) servletResponse;
// 로그 추가
System.out.println("Filter 3: Request received");
if (req.getMethod().equals("POST")) {
String auth_header = req.getHeader("Authorization");
// 헤더가 null인지 확인
if (auth_header != null && auth_header.equals("secret")) {
filterChain.doFilter(req, res);
} else {
res.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
PrintWriter writer = res.getWriter();
writer.println("인증 안됨");
}
} else {
filterChain.doFilter(servletRequest, servletResponse);
}
}
}
- null 확인 추가: auth_header가 null인지 확인하여 null일 경우 예외가 발생하지 않도록 조건문을 수정했습니다.
- 안전한 코드 작성: null일 경우 적절한 응답을 반환하도록 수정했습니다.
해결완료🫠
정상적으로 join 함수가 실행됨!!
오늘의 교훈
Authorization 헤더가 존재하지 않을 때를 고려해 필터를 구현해야겠다 ~