스프링/4. 스프링 MVC-2

51. 스프링의 Http 세션

sdafdq 2023. 9. 7. 01:18

먼저 key이름 같은 건 자주 쓰니

public interface SessionConst {
    public static final String LOGIN_MEMBER = "loginMember";
}

아예 인터페이스에다가 public으로 String 해놔서 등록.

 

 

 

 

@PostMapping("/login")
public String loginV3(@Validated @ModelAttribute LoginForm loginForm, BindingResult bindingResult, HttpServletRequest request){
    if(bindingResult.hasErrors()){
        return "login/loginForm";
    }

    Member loginMember = loginService.login(loginForm.getLoginId(), loginForm.getPassword());

    if(loginMember == null){
        bindingResult.reject("loginFail", "아이디 혹은 비밀번호가 맞지 않습니다.");
        return "/login/loginForm";
    }

    HttpSession session = request.getSession(); //세션 있으면 반환, 없으면 신규 생성
    session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember);
    return "redirect:/";
}

검증 하고,

 

로그인 성공 시 (제대로 Member 객체를 가져올 시)

 

세션 생성

request.getSession() 하면 세션 있으면 반환하고, 없으면 신규 생성임.

request.getSession(true) 이게 있으면 반환, 없으면 신규 생성인데, default값이 true임.

false는 있으면 반환, 없으면 신규생성임.

 

그 다음 session에 객체 등록.

보아하니 request.getSession()이 세션 자체를 신규 생성이나 불러오는 거고,

session.setAttribute 이게 세션에 실제 값을 넣는 거 인 듯.

key, value 형태로.

저거 여러 개 넣을 수 있다고 함.

그러면 로그인 성공 했을 때만 세션 저장하게 한 다음에,

추가로 session.setAttribute("ipAddress", request.getRemoteAddr) 해서 ip까지 비교해서 다중 로그인 막을 수 있을 듯. (근데 뭐 이것도 포스트맨 같은 걸로 IP바꿔서 보내는 건 일도 아닐 듯. 아니 그래도 결국 응답은 그 IP로 오니까..)

 

 

파괴는

@PostMapping("/logout")
public String logoutV3(HttpServletRequest request){
    HttpSession session = request.getSession(false);
    if(session != null){
        session.invalidate();
    }
    return "redirect:/";
}

session.invalidate() 하면 파괴된다고 함. 아예 다 날라가 버리는 듯. 세션에 넣었던 것들.

 

 

 

 

@GetMapping("/")
public String homeLoginV3(HttpServletRequest request, Model model) {
    HttpSession session = request.getSession(false);

    if(session == null){
        return "home";
    }

    Member loginMember = (Member)session.getAttribute(SessionConst.LOGIN_MEMBER);

    if(loginMember == null){
        return "home";
    }
    model.addAttribute("member", loginMember);
    return "loginHome";
}

꺼낼 땐 이렇게 꺼내면 됨.

우선 있는지 없는지 확인할 때는 없으면 새로 생성하면 안되니까, false로 해서 없으면 null로 반환받게끔 함.

 

session.getAttribute(key);

 

key를 언제 쓰나 했더니 서버 개발자가 쓰는거였군.. 하긴 세션은 서버에서만 관리하니까..

 

 

'스프링 > 4. 스프링 MVC-2' 카테고리의 다른 글

53. 세션 정보 확인과 타임아웃 설정  (0) 2023.09.07
52. 스프링 세션 업그레이드  (0) 2023.09.07
50. 서버세션 적용  (0) 2023.09.06
49. 서버세션 구현  (0) 2023.09.06
48. 서버 세션  (0) 2023.09.05