[SpringBoot] 서블릿의 HttpSession을 사용해 세션 구현하기
1️⃣ 세션
: 서버가 데이터를 저장하는 수단
: 시간적 개념으로는 서버와 클라이언트의 연결이 활성화 된 상태를 의미한다.
HttpSession 사용
- 우선 세션의 키로 사용될 문자열을 정의한다.
public class SessionConst {
public static final String LOGIN_MEMBER = "loginMember";
}
@PostMapping("/login")
public String login(@Valid @ModelAttribute LoginForm form, BindingResult bindingResult,
HttpServletRequest request){
if (bindingResult.hasErrors()){
return "login/loginForm";
}
Member loginMember = loginService.login(form.getLoginId(), form.getPassword());
if (loginMember == null){
bindingResult.reject("loginFali", "아이디 또는 비번이 맞지 않아~~");
return "login/loginForm";
}
// 로그인 성공 처리
// 세션이 있으면 있는 세션 반환, 없으면 신규 세션 생성
HttpSession session = request.getSession();
// 세션에 로그인 회원 정보 보관
session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember);
return "redirect:/";
}
session.setAttribute(”key”, value)
: 세션에 데이터 저장request.getSession(true) == request.getSession()
- 세션이 있으면 기존 세션 반환한다.
- 세션이 없으면 새로운 세션을 생성해서 반환
request.getSession(false)
- 세션이 있으면 기존 세션 반환한다.
- 세션이 없으면 null을 반환
@SessionAttributes
controller 클래스 선언구에 선언
스프링이 관리하도록 세션에 데이터를 저장하여 관리할 때, 위 애노테이션으로 key 값 등록
스프링 API로 관리하는 session
@Controller @SessionAttributes({"key1", "key2", "key3", "key4"}) public class SubController { ... } // 파라미터로 데이터 키 값 리스트 입력 // 해당 리스트 안의 값을 키로 갖는 세션 데이터들을 spring API로 관리
세션 반환하기 == 로그아웃
방법 1
PostMapping("/logout") public String logout(HttpServletRequest request){ // 세션을 삭제한다. HttpSession session = request.getSession(false); if (session != null){ session.invalidate(); // 현재 가지고 있는 세션을 제거할 수 있는 코드 } return "redirect:/"; }
- HttpSession 객체를 생성하여 세션에 저장한 데이터의 경우
(== @SessionAttribute에 등록하지 않은 경우)- 세션 데이터 일괄 삭제
방법2
@RequestMapping("sessionDelete1") public String sessionDelete1(HttpSession session) { session.removeAttribute("key1"); //key1을 키 값으로 갖는 데이터만 삭제 return "redirect:/showsession.jsp"; }
- HttpSession 객체를 생성하여 세션에 저장한 데이터의 경우
(== @SessionAttribute에 등록하지 않은 경우)- 특정 키 값의 세션 데이터 삭제
방법3
@RequestMapping("sessionDelete2") public String sessionDelete2(SessionStatus status) { // SessionStatus 객체인 SessionStatus status 생성하여 파라미터로 넘기고 status.setComplete(); //스프링 API 관리 세션 데이터 일괄 삭제 return "redirect:/showsession.jsp"; }
@SessionAttribute
에 데이터 키 값을 등록하여, 스프링 API가 관리하는 세션 데이터로 설정한 경우- 스프링 API 관리 세션 데이터 일괄 삭제
세션 값 바인딩
@RequestMapping("/sessionBinding")
public String sessionBind(@ModelAttribute("key1") String v1, @ModelAttribute("key2") int v2) {
System.out.println("key1 키 값으로 저장된 세션 데이터 : " + v1);
System.out.println("key2 키 값으로 저장된 세션 데이터 : " + v2);
return "redirect:/step03Session.jsp";
}
@ModelAttribute(key) String value
를 파라미터로 넘기면
스프링이 관리하는 세션 @SessionAttribute에서 해당 키 값을 가진 세션 데이터가 있는지 찾아서 바인딩- 메소드 내부에서 value(변수명)으로 해당 세션 값 사용 가능
String value = (String)session.getAttribute(key)
와 유사