원본 본문으로 이동하기

Spring boot 에서 세션 체크 커스텀 어노테이션 만들기

쿠우 - 기존 Spring 이랑 비슷비슷합니다. 원하는 어노테이션을 만듭니다. 저같은 경우 CheckAuth라는 어노테이션을 만들었습니다. package code.web.annotations; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface CheckAuth { boolean value() default false; int level() default 1; } value는 세션 로그인 여부 level은 최소 레벨 여부입니다. 없어도 됩니다. 이제 Interceptor 클래스를 만들어줍니다. package code.web.interceptors; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import code.web.annotations.CheckAuth; import code.web.models.Account; public class AuthInterceptor implements HandlerInterceptor{ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // TODO Auto-generated method stub HandlerMethod method = (HandlerMethod)handler; CheckAuth auth = method.getMethodAnnotation(CheckAuth.class); //어노테이션이 없거나 있는데 value를 false로 준경우. if(auth == null || auth.value() == false){ return true; } // 세션체크 HttpSession session = request.getSession(); //로그인시 Account 객체가 세션에 담겨있습니다. Account account = (Account)session.getAttribute("account"); // 로그인 체크 & 레벨 체크 if(account == null || auth.level() > account.getLevel()){ return false; } return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // TODO Auto-generated method stub } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // TODO Auto-generated method stub } } HandlerInterceptor는 preHandle , postHandle, afterCompletion이 있습니다. 보면 알듯이 preHandle -> request 처리 -> postHandle -> 랜더링 -> afterCompletion 인듯합니다 ( 자세한 사항은 http://docs.spring.io/autorepo/docs/spring/3.2.4.RELEASE/javadoc-api/org/springframework/web/servlet/HandlerInterceptor.html ) 를 참조하시길.. preHandler에서 false를 반환시키면 request 처리로 넘어 가지 않습니다. 이때 만든 Interceptor를 Spring Boot에 인식할수 있도록 알려줘야 하는데 따로 xml 은 없고 Configuration 클래스를 만들어서 알려주도록 합니다 package code.web; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import code.web.interceptors.AuthInterceptor; @Configuration @ComponentScan("code.web") @EnableWebMvc public class WebConfig extends WebMvcConfigurerAdapter { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor((HandlerInterceptor)new AuthInterceptor()); } } - 서블릿 HTTP 스프링 자바