순서
0. 변경
1. Interceptor 기본 설정
2. LoginInterceptor.java 구현
3. AdminInterceptor.java 구현
4. 테스트
0. 변경
기존 로그인 url을 쓰는 것은 전혀 문제가 없지만, 인터셉터의 적용 대상을 정확하게 타게팅하기 위해 로그인 url을 약간 수정했습니다.
POST 방식의 로그인 url을 기존 "login"에서 "login.me"로 변경했습니다.
변경 한 곳은 MemberController.java의 @RequestMapping 부분, login.jsp에 있는 <script> 태그 내의 서버에 로그인을 요청하는 곳입니다.
1. Interceptor 기본 설정
Interceptor를 사용하기 위해서 전체적으로 두 가지의 작업이 필요합니다.
첫 번째, spring-web 라이브러리를 pom.xml에 추가합니다.
두 번째, 적용할 Interceptor 클래스(class)를 작성하고, 이를 적용하기 위해 servlet-context.xml 에 적용시킬 경로와 적용할 클래스를 설정합니다.
1.1 spring-mvc 라이브러리 추가
spring-web 라이브러리를 추가해줍니다.
하지만 이미 spring-web 라이브러리를 포함하고 있는 spring-webmvc 추가해놓았기 때문에 따로 추가할 필요는 없습니다.
1.2 Interceptor 클래스 작성
Interceptor 클래스를 따로 관리하기 위해서 com.swan.interceptor 패키지를 새로 만들었습니다.
새로 만든 패키지에 LoginInterceptor.java, AdminInterceptor.java 클래스를 생성합니다.
1.3 servlet-context.xml 설정
적용할 대상은 "/admin"경로가 붙는 모든 url, 로그인을 수행하는 "login.me" url입니다.
따라서 servlet-context.xml에 해당 url에 적용되도록 코드를 추가합니다.
추가적으로 생성한 Interceptor 클래스가 Spring에서 인식하여 적용이 될 수 있도록 bean 코드도 추가해줍니다.
<!-- 인터셉터 적용 -->
<interceptors>
<interceptor>
<mapping path="/member/login.me"></mapping>
<beans:bean id="loginIntreceptor"
class="com.swan.interceptor.LoginInterceptor"></beans:bean>
</interceptor>
<interceptor>
<mapping path="/admin/**"></mapping>
<beans:bean id="AdminIntreceptor"
class="com.swan.interceptor.AdminInterceptor"></beans:bean>
</interceptor>
2. LoginInterceptor.java 구현
일어날 확률은 매우 낮지만 이전 작업 중 세션이 완전히 제거되지 않아 로그인을 위해 새로운 세션을 저장할 때 발생할 수 있는 에러를 방지하기 위해서 로그인 메서드가 있는 MemberController.java에 진입하기 전 세션을 제거하는 작업을 했습니다.
먼저 해당 클래스를 Interceptor로 사용하기 위해서 클래스 선언부에 HandlerInterceptor 상속을 선언합니다.
implements HandlerInterceptor
하고자 하는 작업은 controller에 진입하기 전에 작업을 원하기 때문에 preHandle() 메서드를 오버 라이딩합니다.
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return true;
}
preHandle() 메서드 구현부에 세션을 제거해주는 코드를 추가합니다.
preHandle이 정상적으로 작동했는지 확인하기 위해서 System.out.println() 메서드를 호출했습니다.
System.out.println() 메서드는 정상적으로 실행이 되는지 확인 후 주석 처리하거나 삭제합니다.
System.out.println("LoginInterceptor preHandle 작동");
HttpSession session = request.getSession();
session.invalidate();
3. AdminInterceptor.java 구현
관리자 메서드("/admin/**")에 접근하는 사용자의 admin_ck가 1인지 확인하는 작업이 핵심입니다.
따라서 "member"의 session정보를 MemberVO타입의 변수에 담은 후, 해당 변수를 통해 admin_ck의 값을 호출하여 비교하는 로직을 작성해주어야 합니다.
LoginInterceptor.java와 동일하게 HandlerInterceptor 클래스를 상속시키고 preHandle() 메서드를 오버 라이딩합니다.
먼저 "member"의 session을 호출하여 MemberVO타입의 lvo 변수에 저장합니다. ( MemberVO 타입으로 형 변환(Casting) 해주어야 합니다.)
HttpSession session = request.getSession();
MemberVO lvo = (MemberVO)session.getAttribute("member");
if문을 통해서 lvo가 null이거나 getAdmin_ck() 메서드 반환 값이 0이면 swan 페이지로 리다이렉트 되도록 코드를 추가 후 false를 반환하도록 로직을 작성합니다.
아닐 경우 AdminController.java 에 접근할 수 있도록 true를 반환하도록 작성합니다.
if(lvo == null || lvo.getAdmin_ck() == 0) { // 관리자 계정 아닌 경우
response.sendRedirect("/swan"); // 메인페이지로 리다이렉트
return false;
}
return true; // 관리자 계정 로그인 경우(lvo != null && lvo.getAdmin_ck() == 1)
4. 테스트
4.1 LoginInterceptor 테스트
로그인을 진행하여 console창에 문구가 뜨는지를 통해 테스트를 합니다.
4.2 AdminInterceptor 테스트
로그인하지 않은 상태에서 url("/admin/admin") 접근을 해봅니다.
결과는 메인 페이지로 들어가집니다.
일반 계정으로 로그인한 상태에서 위와 동일하게 url을 통해서 접근합니다.
위와 동일하게 관리자 페이지 이동이 되지 않고 메인 페이지로 이동합니다.
'😎 STS3 Spring 쇼핑몰' 카테고리의 다른 글
STS3 쇼핑몰 프로젝트[17] 상품 등록 - 등록 기본 구현 (0) | 2022.08.03 |
---|---|
STS3 쇼핑몰 프로젝트[16] 상품 등록 테이블 생성 (0) | 2022.08.03 |
STS3 쇼핑몰 프로젝트[14] 마이페이지 비밀번호 변경, 회원 탈퇴 (0) | 2022.08.02 |
STS3 쇼핑몰 프로젝트[13] 마이페이지 내 정보 보기, 내 정보 수정 (0) | 2022.08.02 |
STS3 쇼핑몰 프로젝트[12] 암호화된 비밀번호 찾기/임시 비밀번호 생성 (0) | 2022.08.02 |