@GetMapping("/")
public String index(Model model, HttpSession httpSession) {
SessionUser user = (SessionUser) httpSession.getAttribute("user");
if(user != null) {
model.addAttribute("loginUserName", user.getName());
}
return "index";
}
SessionUser user = (SessionUser) httpSession.getAttribute("user");
에 대한 부분을 메소드 인자로 세션값을 바로 받을 수 있도록 변경
LoginUser
package com.dolzi.config.auth;
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 LoginUser {
}
- @Target(ElementType.PARAMETER)
- 이 어노테이션이 생성될 수 있는 위치 지정
- PARAMETER로 지정했으니 메소드의 파라미터로 선언된 객체에만 사용
- @interface
- 이 파일을 어노테이션 클래스로 지정
- LoginUser라는 이름을 가진 어노테이션이 생성
LoginUserArgumentResolver
package com.dolzi.config.auth;
import com.dolzi.config.auth.dto.SessionUser;
import javax.servlet.http.HttpSession;
import lombok.RequiredArgsConstructor;
import org.springframework.core.MethodParameter;
import org.springframework.stereotype.Component;
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;
@RequiredArgsConstructor
@Component
public class LoginUserArgumentResolver implements HandlerMethodArgumentResolver {
private final HttpSession httpSession;
@Override
public boolean supportsParameter(MethodParameter parameter) {
boolean isLoginUserAnnotation = parameter.getParameterAnnotation(LoginUser.class) != null;
boolean isUserClass = SessionUser.class.equals(parameter.getParameterType());
return isLoginUserAnnotation && isUserClass;
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
return httpSession.getAttribute("user");
}
}
- HandlerMethodArgumentResolver
- 조건에 맞는 경우 메소드가 있다면 HandlerMethodArgumentResolver의 구현체가 지정한 값으로 해당 메소드의 파라미터로 넘길 수 있음
- supportsParameter()
- 컨트롤러 메서드의 특정 파라미터를 지원하는지 판단
- @LoginUser 어노테이션이 붙어있고, 파라미터 클래스 타입이 SessionUser.class인 경우 true 반환
- resolveArgument()
- 파라미터에 전달할 객체 생성
WebConfig
package com.dolzi.config;
import com.dolzi.config.auth.LoginUserArgumentResolver;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@RequiredArgsConstructor
@Configuration
public class WebConfig implements WebMvcConfigurer {
private final LoginUserArgumentResolver loginUserArgumentResolver;
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(loginUserArgumentResolver);
}
}
- WebMvcConfigurer
- 스프링에서 인식될 수 있도록 설정
패키지 구조
결과
public String index(Model model, @LoginUser SessionUser user) {
if(user != null) {
model.addAttribute("loginUserName", user.getName());
}
return "index";
}
참고
- 책 - 스프링부트와 AWS로 혼자 구현하는 웹서비스
'SPRING' 카테고리의 다른 글
Secrets Manager + SpringBoot (0) | 2023.07.25 |
---|---|
profile별 환경 분리 (application 분리) (0) | 2023.07.16 |
Spring 웹 계층 (0) | 2023.04.24 |
JPA Annotation (0) | 2023.04.24 |
Lombok Annontation (0) | 2023.04.06 |