반응형
- SessionUser user = (SessionUser) httpSession.getAttribute("user");
@LoginUser 어노테이션은 매번 세션의 저장된 정보를 불러 들이는 위 코드의 중복을 줄여준다.
사용법은 아래와 같다.
1) @LoginUser 어노테이션 생성
package com.loosie.book.springboot.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 {
}
2) 같은 위치에 LoginUserArgumentResolver를 생성
HandlerMethodArgumentResolver 인터페이스를 구현한 클래스이다.
HandlerMethodArgumentResolver는 조건에 맞는 경우 메소드가 있다면 HandlerMethodArgumentResolver의 구현체(LoginUserArgumentResolver)가 지정한 값을 해당 메소드의 파라미터를 넘길 수 있다.
package com.loosie.book.springboot.config.auth;
import com.loosie.book.springboot.config.auth.dto.SessionUser;
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;
import javax.servlet.http.HttpSession;
@Component
@RequiredArgsConstructor
public class LoginUserArgumentResolver implements HandlerMethodArgumentResolver {
private final HttpSession httpSession;
/**
* Controller 메서드가 특정 파라미터를 지원하는지 판단
* 1) @LoginUser 어노테이션이 붙어있는지
* 2) 파라미터 클래스타입 SessionUser.class인지
* ==> 1) && 2) ? true : false
*/
@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"); // 세션에서 유저 객체 정보 가져옴
}
}
3) WebConfig 클래스 생성
LoginUserArgumentResolver가 스프링에 인식될 수 있도록 WebMvcConfiguer에 등록.
package com.loosie.book.springboot.config;
import com.loosie.book.springboot.config.auth.LoginUserArgumentResolver;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.List;
@Configuration
@RequiredArgsConstructor
public class WebConfig implements WebMvcConfigurer {
private final LoginUserArgumentResolver loginUserArgumentResolver;
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(loginUserArgumentResolver);
}
}
4) 컨트롤러 파라미터로 @LoginUser 적용
package com.loosie.book.springboot.web;
import com.loosie.book.springboot.config.auth.LoginUser;
import com.loosie.book.springboot.config.auth.dto.SessionUser;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
@RequiredArgsConstructor
public class IndexController {
@GetMapping("/")
public String index(Model model, @LoginUser SessionUser user){
model.addAttribute("posts", postsService.findAllDesc());
if(user != null){
model.addAttribute("userName", user.getName());
}
return "index";
}
}
※참고
반응형
'springboot' 카테고리의 다른 글
[springboot] maven VS gradle (0) | 2025.01.12 |
---|---|
[spring] servlet-context.xml, root-context.xml, pom.xml, web.xml 차이점 (0) | 2025.01.12 |
[springboot] Spring Security 권한 설정 외 @PreAuthorize로 추가 권한 검사 (0) | 2024.10.10 |
[springboot] Spring Security의 /login 요청 시 처리 과정(세션 저장) (5) | 2024.10.09 |
[springboot] 스프링부트 2점대에 swagger 3점대 연결 (0) | 2024.04.14 |