이번 내용은 로그인을 하지 않고 진입이 불가한 페이지를 설정하는 과정을 담았다.
현재 진행중인 프로젝트에서 로그인을 해야 사용 할 수 있는 기능이 글쓰기 및 내가 쓴 글 보기 이렇게 두가지가 있는데,
비로그인 시 url로 진입이 가능하여, 로그인되지 않은 상태라면 진입을 막아야했다.
나는 HandlerInterceptor를 적용하였다.
HandlerInterceptor란?
Spring MVC에서 제공하는 인터페이스로, HTTP 요청을 가로채서 추가적인 작업을 수행할 수 있도록 지원하는 기능이다.
해당 페이지로 접근하기 전 로그인 상태인지를 확인하는 로직을 추가하여 로그인 상태가 아니라면 해당 페이지로 진입을 막을 수 있는 기능으로 사용 가능하다.
HandlerInterceptor는 요청과 응답의 처리 흐름 중 특정 시점에서 작업을 수행할 수 있다.
1. preHandler
> 컨트롤러가 실행되기 전에 호출된다
> 요청 데이터를 확인하거나 인증 및 권한을 검증하는 작업에 주로 사용된다
> 반환값이 false라면 요청 처리가 중단되고, 이후의 작업은 실행되지 않는다
예시 : 사용자가 글쓰기 페이지로 접근하려고 할 때, 로그인 여부를 확인한다
2. postHandle
>컨트롤러가 실행된 후, 뷰를 렌더링하기 전에 호출된다
>요청 처리 결과를 기반으로 추가적인 작업(ex데이터 조작)을 수행가능
예시: view에 나타나는 정보를 조정한다
프로필페이지로 이동할 때, 해당 계정의 등급을 통해 프리미엄고객, 베이직고객 등 회원 상태의 맞게 view에 나타낼 수 있다.
3.afterCompletion
>뷰가 렌더링된 후에 호출된다
>리소스 정리, 로깅등 작업 수행
예시 : 게시글 목록 페이지 요청이 완료된 후, 처리 시간을 기록하고 로그를 남길 수 있다.
즉, HandlerInterceptor는 HTTP 요청의 처리 흐름에 개입하여 요청 처리 전, 요청 처리 후, 요천 처리 완료 후 각 단계에서 추가적인 로직을 구현할 수 있는 기능이다.
여기서 나는 로그인 상태가 아니라면 진입이 불가한 페이지를 설정해야하니 preHandler를 이용하였다.
LoginCheckInterceptor Class
//요청이 이루어질 때 검증
public class LoginCheckInterceptor implements HandlerInterceptor{
//preHandle 메소드는 컨트롤러의 요청이 실행되기 전에 호출
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
//현재 세션에 유저코드가 있는지 확인 _ 로그인 상태인지 확인하는 단계
String user = (String) request.getSession().getAttribute("userCode");
//비로그인 시 메인페이지로 이동
if(user == null) {
response.sendRedirect("/");
return false;
}
//로그인 시 이동하려는 페이지로 이동가능
return true;
}
}
HandlerInterceptor 인터페이스를 구현한 클래스이다.
preHandle 메소드를 오버라이드하여, 컨트롤러가 실행되기 전에 요청을 가로채 로그인 여보를 확인하는 로직 추가
String user = (String) request.getSession().getAttribute("userCode");
세션에 유저코드가 담겨있는지 확인 후
//비로그인 시 메인페이지로 이동
if(user == null) {
response.sendRedirect("/");
return false;
}
//로그인 시 이동하려는 페이지로 이동가능
return true;
담겨있지 않다면 메인페이지로 리다이렉트하고, 원래의 요청처리를 중단시킨다(false)
담겨있다면 진입하려는 페이지로 이동할 수 있도록 요청처리를 허용해준다.
이제 해당 기능들의 적용이 될 수 있도록 설정이 필요하다
WebConfig Class
@Configuration
public class WebConfig implements WebMvcConfigurer{
//LoginCheckInterceptor에서 설정한 기능을 글 쓰기, 내가 쓴 글 보기 페이지 접속 시에만 적용
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginCheckInterceptor())
.addPathPatterns("/writePost","/myPost");
}
}
public class WebConfig implements WebMvcConfigurer
WebMvcConfigurer는 Spring MVC의 추가적인 설정을 제공하는 인터페이스다.
이 인터페이스를 구현 후 메소드를 오버라이드하여 MVC 동작을 커스터마이징할 수 있다.
public void addInterceptors(InterceptorRegistry registry)
addInterceptors 메소드는 Spring MVC에 인터셉터를 등록하는 역할을 한다
registry로 인터셉터를 추가, 수정할 수 있다.
registry.addInterceptor(new LoginCheckInterceptor())
새로운 인터셉터 설정을 Spring MVC 요청 처리에 등록한다.
이전에 설명한 LoginCheckInterceptor Class로 요청 흐름에 추가한다.
.addPathPatterns("/writePost","/myPost");
LoginCehckInterceptor로 설정한 기능을 /writePost, /myPost 페이지에만 적용하는 것을 뜻한다.
이외에도 설정 적용 모두 추가 후 일부분만 제외하는 방법도 있지만, 해당 프로젝트에서는 저 2개만 추가하면 되서 간단히 작성하였다.
위 기능들을 적용 후, 비로그인 상태로 /writePost, /myPost 페이지 접속 시 메인페이지로 이동되는 것을 확인하였다.
또한, 로그인 상태로 /writePost, /myPost 페이지 이동 시 정상적으로 페이지 이동이 이루어졌다.
'개인프로젝트 > I'm' 카테고리의 다른 글
Spring 게시글 페이징 기능 (1) | 2025.01.01 |
---|---|
Spring 게시글 작성하기 > DB 게시글 저장 (+MyBatis, CKeditor) (0) | 2024.12.29 |
Spring 회원가입 후 로그인/로그아웃 HttpSession 적용 (0) | 2024.12.27 |
Spring JPA 회원가입 + 비밀번호 암호화 Spring security(+회원 UUID 고유코드 생성)(241229 서버 2차 조건 검증 기능 추가) (0) | 2024.12.24 |
Spring 회원가입 시 인증번호 일치 여부 확인 / redis 사용 (2) | 2024.12.21 |