diff --git a/login/src/main/java/hello/login/WebConfig.java b/login/src/main/java/hello/login/WebConfig.java index efb5d3b7..48086c36 100644 --- a/login/src/main/java/hello/login/WebConfig.java +++ b/login/src/main/java/hello/login/WebConfig.java @@ -1,5 +1,6 @@ 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; @@ -7,14 +8,21 @@ 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 resolvers) { + resolvers.add(new LoginMemberArgumentResolver()); + } + @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LogInterceptor()) diff --git a/login/src/main/java/hello/login/web/HomeController.java b/login/src/main/java/hello/login/web/HomeController.java index c535a419..434d7776 100644 --- a/login/src/main/java/hello/login/web/HomeController.java +++ b/login/src/main/java/hello/login/web/HomeController.java @@ -2,6 +2,7 @@ package hello.login.web; import hello.login.domain.member.Member; import hello.login.domain.member.MemberRepository; +import hello.login.web.argumentresolver.Login; import hello.login.web.session.SessionManager; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -80,7 +81,7 @@ public class HomeController { } // spring - @GetMapping("/") +// @GetMapping("/") public String homeLogin3Spring(@SessionAttribute(name = SessionConst.LOGIN_MEMBER, required = false) Member loginMember, Model model) { @@ -91,4 +92,15 @@ public class HomeController { model.addAttribute("member", loginMember); return "loginHome"; } + + @GetMapping("/") + public String homeLogin3ArgumentResolver(@Login Member loginMember, Model model) { + + if (loginMember == null) { + return "home"; + } + + model.addAttribute("member", loginMember); + return "loginHome"; + } } \ No newline at end of file diff --git a/login/src/main/java/hello/login/web/argumentresolver/Login.java b/login/src/main/java/hello/login/web/argumentresolver/Login.java new file mode 100644 index 00000000..bd12750c --- /dev/null +++ b/login/src/main/java/hello/login/web/argumentresolver/Login.java @@ -0,0 +1,11 @@ +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 { +} diff --git a/login/src/main/java/hello/login/web/argumentresolver/LoginMemberArgumentResolver.java b/login/src/main/java/hello/login/web/argumentresolver/LoginMemberArgumentResolver.java new file mode 100644 index 00000000..f92e2311 --- /dev/null +++ b/login/src/main/java/hello/login/web/argumentresolver/LoginMemberArgumentResolver.java @@ -0,0 +1,38 @@ +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; + } + + return session.getAttribute(SessionConst.LOGIN_MEMBER); + } +}