spring - HttpSession

UkJJang·2021년 9월 28일
0

인프런 김영한 님의 https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2/dashboard 강의를 보며 학습했습니다.

  • 기존에 세션을 직접 작성해봤던 것처럼 서블릿 에서 HttpSession이라는 기능을 제공해 준다.

HttpSession 사용예제

    @PostMapping("/login")
    public String loginV3(@Validated  @ModelAttribute("loginForm") 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("loginFail", "아이디 또는 비밀번호가 맞지 않습니다.");
            return "login/loginForm";
        }

        // 로그인 성공 처리 TODO
        // 세션이 있으면 있는 세션 반환, 없으면 신규 세션을 생성
        HttpSession session = request.getSession();
        // 세션에 로그인 회원정보를 보관
        session.setAttribute(SessionConst.LOGIN_MEMBER,loginMember);

        return "redirect:/";

    }


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

        return "redirect:/";
    }
    
     @GetMapping("/")
    public String homeLoginV3(HttpServletRequest request, Model model) {

		// 기본값 false로 해야함
        HttpSession session = request.getSession(false);
        // 로그인
        if (session == null) {
            return "home";
        }

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

        if (member == null) {
            return "home";
        }
        model.addAttribute("member", member);
        return "loginHome";
    }
  • HttpSession.getSession() > true / false 가 존재하며 true가 기본값이다. 그리고 하나의 세션에 여러 값을 저장할 수 있다.

    true는 세션이 있으면 기존 세션을 반환하고 세션이 없으면 새로운 세션을 생성해서 반환한다.
    false는 세션이 있으면 기존 세션을 반환하고 세션이 없으면 새로운 세션을 생성하지 않고 null을 반환한다.

@SessionAttribut

  • 스프링이 제공하는 세션을 편하게 가져올 수 있는 어노테이션이다.
    @GetMapping("/")
    public String homeLoginV3Spring(@SessionAttribute(name = SessionConst.LOGIN_MEMBER, required = false) Member member, Model model) {


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

application.properties에 server.servlet.session.tracking-modes=cookie를 추가해줘서 url에 세션id가 붙는것을 없애주도록 한다.

세션 타임아웃 설정

  • 세션을 계속해서 유지하면 안되기 때문에 적정한 시간을 할당한다. 많이 사용하는 방법은 가장 마지막에 요청한 시간부터 30분씩 세션 유지시간을 세팅해 주도록 한다. HttpSession은 이 방식으로 생명주기를 관리하고 있다.

application.properties에 server.servlet.session.timeout=1800를 추가해줘서 30분씩 유지하도록 하고 예민한 데이터들은 따로 타임아웃을 지정해주도록 한다.

  • 시간이 지나면 WAS가 내부에서 해당 세션을 제거한다.
profile
꾸준하게 성실하게

0개의 댓글