/admin이 붙은 Url을 맵핑할 때 Controller로 접근하기전 AdminInterceptor를 통해서 MemberType이 "ADMIN"인 아이디만 접근 가능하게 하려고 하였으나 "ADMIN"인데도 불구하고 if문을 타는 현상이 발생했다.
디버깅을 통해서 확인을 해보았을때에도 문제가 없다고 생각하였으나 긴 시간 끝에 해결하였다.
원인은 MemberType을 Enum으로 관리를 하였는데 여기서 Enum은 불변 객체이기 때문에 문자열"ADMIN"과 비교했을 때에는 False가 반환될 수 밖에 없는 상황이었다.
[원인]
Enum 타입과 일반 문자열 간에 equals 비교 결과가 false가 나오는 이유는 Enum 타입과 String 타입은 완전히 다른 타입이기 때문이다.
Enum 타입은 자바에서 열거형 타입을 표현하는 특별한 클래스이고, 이 클래스는 내부적으로 정해진 상수 값들을 갖는다. 반면, 일반 문자열은 단순한 String 객체입니다. equals 메서드는 두 객체의 타입과 내용을 비교하기 때문에, 서로 다른 타입을 비교하면 false를 반환한다.
[기존]
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession(false);
// session이 null인지 먼저 확인
if (session == null) {
log.info(">>>>>>>>>> Session is null");
response.sendRedirect("/errorAccess");
return false;
}
Object member = session.getAttribute("memberType");
// member 값이 "ADMIN"이 아닌 경우 처리
if (!("ADMIN".equals(member))) {
log.info(">>>>>>>>>> Session memberType: {}", member);
response.sendRedirect("/errorAccess");
return false;
} // 미치겠네 진짜 admin 인데 왜자꾸 이 조건문을 타는거냐고~~~~!!!!!! null은 아닌데 확실히./
return true;
}
[해결]
MemberType member = (MemberType) session.getAttribute("memberType");
// member 값이 "ADMIN"이 아닌 경우 처리
if (!(MemberType.ADMIN.equals(member))) {
log.info(">>>>>>>>>> Session memberType: {}", member);
response.sendRedirect("/errorAccess");
return false;
}
return true;
}
'토이 프로젝트 2' 카테고리의 다른 글
| 로그인 횟수 제한 구현 (0) | 2024.12.28 |
|---|---|
| 비밀번호 찾기 구현 (1) | 2024.12.27 |
| Interceptor(권한) 구현 (1) | 2024.12.26 |
| 커스텀 어노테이션 추가, ExceptionHandler 추가 (0) | 2024.12.25 |
| 회원가입시 비밀번호 암호화(bCrypto) (0) | 2024.12.24 |