-
[김영한 스프링] 39. 로그인 처리2 필터, 인터셉터 - ArgumentResolver 활용Spring/스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 2023. 9. 20. 03:25
ArgumentResolver 활용
HomeController - 추가
@GetMapping("/") public String homeLoginV3ArgumentResolver(@Login Member loginMember, Model model) { // 세션에 회원 데이터가 없으면 home if (loginMember == null) { return "home"; } // 세션이 유지되면 로그인으로 이동 model.addAttribute("member", loginMember); return "loginHome"; }
- homeLoginV3Spring()의 @GetMapping 주석 처리
- 다음에 설명하는 @Login 애노테이션을 만들어야 컴파일 오류가 사라진다.
@Login 애노테이션이 있으면 직접 만든 ArgumentResolver가 동작해서 자동으로 세션에 있는 로그인 회원을 찾아주고, 만약 세션에 없다면 null을 반환하도록 개발해 보자.
@Login 애노테이션 생성
package hello.login.web.argumentresolver; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) public @interface Login { }
main/java/hello/login/web/argumentresolver/Login 생성
@Target(ElementType.PARAMETER) : 파라미터에만 사용
@Retention(RetentionPolicy.RUNTIME) : 리플렉션 등을 활용할 수 있도록 런타임까지 애노테이션 정보가 남아있음
LoginMemberArgumentResolver 생성
main/java/hello/login/web/argumentresolver/LoginMemberArgumentResolver 생성
package hello.login.web.argumentresolver; import hello.login.domain.member.Member; import hello.login.web.SessionConst; import lombok.extern.slf4j.Slf4j; import org.springframework.core.MethodParameter; import org.springframework.web.bind.support.WebDataBinderFactory; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.method.support.ModelAndViewContainer; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; @Slf4j public class LoginMemberArgumentResolver implements HandlerMethodArgumentResolver { @Override public boolean supportsParameter(MethodParameter parameter) { log.info("supportsParameter 실행"); boolean hasLoginAnnotation = parameter.hasParameterAnnotation(Login.class); boolean hasMemberType = Member.class.isAssignableFrom(parameter.getParameterType()); return hasLoginAnnotation && hasMemberType; } @Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { log.info("resolveArgument 실행"); HttpServletRequest request = (HttpServletRequest) webRequest.getNativeRequest(); HttpSession session = request.getSession(false); if (session == null) { return null; } Object member = session.getAttribute(SessionConst.LOGIN_MEMBER); return member; } }
- supportsParameter() : @Login 애노테이션이 있으면서 Member 타입이면 해당 ArgumentResolver가 사용된다.
- resolveArgument() : 컨트롤러 호출 직전에 호출되어서 필요한 파라미터 정보를 생성해 준다. 여기서는 세션에 있는 로그인 회원 정보인 member 객체를 찾아서 반환해 준다. 이후 스프링MVC는 컨트롤러의 메서드를 호출하면서 여기에서 반환된 member 객체를 파라미터에 전달해 준다.
WebMvcConfigurer에 설정 추가
package hello.login; import hello.login.web.argumentresolver.LoginMemberArgumentResolver; import hello.login.web.filter.LogFilter; import hello.login.web.filter.LoginCheckFilter; import hello.login.web.interceptor.LogInterceptor; import hello.login.web.interceptor.LoginCheckInterceptor; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import javax.servlet.Filter; import java.util.List; @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) { resolvers.add(new LoginMemberArgumentResolver()); } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LogInterceptor()) .order(1) .addPathPatterns("/**") .excludePathPatterns("/css/**", "/*.ico", "/error"); registry.addInterceptor(new LoginCheckInterceptor()) .order(2) .addPathPatterns("/**") .excludePathPatterns("/", "/members/add", "/login", "/logout", "/css/**", "/*.ico", "/error"); } // @Bean public FilterRegistrationBean logFilter() { FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<>(); filterRegistrationBean.setFilter(new LogFilter()); filterRegistrationBean.setOrder(1); filterRegistrationBean.addUrlPatterns("/*"); return filterRegistrationBean; } // @Bean public FilterRegistrationBean loginCheckFilter() { FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<>(); filterRegistrationBean.setFilter(new LoginCheckFilter()); filterRegistrationBean.setOrder(2); filterRegistrationBean.addUrlPatterns("/*"); return filterRegistrationBean; } }
앞서 개발한 LoginMemberArgumentResolver를 등록하자.
실행
출처 : https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 인프런 | 강의
웹 애플리케이션 개발에 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. MVC 2편에서는 MVC 1편의 핵심 원리와 구조 위에 실무 웹 개발에 필요한 모든 활용 기술들을 학습할 수 있
www.inflearn.com
'Spring > 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술' 카테고리의 다른 글
[김영한 스프링] 41. 예외 처리와 오류 페이지 - 서블릿 예외 처리 시작 & 오류 화면 제공 (0) 2023.09.21 [김영한 스프링] 40. 예외 처리와 오류 페이지 - 프로젝트 생성 & 세팅 (0) 2023.09.20 [김영한 스프링] 38. 로그인 처리2 필터, 인터셉터 - 스프링 인터셉터 소개 & 요청 로그 & 인증 체크 (0) 2023.09.20 [김영한 스프링] 37. 로그인 처리2 필터, 인터셉터 - 서블릿 필터 소개 & 요청 로그 & 인증 체크 (0) 2023.09.19 [김영한 스프링] 36. 로그인 처리1 쿠키, 세션 - 세션 정보와 타임아웃 설정 (0) 2023.09.18