[Web]Cookieとセッション


HTTPはステータスレスプロトコル


HTTPプロトコルは無状態であり,以前のウェブページ情報を知らない.
以前のレコード(ログインなど)が消えてしまう問題.
以前のWebデータの使用方法
1.cookie:クライアントPC上のcookieファイルに情報を格納し、Webページ間で共有する
  • セッション:サーバメモリに情報を格納し、Webページ間で共有します.
  • クッキー


    Cookieは、ウェブページ間で共有する情報をクライアントPCに格納して使用する方法である.
  • クライアントPCに格納される.
  • ストレージ容量限定(4 kb)
  • セキュリティが劣る
  • は、クライアントブラウザにおいて
  • を使用することができる.
  • ドメインに基づいてCookieを作成します.
  • javax.servlet.http.Cookieを使います.
  • クッキーを
  • 応答オブジェクトのaddCookie()に送信し、
  • を保存する
    クライアントのCookieを
  • リクエストオブジェクトのgetCookie()にインポートします.
  • 継続Cookie vsセッションCookie
    継続クッキーをファイルとして作成します.削除または設定の終了まで保持します.クライアント設定などを保存するためのCookie.
    セッションCookieはブラウザメモリに作成されます.ブラウザが閉じる前に保持します.サーバはセッションを区別するCookieに使用します.

    Cookieシーケンス

  • クライアントがサーバに初めて接続されました.
  • サーバは、応答にCookieを追加する.
  • クライアントの次のリクエストから、Cookieを読み込んで送信します.
  • サーバは、さっきのクライアントを識別できます.
  • Cookie作成者


    Cookie c=new Cookie(名前、値);

    Cookieの有効期間の決定


    c.setMaxAgent(有効期間);

    Cookieをサーバからクライアントに送信


    response.addCookie(c);

    Claire IntのすべてのCookieを取得


    Cookieをインポートする場合は、すべてのCookieを配列にインポートする必要があります.
    Cookie[] allcookies = request.getCookies();

    クライアントから取得したCookieの名前と値を取得


    名前:allcookies[i].getName()
    値:allcookies[i].getValue()

    コーディングとデコード


    CookieにはAskiコード(アルファベット、数字)しか含まれません.ハングルにはエンコードとデコードが必要です
    String変数=URLEncoder.Encode(値、符号化名);
    String変数=URLDecoder.decode(値、符号化名);

    Cookie実習

    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException {
            response.setContentType("text/html;charset=utf-8");
            PrintWriter out = response.getWriter();
            Date d = new Date();
            Cookie c = new Cookie("cookieTest", URLEncoder.encode("JSP프로그래밍입니다.", "utf-8"));
            //쿠키 객체 생성. 쿠키 이름은 cookieTest. 쿠키내용은 한글을 utf-8로 인코딩해서 저장.
    
            c.setMaxAge(24 * 60 * 60); //쿠키의 유효기간 생성.
            //c.setMaxAge(-1);  //세션 쿠키를 생성할 경우.
            response.addCookie(c); // 생성된 쿠키를 브라우저로 전송해줌.
            out.println("현재시간 : " + d);
            out.println("<br> 문자열을 Cookie에 저장합니다.");
    
        }
    SetCookie Sublit
    CookieジェネレータはCookieに名前と値を入力します.
    韓国語はutf-8と符号化する必要があるため、URLEncoderを使用します.
    Cookie有効期間が指定されていない場合は、セッションCookieとなります.
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException {
            response.setContentType("text/html;charset=utf-8");
            PrintWriter out=response.getWriter();
            Cookie[] allValues=request.getCookies(); //브라우저의 쿠키값 배열로 전달받음.
            for(int i=0; i<allValues.length;i++){
                if(allValues[i].getName().equals("cookieTest")){ //해당 쿠키의 이름이 cookieTest인 것의 값 출력
                    out.println("<h2>Cookie 값 가져오기 : "+URLDecoder.decode(allValues[i].getValue(),"utf-8"));
                }
            }
    
        }
    GetCookie Servlet
    ブラウザのCookieを配列としてインポートし、特定の名前のCookieを検索して値を出力します.


    セッション


    Cookieは共有情報をクライアントPCに格納する.
    セッションは、ガラス->ログインなどのセキュリティ面でサーバメモリに格納されます.
  • 情報はサーバメモリに
  • 記憶する.
  • セッションクッキー(クッキー名:JSSIONID)を使用します.
  • 初期セッションが作成されると、サーバはセッションクッキーを応答として送信します.クライアントは、各リクエストのCookieをサーバに送信します.
  • 各ブラウザ(ユーザー)に1つのセッションがあります.JSSIONID Cookieでユーザーを区別します.
  • はセキュリティが高いが、サーバ負荷
  • 有効時間(デフォルト30分)
  • メンテナンス
  • 登録、カート等に使用

    セッション順序

  • クライアントがサーバに初めて接続されました.
  • サーバはセッションオブジェクトを作成します.JSSIONI Cookieに応答してクライアント
  • に送信
  • クライアントは、次のリクエスト時にJSSIONID Cookieとともに送信します.
  • サーバJESSIONID Cookie値のセッションオブジェクトの情報
  • を表示してマッピングする
    すなわち、サーバ上の各セッションオブジェクトは、初期設定の同じ変数名として格納される.user,user pw.
    JSSIONIDという名前のセッションCookieを使用してセッションを区切ります.

    サーバからクライアントセッションをインポート


    Httpseesion session = request.getSession();
    ->クライアント上のセッションが存在する場合は、セッションオブジェクトをに設定します.存在しない場合は、新しいセッションオブジェクトを作成して返します.
    request.getSession(false);
    ->セッションが存在する場合は、セッションオブジェクトを選択します.存在しない場合はnullを返します
    最初に作成されたセッションかどうか:session.isNew()

    セッションにバインド


    Httpsessionオブジェクトは、サーブレットContextオブジェクトのようにバインドして使用することもできます.
    setAttributeまたはgetAttributeメソッドの使用

    セッションIDとアクセス視点の取得


    セッションID:セッション.getId()
    初期セッションオブジェクトが作成された時刻:new Dateセッション.getCreateTime()
    最後のセッションアクセス時間:new Date session.getLastAccessedTime()
    セッションオブジェクト有効時間:session.getMaxInactiveInterval()

    セッションを完全に削除


    session.invalidate();

    セッションを使用したログインの実装

  • HTML
  • に登録
  • 登録マニュアル
  • DAO, VO
  • ログインに成功した場合、情報照会票(セッションが存在するか否か)
  • を識別して実行する
  • ログイン画面HTMLで実現.formタグを使用して入力ID、PWDをログインテンプレートに渡します.
  • ログインテンプレートは、ID、PWDを受信し、VOオブジェクトに保存する.DAOオブジェクトを作成し、isExisted()メソッド
  • を実行します.
  • DAOのisExistedメソッドは、クエリ文を使用して、対応するIDおよびPWDのデータがデータベースに存在するかどうかを確認し、サーブレット
  • に返す.
    isExisted結果がTrueの場合、
  • ログインテンプレートはセッションを作成し、ログイン情報とIDをセッションオブジェクトにバインドし、PWDを
  • にバインドする.
  • 情報照会書はrequestです.セッションオブジェクトのgetSession(false)を取得します.セッションがnullでない場合、バインドされたログイン情報が出力されます.
  • 
    /*Login Servlet*/
    private void doHandle(HttpServletRequest request, HttpServletResponse response)
    	throws ServletException, IOException {
            request.setCharacterEncoding("utf-8");
            response.setContentType("text/html;charset=utf-8");
            PrintWriter out = response.getWriter();
            String user_id = request.getParameter("user_id");
            String user_pwd = request.getParameter("user_pwd");
    
            MemberVO memberVO = new MemberVO();
            memberVO.setId(user_id);
            memberVO.setPwd(user_pwd);
            MemberDAO dao = new MemberDAO();
            boolean result = dao.isExisted(memberVO); //dao에서 쿼리문 수행
    
            if (result) {
                HttpSession session = request.getSession(); //세션 생성
                session.setAttribute("isLogon", true); // 로그인 정보 바인딩
                session.setAttribute("login.id", user_id);
                session.setAttribute("login.pwd", user_pwd);
    
                out.print("<html><body>");
                out.print("안녕하세요 " + user_id + "님!!!<br>");
                out.print("<a href='show'>회원정보보기</a>"); //회원 정보 조회 서블릿으로
                out.print("</body></html>");
            }
    /*정보 조회 서블릿*/
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    	throws ServletException, IOException {
            response.setContentType("text/html;charset=utf-8");
            PrintWriter out = response.getWriter();
            String id ="", pwd="" ;
            Boolean isLogon=false;
            HttpSession session =  request.getSession(false); //세션이 있는지 확인
    
            if( session != null){ // 있다면 세션에 바인딩 된 정보 출력
                isLogon=(Boolean)session.getAttribute("isLogon");
                if(isLogon==true){
                    id = (String)session.getAttribute("login.id");
                    pwd = (String)session.getAttribute("login.pwd");
                    out.print("<html><body>");
                    out.print("아이디: " + id+"<br>");
                    out.print("비밀번호: " + pwd+"<br>");
                    out.print("</body></html>");
                }else{
                    response.sendRedirect("login3.html");
                }
            }else{
                response.sendRedirect("login3.html");
            }
        }