반응형
public interface SessionConst {
String LOGIN_MEMBER = "userDTO";
}
Session을 다룰 때 글자만 참고해서 사용하기 위해서 상수를 인터페이스로 만들어주었다.
이렇게 만든 상수는 직접 사용은 하지 않는다.
/**
*로그인 로직 처리
*/
//TODO: 2022-04-17아이디 비밀번호 체크 로직 필요, Session값 넘기는 로직 필요,예외 처리 필요
@PostMapping("/user/logIn/page")
public String login(@ModelAttribute UserVo userVo, HttpServletRequest request) throws Exception {
log.info(this.getClass().getName() + "로그인 로직 처리 시작");
int res = 0;
UserDTO userDTO = new UserDTO(userVo.getUserNo(), userVo.getUserId(), userVo.getUserPw());
res = userService.login(userDTO);
if (res == 1) {
HttpSession session = request.getSession();
session.setAttribute(SessionConst.LOGIN_MEMBER, userDTO);
} else {
return "user/login";
}
log.info(this.getClass().getName() + "로그인 로직 처리 끝");
return "index";
}
HttpServletRequest request 에서 Session을 지원한다.
로그인 체크 로직을 수행하고 받은 값이 로그인 성공일 때 Session에 위에서 만들어둔 상수 값에 담아주어 리턴한다.
@Slf4j
@Controller
@RequiredArgsConstructor
public class HomeController {
@GetMapping("/")
public String index(
@SessionAttribute(name = SessionConst.LOGIN_MEMBER, required = false)UserDTO userDTO, Model model) {
if (userDTO == null ) {
return "/user/logIn";
}
model.addAttribute("member", userDTO);
return "/index";
}
}
HomeController에서 인덱스 페이지를 들어갈 때 Session을 체크한다.
Spring에서 지원하는 @SessionAtrribute를 통해 위에서 Session에 값을 저장한 상수를 불러와 사용한다.
불러온 값이 null이면 다시 로그인 페이지로 돌러보내고, 그렇지 않으면 Session을 나중에 사용하기 위해 model 객체에 담아둔다.
# 세션 유지 시간을 설정한다. 초 단위로 적용된다.
server.servlet.session.timeout=1800
#URL 전달 방식을 끄고 항상 쿠키를 통해 세션을 유지한다.
server.servlet.session.tracking-modes=cookie
application.properties에서 Session에 대한 설정을 해주었다.
Session이 탈취당해도 안전하도록 Session time out 설정을해 주었고 URL 전달 방식을 끄고 항상 쿠키를 통해 세션이 유지되도록 설정해 주었다. (주석을 참고하자.)
@Slf4j
@RestController
public class SessionInfoController {
/**
* 정상적으로 세션을 가지고 있는지 체크하기 위한 테스트 경로 생성
*/
@GetMapping("/session-info")
public String sessionInfo(HttpServletRequest request) {
HttpSession session = request.getSession(false);
if (session == null) {
return "세션이 없습니다.";
}
session.getAttributeNames().asIterator()
.forEachRemaining(name -> log.info("session name = {}, value = {}", name, session.getAttribute(name)));
log.info("sessionId = {}", session.getId());
log.info("getMaxInactiveInterval = {}", session.getMaxInactiveInterval());
log.info("creationTime = {}", new Date(session.getCreationTime()));
log.info("lastAccessedTime = {}", new Date(session.getLastAccessedTime()));
log.info("isNew = {}", session.isNew());
return "세션 출력";
}
}
세션 값이 정상적으로 생성, 삭제가 되었는지 체크하기 위한 임시 경로를 생성해 주었다.
로그인해서 세션값을 가지고 접속하면 세션 출력 화면과 로그에 가지고 있는 세션이 표시되고, 그렇지 않은 경우 세션이 없다는 메시지가 출력이 된다.
반응형
'Project > 소경관' 카테고리의 다른 글
[소경관] : Filter 적용하여 미인증 사용자 체크하기 (0) | 2022.04.17 |
---|---|
[소경관] : Session으로 logout 구현하기 (0) | 2022.04.17 |
[소경관] : thymeleaf와 JPA, builder 패턴을 사용하여 로그인 구현하기 (0) | 2022.04.15 |
[소경관] : JPA와 builder 패턴을 사용한 회원 가입 및 Id, Email 중복 체크 로직 코딩하기 (0) | 2022.04.14 |
[소경관] : builder에 값을 넣는 다른 방법 (0) | 2022.04.13 |
댓글