'로그인 된 사용자만 이 페이지를 볼 수 있게 해야할텐데..?'
라고 생각하면서 어떻게 구현해야할지 모르겠다면,
스프링에서 제공해주는 Interceptor라는 인터페이스를 사용하면 된다.
먼저, Interceptor 인터페이스를 사용하지 않았을 때의 일반적인 코드를 보자
@GetMapping
public String changePwdForm(HttpSession session) {
if(session.getAttribute("loginInfo") == null) {
return "redirect:/login";
}
return "edit/changePwdForm";
}
해당 코드는 비밀번호 변경 요청 매핑 코드임
비밀번호 변경이라는게 상식적으로 무조건 로그인을 했을 때만 들어와야함
그래서 일반적으로는, if문으로 세션에 값이 있는지 확인을 거쳐야하는 코드를 저렇게 매핑부분에 작성을 해주는데...
아니 로그인을 한 사용자에게만 보여줘야 하는 뷰가 많다면 저렇게 일일이 작성한다는게 굉장히 번거로움,,
이러한 불편함을 극복하기 위해 스프링의 Interceptor를 사용할 필요가 있음
인터셉터를 사용하기 위해선 먼저 HandlerInterceptor 라는 인터페이스를 구현해야함
그리고 해당 인터페이스의 메소드는 preHandle, postHandle, afterCompletion 등 3가지가 있는디
preHandle(): 컨트롤러를 실행하기 전에 해당 컨트롤러를 실행할지 안할지 판단
postHandle(): 컨트롤러가 정상적으로 실행된 이후에 추가기능을 구현할 때 사용 (ex - Service 및 DAO 단을 거친 후에 값 확인을 통한 디버깅 기능 추가)
afterCompletion(): 뷰가 클라이언트에 응답을 전송한 뒤 실행 (ex - 컨트롤러의 모든 실행이 끝나고 실행시간을 기록하는 등과 같은 기능 추가)
이 3가지 중에서 목적에 가장 알맞는 preHandle() 메소드를 구현하면 됨
package interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.HandlerInterceptor;
public class AuthCheckInterceptor implements HandlerInterceptor {
@Override // 컨트롤러 실행 전
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
HttpSession session = request.getSession(false);
if(session != null) {
Object loginInfo = session.getAttribute("loginInfo");
if(authInfo != null) {
return true;
}
}
response.sendRedirect(request.getContextPath() + "/login");
return false;
}
}
다음과 같이 Interceptor 구현 클래스를 만들고 preHandle() 메소드를 구현했음
preHandle()은 보다시피 boolean 값을 리턴하고, True 값이면 해당 컨트롤러를 실행 or False 값이면 컨트롤러 미실행
보다시피 세션 객체에 로그인 정보가 있는지 없는지 확인하고 있으면 True를 리턴,
세션 객체가 null이면 로그인 페이지로 다시 Redriect 하고 False를 리턴한다.
이렇게 기능을 구현하는 클래스를 작성해주었으면
@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authCheckInterceptor()).addPathPatterns("/edit/**");
}
@Bean
public AuthCheckInterceptor authCheckInterceptor() {
return new AuthCheckInterceptor();
}
스프링 설정 파일에서 해당 Interceptor를 빈으로 등록해주고, WebMvcConfigurer 인터페이스의 addInterceptors() 메소드를 이용하여 자신이 구현한 인터셉터를 등록해주고 해당 결과에 다시 메소드 체인을 걸어서,
addPathPatterns() 메소드를 이용하여 인터셉터를 적용시킬 파일 경로를 등록해주면 됨
※ 이 포스트에서 스프링 설정은 JavaConfig 방식을 이용함
'웹개발 > Java, Spring' 카테고리의 다른 글
[Spring Boot] 스프링 부트 JWT 인증 방식 구현 (0) | 2024.03.04 |
---|---|
[Spring] PropertyPlaceholderConfigurer 클래스를 이용한 프로필 설정 파일 불러오기 (0) | 2023.08.20 |
[Java] 웹 내 TIF 이미지 → JPG 이미지로 변환하여 출력하는 방법 (0) | 2023.07.30 |
[Spring] ResponseEntity를 이용한 HTTP 통신 (0) | 2023.07.16 |
[Spring] 스프링에서 제공하는 객체 검증 기능을 이용하여 회원가입 기능 검증하기 (0) | 2023.06.17 |