JSP - chapter8(1)


クッキー

  • Cookieの構成<名前、値>
    名称:各Cookieを区別する
    値:Cookie名に関連する値
  • Cookie path

  • パスを指定しない:Cookieを生成するURLの範囲内で
  • を送信する.
  • /:
  • をWebアプリケーションのすべてのURL範囲内で送信する.

    cookie maxAge

  • cookie.setMaxAgent(秒);
  • cookie.setMaxAge(0); : ダイレクト削除
  • cookie.setMaxAge(-1); : セッション終了時に削除する
  • Cookie行動方式


  • 生成
  • :Webサーバ側によって作成されます.生成されたCookieは、応答データのタイトルに保存する、Webブラウザ
  • に送信される.

  • 保存
  • :Webブラウザは、応答データに含むCookieをCookieリポジトリ
  • に保存する.

  • 送信
  • :Webブラウザは、要求するたびにCookie
  • をWebサーバに送信する.
  • response.addCookie(cookie); : サーバ上にCookie
  • を作成(間もなく)
  • request.getCookies(); : クライアントから送信Cookie
  • を読み取る(転送する)
  • getName():Cookie名
  • を取得
  • getValue():Cookieの値
  • を取得

    Cookieの作成


    makeCookie.jsp

  • 名「name」、値「犬の糞」のCookie生成
  • <%@page import="java.net.URLDecoder"%>
    <%@page import="java.net.URLEncoder"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8"%>
    <%
    	//추가할 쿠키 정보를 담고 있는 Coockie 객체를 생성
    	Cookie cookie = new Cookie("name", URLEncoder.encode("개똥이", "UTF-8"));
    	
    	//응답 데이터에 쿠키를 추가
    	response.addCookie(cookie);
    %>    
    <!DOCTYPE html>
    <html>
    <head>
    <title>쿠키 생성</title>
    <script type="text/javascript">
    	function fn_view() {
    		location.href="/chapter09/viewCookies.jsp";
    	}
    </script>
    </head>
    <body>
    <!-- 별도 유효 시간을 지정하지 않으면 웹 브라우저를 종료 시 쿠키도 함께 삭제됨 -->
    <%=cookie.getName() %> 쿠키의 값 = <%=cookie.getValue()%>
    <!-- <%=URLDecoder.decode(cookie.getValue(),"utf-8") %>을 하면 깨짐 없음 -->
    	<input type="button" value="쿠키보기" onclick="fn_view()">
    <!-- 아이디 저장하기 할 때 쿠키 사용함(유효시간 정해둠) -->	
    	
    </body>
    </html>
  • Cookie値復号が適用されていません
  • アプリケーション
  • Cookie値復号
  • Cookieの表示


    viewCookies.jsp

  • makeCookie.jspで「クッキーの表示」をクリックすると、クッキーが表示されます.jsp
  • に移動
  • 上に生成されたnameは、犬の糞が
  • 出力された.
    <%@page import="java.net.URLDecoder"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <title>쿠키 목록</title>
    <script type="text/javascript">
    	function fn_CRU(para) {
    		if(para == "C") { //생성 페이지로 이동
    			location.href = "/chapter09/makeCookie.jsp";
    		
    		}else if(para == "U") { //변경 페이지로 이동
    			location.href = "/chapter09/modifyCookie.jsp";
    		
    		}else if(para =="D") { //삭제 페이지로 이동
    			location.href = "/chapter09/deleteCookie.jsp";
    		
    		}else {
    			alert("잘못된 명령입니다.");
    		}
    	}
    </script>
    </head>
    <body>
    	<h2>쿠키 목록</h2>
    	<%
    		
    		Cookie[] cookies = request.getCookies();
    		
    		if(cookies != null && cookies.length > 0) {
    			for(int i=0; i < cookies.length; i++) {
    				//쿠키의 이름 = 값
    				out.print(cookies[i].getName() + "=" +
    						URLDecoder.decode(cookies[i].getValue(), "UTF-8") + "<br>");
    			}
    		}else {
    			out.print("쿠키가 쿠키 저장소에 없습니다.");
    		}
    	%>
    <input type="button" value="쿠키 생성" onclick="fn_CRU('C')">&nbsp;	
    <input type="button" value="쿠키 변경" onclick="fn_CRU('U')">&nbsp;	
    <input type="button" value="쿠키 삭제" onclick="fn_CRU('D')">&nbsp;	
    </body>
    </html>
  • Cookie生成インタフェースで「Cookieの表示」ボタンをクリックします.
  • Cookieの変更


    modifyCookie.jsp

  • 以前に作成したCookie名と同じですが、値が異なります.
    <%@page import="java.net.URLEncoder"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>쿠키 값 변경</title>
    <script type="text/javascript">
    	function fn_view() {
    		location.href ="/chapter09/viewCookies.jsp";
    	}
    </script>
    </head>
    <body>
    <!-- Cookie cookie = new Cookie("name", URLEncoder.encode("개똥이", "UTF-8")); -->
    <%
    	//이름이 name인 Cookie 객체를 새롭게 생성(기존에 생성했던 쿠키의 이름과 동일하게 생성하고 값만 다르게 함)
    	Cookie cookie = new Cookie("name",URLEncoder.encode("김은대", "UTF-8"));
    	//응답 헤더에 추가함 => name 쿠키의 값이 변경됨
    	response.addCookie(cookie);
    %>
    
    name 쿠키의 값을 변경합니다.
    <input type="button" value="쿠키목록" onclick="fn_view()">
    </body>
    </html>

    Cookieの削除


    deleteCookie.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%
    	Cookie cookie = new Cookie("name","개똥이");
    	//Cookie 클래스는 쿠키를 삭제하는 기능이 없음
    	//유효 시간을 0으로 지정함(setMaxAge()) => 초단위로 지정
    	// 60 * 60 => 60초(1분) * 60 = 1시간
    	//만약에 유효시간을 0초를 초과하여 정해놓으면 웹 브라우저를 종료해도 해당 시간만큼 
    	//쿠키가 삭제되지 않고 웹 서버에 전송이 됨
    	cookie.setMaxAge(0);
    	//응답 헤더에 추가
    	response.addCookie(cookie);
    %>    
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>쿠키 삭제</title>
    <script type="text/javascript">
    	function fn_view() {
    		location.href="/chapter09/viewCookies.jsp";
    	}
    </script>
    </head>
    <body>
    name 쿠키를 삭제합니다.
    <input type="button" value="쿠키 목록" onclick="fn_view()">
    </body>
    </html>

    Cookies Util

  • Cookieを使用して
  • にログイン
    マッピングを作成し、「クッキー名、クッキーオブジェクト」ペアとして
  • クッキーを格納
    package util;
    
    import java.io.IOException;
    import java.net.URLDecoder;
    import java.net.URLEncoder;
    import java.util.HashMap;
    import java.util.Map;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServletRequest;
    
    public class Cookies {
    	//쿠키를 <쿠키이름, Cookie객체> 쌍 형태로 저장하는 맵을 생성
    	private Map<String, Cookie> cookieMap = new HashMap<String, Cookie>();
    	
    	//생성자 (객체 생성할 때 자동으로 쿠키 읽어옴)
    	//request 안에는 파라미터로 전달되고 있는 Cookie들이 있음
    	public Cookies(HttpServletRequest request) {
    		Cookie[] cookies = request.getCookies();
    		//각각의 Cookie 객체를 cookieMap에 저장
    		if(cookies != null) {
    			for (int i = 0; i < cookies.length; i++) {
    								//키(String)			, value(객체)
    				cookieMap.put(cookies[i].getName(), cookies[i]);
    			}
    		}
    	}
    	
    	//cookieMap에서 지정한 이름의 Cookie 객체를 구함
    	//만약, 지정한 이름의 Cookie가 없으면 null을 리턴
    	public Cookie getCookie(String name) {
    		return cookieMap.get(name); //쿠키 객체 리턴
    	}
    	
    	//지정한 이름의 쿠키 객체의 값을 반환
    	public String getValue(String name) throws IOException {
    		Cookie cookie = cookieMap.get(name);
    		if(cookie == null) {
    			return null;
    		}
    		return URLDecoder.decode(cookie.getValue(),"UTF-8");
    	}
    	
    	//지정한 쿠키 이름의 Cookie가 있을 경우 true, 없을 경우 false를 리턴
    	public boolean exists(String name) {
    		return cookieMap.get(name)!= null;
    	}
    	
    	//이름이 name이고, 값이 value인 Cookie 객체를 생성하여 리턴
    	public static Cookie createCookie(String name, String value) throws IOException {
    		return new Cookie(name, URLEncoder.encode(value, "UTF-8"));
    	}
    	
    	
    	//이름이 name이고, 값이 value, 경로가 path, 유효시간이 maxAge인 Cookie 객체를 생성하여 리턴
    	public static Cookie createCookie(String name, String value, String path, int maxAge) throws IOException {
    		Cookie cookie = new Cookie(name, URLEncoder.encode(value, "UTF-8"));
    		cookie.setPath(path);
    		cookie.setMaxAge(maxAge);
    		return cookie;
    		
    	}
    	
    	//이름이 name이고, 값이 value, 도메인이 domain, 경로가 path, 유효시간이 maxAge인 Cookie 객체를 생성하여 리턴
    	public static Cookie createCookie(String name, String value, String domain, String path, int maxAge) throws IOException {
    		Cookie cookie = new Cookie(name, URLEncoder.encode(value, "UTF-8"));
    		cookie.setDomain(domain);
    		cookie.setPath(path);
    		cookie.setMaxAge(maxAge);
    		return cookie;
    		
    	}
    }

    Cookies Utilの使用


    1)Cookieの作成


    makeCookieUsingCookies.jsp

    <%@page import="util.Cookies"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8"%>
    <%
    	response.addCookie(
    			Cookies.createCookie("id", "ddit", "/", -1)
    			// -1 : 웹 브라우저를 종료하면 사라짐 (default)
    			);	
    %>
    <!DOCTYPE html>
    <html>
    <head>
    <title>Cookies 클래스 사용 예</title>
    </head>
    <body>
    <a href="/chapter09/readCookieUsingCookies.jsp">생성된 쿠키 정보 확인</a>
    
    <!-- 
    	쿠키 핵심 정리
    	1. 쿠키 생성
    		Cookie cookie = new Cookie("name", "a001");
    		response.addCookie(cookie);
    	
    	2. 쿠키 사용
    	1) 전체를 가져옴
    		Cookie[] cookies = request.getCookies();
    		cookies[0].getName();
    		cookies[0].getValue();
    	2) 하나를 가져옴
    		Cookie cookie = new Cookie("name", "a001");
    		cookie.getName();
    		cookie.getValue();
     -->
    </body>
    </html>

    2)Cookieの読み取り


    readCookieUsingCookies.jsp

    <%@page import="util.Cookies"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8"%>
    <%
    	//Cookie[] cookies = request.getCookies();
    	Cookies cookies = new Cookies(request);
    %>
    <!DOCTYPE html>
    <html>
    <head>
    <title>Cookies 클래스 사용</title>
    </head>
    <body>
    <%=cookies.getValue("id") %>
    </body>
    </html>

    Cookieの適用(ログイン)


    top.jspへのログインの追加(Cookieを使用)

  • Cookieを使用してログイン
  • を実行
  • ログインしていない場合はログインボタンが表示され、ログインしている場合はログアウトボタンが表示され、合計
  • .
  • ログインボタンをクリックすると、右画面にログインできる入力ウィンドウが表示され、ログイン=>loginが実行されます.jsp->login 2に移動します.jsp
  • へ流れる
  • ログインに成功した場合は、Cookieに適用されるIDを入力してください.
  • をクリックしてログアウトし、ログアウトします.jsp
  • に移動

    1) top.jsp

    <%@page import="util.Cookies"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8"%>
    상단 메뉴 : 
    <a href="<%=request.getContextPath() %>/chapter07/layout.jsp"></a>&nbsp;
    <a href="<%=request.getContextPath() %>/chapter07/info.jsp">정보</a>&nbsp;
    &nbsp;&nbsp;&nbsp;
    <%
    	//cookieMap.put(cookies[i].getName(), cookies[i]);
    	Cookies cookies = new Cookies(request);
    	
    	//id라는 이름의 쿠키가 존재하면 실행
    	if(cookies.exists("id")) { //로그인 상태
    		out.print(cookies.getValue("id") + "님 환영합니다.");
    %>
    		<input type="button" value="로그아웃" onclick="fn_logout()">
    	<%}else { //로그인 안됨 %>
    		<input type="button" value="로그인" onclick="fn_login()">
    	<%}	%>
    <script type="text/javascript">
    	function fn_logout() {
    		location.href = "/chapter09/logout.jsp";
    	}
    	
    	function fn_login() {
    		//layout.jsp를 복사한 후 내용부분에 chapter09/loginForm.jsp를 include
    		location.href="/chapter07/login.jsp";
    	}
    </script>

    2) login.jsp

  • layout.jsp部では、登録ウィンドウ
  • が右側画面に表示する.
    <%@ page language="java" contentType="text/html; charset=UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <title>login</title>
    </head>
    <body>
    	<table border="1" style="width: 100%;" cellpadding="0" cellspacing="0">
    		<tr>
    			<td colspan="2">
    				<jsp:include page="/module/top.jsp"  flush="false" />  
    			</td>
    		</tr>
    		<tr>
    			<td style="width: 30%" valign="top">
    				<jsp:include page="/module/left.jsp" />
    			</td>
    			<td>
    				<!-- 내용 부분 : 시작 -->
    				<jsp:include page="/chapter09/loginForm.jsp" flush="false"></jsp:include>
    				<!-- 내용 부분 : 끝 -->
    			</td>
    		</tr>
    		<tr>
    			<td colspan="2">
    				<jsp:include page="/module/bottom.jsp" />
    			</td>
    		</tr>
    	</table>
    </body>
    </html>

    3) loginForm.jsp

  • 右画面のログインウィンドウ(ログインを入力する画面(フォーム)
  • )
    <%@ page language="java" contentType="text/html; charset=UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <title>로그인 폼</title>
    </head>
    <body>
    	<form action="<%= request.getContextPath() %>/chapter09/login.jsp" method="post">
    		아이디 <input type="text" name="id" size="10"><br>
    		비밀번호<input type="password" name="password" size="10"><br>
    		<input type="submit" value="로그인">
    	</form>
    </body>
    </html>
  • ログイン入力ウィンドウ
  • 4) login2.jsp

  • フォームラベルの登録ボタンをクリックし、POSTで動作値
  • に移動します.
  • 実登録処理
  • cookie
  • は、ユーザ名がa 001、パスワードが1234の場合にのみ適用される.
  • クッキーを適用する場合、Cookies Util,
  • を使用します.
  • ログインに成功した場合、カウントダウン5秒後にレイアウトされます.jsp画面に移動
    -ログインに失敗した場合は、ログイン失敗アラートを発行し、前の画面
  • に移動します.
    <%@page import="util.Cookies"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%
    String id = request.getParameter("id");
    String password = 
    	request.getParameter("password");
    //아이디가 a001이면서 동시에 비밀번호가 1234인 경우 로그인 성공
    if(id.equals("a001")&&password.equals("1234")){
    // 	Cookie cookie = new Cookie("id",id);	
    	response.addCookie(
    			Cookies.createCookie("id", id, "/", -1)
    	);	
    %>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>로그인 성공</title>
    </head>
    <body>
    	로그인에 성공했습니다.<br />
    	<div class="count" style="font-size:1.2em;">5초 뒤에 메인화면으로 이동합니다.</div>
    <script type="text/javascript">
    const countDisplay = document.querySelector(".count");
    
    //1초마다 countDown 함수를 실행
    setInterval(countDown, 1000);
    var time = 5;	//5초
    function countDown(){
    	if(time>0){	//5 4 3 2 1 
    		time--;
    		countDisplay.innerText = time + "초 뒤에 메인화면으로 이동합니다.";
    	}else{	//0
    		location.href="/chapter07/layout.jsp";
    	}
    }
    </script>
    </body>
    </html>
    <%
    }else{	//로그인 실패 시
    	out.print("<script>alert('로그인 실패');history.go(-1);</script>");
    }
    %>
    
    
    
    
  • メイン画面より前の秒数は画面
  • 登録後のメイン画面
  • ログイン失敗時アラーム
  • alert後、前の画面に移動
  • 5) logout.jsp

  • 「id」という名前の既存のCookieの値を「」(NULL値)として作成し、setMaxAge(0)を使用して有効時間を0=>Cookie削除の効果
  • とする.
    <%@ page language="java" contentType="text/html; charset=UTF-8"%>
    <%
    	Cookie cookies = new Cookie("id", "");
    	//유효시간을 0으로 설정 => 쿠키가 삭제되는 효과
    	cookies.setMaxAge(0);
    	cookies.setPath("/"); //생성할 때 "/"로 생성해서 삭제할 때도 해줘야됨
    	response.addCookie(cookies);
    %>
    <!DOCTYPE html>
    <html>
    <head>
    <title>로그아웃</title>
    <script type="text/javascript">
    	function fn_main() {
    		var chk = confirm("메인화면으로 이동하시겠습니까?");
    		if(chk) {
    			location.href="/chapter07/layout.jsp"
    		}
    	}
    </script>
    </head>
    <body>
    로그아웃 되었습니다.<br>
    <input type="button" value="메인" onclick="fn_main()">
    
    </body>
    </html>
  • ログアウトボタンをクリックし、メインボタンをクリックします.
  • ログアウト後メイン画面を移動