이번 내용은 로그인을 하지 않고 진입이 불가한 페이지를 설정하는 과정을 담았다.

 

현재 진행중인 프로젝트에서 로그인을 해야 사용 할 수 있는 기능이 글쓰기 및 내가 쓴 글 보기 이렇게 두가지가 있는데,

비로그인 시 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 페이지 이동 시 정상적으로 페이지 이동이 이루어졌다.

 

 

+ Recent posts