ログイン処理-セッションv 2


前回のリリースに続いて、今回はサーブレットが提供するセッションを使用してログインを実現します.
見てみましょう
サーブレットはセッションにHttpSessionという機能を提供します.直接実装されたセッションが実装され、よりよく実装されています.

HttpSession...


サーブレットが提供するHttpSessionは、最終的には自分が作成したSessionManagerと同じ方法で動作します.サーブレットによるHttpSessionの作成により、次のCookieが生成されます.Cookie名はJESSIONIDで、値は推定不可能なランダム値です.
Cookie: JSESSIONID=5B78E23B513F50164D6FDD8C97B0AD05

👊サーブレットが提供するHttpSessionを使用して開発しましょう。


SessionConst

  • HttpSessionでデータを格納してクエリーする場合、同じ名前を繰り返し使用するため定数が定義されます.
  • public abstract class SessionConst {
        public static final String LOGIN_MEMBER = "loginMember";
    
    }
    

    LoginController - login()

    @PostMapping("/login")
        public String login(@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:/";
        }

    セッションの作成と表示


    セッションを作成するには、リクエストします.getSession(true)を使用すればよい.
    public HttpSession getSession(boolean create);
    セッションのcreateオプションについて説明します.
    request.getSession(true)
    セッションがある場合は、既存のセッションを返します.
    セッションがない場合は、新しいセッションを作成して返します.
    request.getSession(false)
    セッションがある場合は、既存のセッションを返します.
    セッションがない場合は、新しいセッションは作成されません.nullを返します.
    request.getSession():新しいセッションを作成するリクエスト.getSessionと同じ

    セッションにログインメンバー情報を保持


    session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember);
    セッションにデータを保存する方法はrequestです.setAttribute(..) に似ている1つのセッションの複数の値
    ちょぞう

    LoginController - logout()

    @PostMapping("/logout")
        public String logout(HttpServletResponse response, HttpServletRequest request){
            HttpSession session = request.getSession(false);
            if(session != null){
                session.invalidate(); //세션을 제거한다.
            }
            return "redirect:/";
        }

    HomeController - homeLogin()

    @GetMapping("/")
        public String homeLogin(HttpServletRequest request, Model model) {
            
            // request.getSession(false): request.getSession()를 사용하면
            // 기본값이 create : true 이므로, 로그인 하지 않을 사용자도 의미없는 세션이
            //만들어진다. 따라서 세션을 찾아서 사용하는 시점에는 create:false옵션을 사용해
            // 세션을 생성하지 않아야 한다.
            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";
        }

    ログイン結果




    JESSIONID Cookieが正しく作成されていることを確認

    整理する


    前回のリリースで自らセッションを作成し、今回のリリースではサーブレットが提供するHttpSessionを使用してログインを実現しました.
    開発者がセッションを直接実装しなくても、サーブレットが提供する機能を使用して容易に実装できます.
    このようにサーブレットが提供する機能もあり、Springはセッションを作成する機能も提供しています.
    以下のプレゼンテーションでは、スプリングが提供する機能を使用してログインを実現します.