세션기능 구현은 완료했고, 이제 적용하는 일만 남았다. 적용은 쉽다.
@Slf4j
@Controller
@RequiredArgsConstructor
public class LoginContoller {
private final LoginService loginService;
private final SessionManager sessionManager;
@GetMapping("/login")
public String loginForm(@ModelAttribute LoginForm form){
return "login/loginForm";
}
@PostMapping("/login")
public String login(@Validated @ModelAttribute LoginForm loginForm, BindingResult bindingResult, HttpServletResponse response){
if(bindingResult.hasErrors()){
return "login/loginForm";
}
Member loginMember = loginService.login(loginForm.getLoginId(), loginForm.getPassword());
if(loginMember == null){
bindingResult.reject("loginFail", "아이디 혹은 비밀번호가 맞지 않습니다.");
return "/login/loginForm";
}
sessionManager.createSession(loginMember, response);
return "redirect:/";
}
@PostMapping("/logout")
public String logout(HttpServletRequest request){
sessionManager.expire(request);
return "redirect:/";
}
}
그냥 검증 다 통과하고, 제대로 Member까지 찾아서 오면, 세션을 만들어 주면 된다.
로그아웃에서는, 세션 저장소에 있는 세션을 삭제해 주면 된다.
그럼 클라이언트가 아무리 UUID를 쿠키로 가지고 있어도, 그것은 세션 저장소에 없는 세션이라 Member가 반환되지 않는다.
@Slf4j
@Controller
@RequiredArgsConstructor
public class HomeController {
private final MemberRepository memberRepository;
private final SessionManager sessionManager;
// @GetMapping("/")
// public String home() {
// return "home";
// }
@GetMapping("/")
public String homeLogin(HttpServletRequest request, Model model) {
Member loginMember = (Member)sessionManager.getObjectFromSession(request);
if(loginMember == null){
return "home";
}
model.addAttribute("member", loginMember);
return "loginHome";
}
}
홈에서도 이제
세션으로부터 Member를 찾고, 만약 Member가 없다면,
그것은 서버 세션에서 세션이 파괴되었거나 애초에 클라이언트가 세션 쿠키를 들고 있지 않았던 것이므로,
어차피 재 로그인이 필요한 거기 때문에, 그냥 home으로 보내버린다.
만약 세션에서 Member를 찾아왔다면, 로그인한 사람 전용 폼으로 보내버린다.
'스프링 > 4. 스프링 MVC-2' 카테고리의 다른 글
52. 스프링 세션 업그레이드 (0) | 2023.09.07 |
---|---|
51. 스프링의 Http 세션 (0) | 2023.09.07 |
49. 서버세션 구현 (0) | 2023.09.06 |
48. 서버 세션 (0) | 2023.09.05 |
47. 쿠키의 보안문제 (0) | 2023.09.05 |