복습을 위한

서블릿http세션 본문

SpringMVC

서블릿http세션

ho042479 2024. 1. 30. 20:58

  서블릿은 세션을 위해 HttpSession 이라는 기능을 제공하는데

전블로그에서 직접 구현한 세션의 개념이 이미 구현되어 있고, 더 잘 구현되어 있다. HttpSession 소개 서블릿이 제공하는 HttpSession 도 직접 만든 SessionManager 와 같은 방식으로 동작한다.

 

서블릿을 통해 HttpSession 을 생성하면 다음과 같은 쿠키를 생성한다. 쿠키 이름이 JSESSIONID 이고, 값은 추정 불가능한 랜덤 값이다.

 

Cookie: JSESSIONID=5B78E23B513F50164D6FDD8C97B0AD05

 

 

@PostMapping("/login")//HTTP세션활용
    public String loginV3(@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("loginFail", "아이디또는 비밀번호가 맞지않습니다.");
            return "login/loginForm";//글로벌오류
        }

        //로그인 성공처리
        //세션이 있으면 있는 세션 반환, 없으면 신규 세션을 생성, 고유한 id를 가진 세션이 생성된다.
        HttpSession session = request.getSession();//(true)기본값임 //false경우 세션이 없으면 새로운 새션생성안하고null반환

        //세션에 로그인 회원 정보를 보관
        session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember);//세션에 보관하고싶은 객체담기
        //키값에 카테고리같이 세션의 범주를 넣어주고, 값에 객체를 넣어준다.
        return "redirect:/";
    }

LoginController

 

 

세션 생성과 조회 세션을 생성하려면 request.getSession(true) 를 사용하면 된다.

public HttpSession getSession(boolean create);

 

세션의 create 옵션에 대해 알아보자.

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

 

request.getSession() : 신규 세션을 생성하는 request.getSession(true) 와 동일하다. 세션에 로그인 회원 정보 보관 session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember); 세션에 데이터를 보관하는 방법은 request.setAttribute(..) 와 비슷하다. 하나의 세션에 여러 값을 저장할 수 있다.

 

 @PostMapping("/logout")//http 세션활용
    public String logoutV3(HttpServletRequest request){
        HttpSession session = request.getSession();
        if(session!=null){
            session.invalidate();//세션삭제
        }
        return "redirect:/";
    }

 

 

 

 

 

@GetMapping("/")//서블릿http 세션 활용
    public String homeLoginV3(HttpServletRequest request, Model model){

        HttpSession session = request.getSession(false);//false 그냥 홈에만 들어온사람도 있는데 세션없다고 새로 생성할 필요없다
        if(session==null){
            return "home";
        }
        Member loginMember = (Member)session.getAttribute(SessionConst.LOGIN_MEMBER);//카테고리같은 키값을 넣어 객체를 꺼낸다.

        //세션에 회원 데이터가 없으면 home
        if(loginMember==null){
            return "home";
        }

        //세션이 유지되면 로그인성공화면으로 보내기
        model.addAttribute("member",loginMember);
        return "loginHome";
    }

HomeController

 

 

여기선 request.getSession(false) 이다. 

 

request.getSession() 를 사용하면 기본 값이 create: true 이므로, 로그인 하지 않을 사용자도 의미없는 세션이 만들어진다. 따라서 세션을 찾아서 사용하는 시점에는 create: false 옵션을 사용해서 세션을 생성하지 않아야 한다. session.getAttribute(SessionConst.LOGIN_MEMBER) : 로그인 시점에 세션에 보관한 회원 객체를 찾는다.

 

 

 

**추가  @SessionAttribute 스프링은 세션을 더 편리하게 사용할 수 있도록 @SessionAttribute 을 지원한다.

@GetMapping("/")//스프링어노테이션 세션 활용..코드짧아진다 알아서 가져와서 찾아준다. //어노테이션이 세션생성은 안함
    public String homeLoginV3Spring(
            @SessionAttribute(name=SessionConst.LOGIN_MEMBER,required = false)Member loginMember, Model model){

//        HttpSession session = request.getSession(false);//그냥 홈에만 들어온사람도 있는데 세션없다고 새로 생성할 필요없다
//        if(session==null){
//            return "home";
//        }
//        Member loginMember = (Member)session.getAttribute(SessionConst.LOGIN_MEMBER);//카테고리같은 키값을 넣어 객체를 꺼낸다.


        //세션에 회원 데이터가 없으면 home
        if(loginMember==null){
            return "home";
        }

        //세션이 유지되면 로그인성공화면으로 보내기
        model.addAttribute("member",loginMember);
        return "loginHome";
    }

HomeController

 

 

 이미 로그인 된 사용자를 찾을 때는 다음과 같이 사용하면 된다. HomeController에서 사용할 수 있다. 참고로 이 기능은 세션을 생성하지 않는다. @SessionAttribute(name = "loginMember", required = false) Member loginMember

 

그러니깐 로그인할 때는 사용못한다.

 

 

 

 

 

 

참고

https://www.inflearn.com/course/lecture?courseSlug=%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2&unitId=83334&category=questionDetail&tab=curriculum

 

'SpringMVC' 카테고리의 다른 글

스프링 인터셉터  (0) 2024.01.31
서블릿 필터  (0) 2024.01.31
세션타임아웃설정  (0) 2024.01.31
쿠키보안문제와 세션  (0) 2024.01.30
MultipartFile  (1) 2024.01.30