BLOG ARTICLE 프로그래밍 | 42 ARTICLE FOUND

  1. 2009.03.23 JSP에서 폼 데이터 처리
  2. 2009.03.18 쿼리스트링(Query String) 2
  3. 2009.03.17 쿠키 및 세션을 이용한 카운터
  4. 2009.03.17 세션
  5. 2009.03.17 쿠키

앞서 폼으로부터 입력된 값을 프로그램으로 전달하는 방법 두 가지(GET/POST)와 각각의 차이점에 대해서 설명하였다. 다음은 각각의 방법을 이용하여 데이터를 프로그램으로 전달하는 방법의 차이점을 보여주고 있다. 특히 그림에서 URL 주소 입력창을 주의깊게 살펴보면 그 차이를 알 수 있다. 그러면 먼저 GET 방식으로 폼 데이터를 전달할 경우를 살펴보자.

다음은 아이디와 비밀번호를 입력받아 그 값을 GET 방식으로 프로그램 "loginGET.jsp"에 전달 실행하기위한 HTML 코드이다.

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>입력 폼</title>
</head>
<body>
<form name="form" method="get" action="loginGet.jsp">
<table border="0" cellpadding="2" cellspacing="0">
    <tr>
        <td width="75">
            <p align="right">
            <font size="2">아이디</font>
        </td>
        <td width="195">
            <p><font size="2">
            <input type="text" name="id" maxlength="20">
            </font>
        </td>
    </tr>
    <tr>
        <td width="75">
            <p align="right"><font size="2">비밀번호</font>
        </td>
        <td width="195">
            <p><font size="2">
            <input type="password" name="pass" maxlength="20">
            </font>
        </td>
    </tr>
    <tr>
        <td width="75">
            <p align="right"><font size="2">&nbsp;</font>
        </td>
        <td width="195">
            <p><font size="2">
            <input type="submit" value="로그인" maxlength="20">
            </font>
        </td>
    </tr>
</table>
</form>
</body>
</html>

사용자 삽입 이미지

loginGet.html 실행결과


이 프로그램에서 아이디와 비밀번호를 입력받는 창의 이름이 각각 "id"와 "pass"로 지정되었다. 그리고 각 창에 입력된 값이 각각 "ysoh"와 "JSP"라 한 후 "로그인"버튼을 클릭했다고 가정하자. 그러면 다음 프로그램 "loginGet.jsp"를 실행하면서 페이지의 내용이 바뀐다.

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
아이디 : <%= request.getParameter("id") %><br />
비밀번호 : <%= request.getParameter("pass") %><br />
</body>
</html>

사용자 삽입 이미지

loginGet.jsp 실행결과



이 때 주소창 URL 주소를 살펴보면

id=ysoh&pass=JSP

과 같이 쿼리스트링을 이용하여 프로그램 "loginGet.jsp"로 아이디와 비밀번호를 전달하고 있음을 알 수 있다. 눈치가 빠르신 분들은 이미 알겠지만 쿼리스트링을 보면 쿼리스트링에 주어진 변수 "id"와 "pass"는 "loginGet.html" 폼의 <INPUT> 태그의 속성 중 NAME 속성의 값에서 비롯된 것이다. 또한 쿼리스트링에 주어진 값 "ysoh"와 "JSP"는 사용자가 폼에서 입력한 값임을 알 수 있다. 이 처럼 GET 방식의 경우 "<INPUT>" 태그의 NAME 속성의 값과 그 폼에 입력된 값이 쌍을 이루어 쿼리스트링을 구성하게 된다. 우리는 이미 쿼리스트링 통해 전달된 데이터를 JSP 프로그램에서 처리하는 방법을 배웠다. 그러므로 프로그램 내에서 request 객체의 getParameter 메소드를 이용

request.getParameter("id")
request.getParameter("pass")

와 같이 처리함으로써 입력된 값 "ysoh"와 "JSP"를 가져올 수 있다. 그러나 위 예제에서는 쿼리스트링을 통해 데이터를 전달하므로 비밀번호와 같이 보안이 유지되어야 하는 데이터가 그대로 노출되는 문제점이 발생한다. 그러므로 이러한 경우에는 GET 방식을 통한 데이터의 전달이 아닌 POST 방식을 통한 데이터의 전달을 사용한다.

다음 프로그램 "loginPost.html"는 "loginGet.html"에서 "Form" 태그의 "Method" 속성값 GET을 POST로 바꾼 것이다.

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>입력 폼</title>
</head>
<body>
<form name="form" method="post" action="loginGet.jsp">
<table border="0" cellpadding="2" cellspacing="0">
    <tr>
        <td width="75">
            <p align="right">
            <font size="2">아이디</font>
        </td>
        <td width="195">
            <p><font size="2">
            <input type="text" name="id" maxlength="20">
            </font>
        </td>
    </tr>
    <tr>
        <td width="75">
            <p align="right"><font size="2">비밀번호</font>
        </td>
        <td width="195">
            <p><font size="2">
            <input type="password" name="pass" maxlength="20">
            </font>
        </td>
    </tr>
    <tr>
        <td width="75">
            <p align="right"><font size="2">&nbsp;</font>
        </td>
        <td width="195">
            <p><font size="2">
            <input type="submit" value="로그인" maxlength="20">
            </font>
        </td>
    </tr>
</table>
</form>
</body>
</html>

사용자 삽입 이미지

loginPost.html 실행결과


POST를 이용한 폼 데이터의 전달 역시 GET과 마찬가지로 프로그램에서 처리할 때 NAME 속성의 값을 request.getParameter 메소드의 파라메터값으로 넘기면 해당 창에 입력된 값을 읽을 수 있다. 그러므로 프로그램 "loginPost.jsp"는 "loginGet.jsp"와 완전 동일하다.

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
아이디 : <%= request.getParameter("id") %><br />
비밀번호 : <%= request.getParameter("pass") %><br />
</body>
</html>

사용자 삽입 이미지

loginPost.jsp 실행결과


그러나 "loginPost.jsp"가 실행될 때 URL 주소를 살펴보면 "loginGet.jsp"가 실행될 때와는 달리 쿼리스트링이 없음을 알 수 있다. 그러므로 로그인과 같이 보안이 유지될 필요가 있는 경우라면 반드시 폼 데이터를 전달할 때 표준입출력을 통하여 내부적으로 처리되어 눈으로 확인 불가능 한 POST 방식을 사용해야 한다.
 

'프로그래밍 > JSP' 카테고리의 다른 글

JDBC 드라이버를 이용한 JSP와 MySQL 연동  (0) 2009.03.30
웹프로그램의 개발 목적  (0) 2009.03.24
쿼리스트링(Query String)  (2) 2009.03.18
쿠키 및 세션을 이용한 카운터  (0) 2009.03.17
세션  (0) 2009.03.17
AND

쿼리스트링은 사용자가 웹프로그램으로 입력 데이터를 전달하는 가장 단순하고 또한 널리 사용되는 방법이다. 이 방법은 URL 주소 뒤에 입력 데이터를 함께 제공하는 방법으로 다음과 같은 형식을 취한다.

http://hostname[:port]/folder/file?변수1=값1&변수2=값2&변수3=값3

위 형식에서 "?" 뒤의 굵은 이탤릭체로 표현된 부분이 쿼리스트링 이다. URL 주소와 쿼리스트링은 "?"로 구분되며 변수와 값의 쌍(변수=값)으로 구성된다. 만약 여러 쌍의 변수와 값을 전달할 경우 각각의 쌍을 "&"로 구분해주면 된다.

다음 URL을 살펴보자.

http://localhost:8080/JSPLecture/queryStr.jsp?no=200058001&name=Hong

위 URL은 localhost의 프로그램 "queryStr.jsp"를 실행할 때 두 개의 입력 데이터(no=200058001, name=Hong)를 가지고 실행하라는 의미이다. 그러면 JSP 프로그램에서는 쿼리스트링에 주어진 데이터를 request 객체의 getParameter 메소드를 이용하여 쿼리스트링을 처리하면 된다.

다음 프로그램 "queryStr.jsp"에서 주어진 쿼리스트링을 처리하는 방법에 대해 잘 살펴보자. 단 다음 프로그램을 실핼할 때 주소창에 위에 주어진 URL

http://localhost:8080/JSPLecture/queryStr.jsp?no=200058001&name=Hong

을 입력했다고 가정하자.

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
    당신의 학번은 <b><%= request.getParameter("no") %></b> 입니다. <br />
    당신의 이름은 <b><%= request.getParameter("name") %></b> 입니다. <br />
</body>
</html>

사용자 삽입 이미지

queryStr.jsp?no=200058001&name=Hong 실행결과


프로그램 "queryStr.jsp"를 살펴보면 두 번의 request.getParameter 메소드가 사용되고 있다. 먼저 첫 번째 메소드

request.getParameter("no")

는 쿼리스트링의 첫 번째 부분인 "no=200058001"를 처리하기위한 코드로 결과값으로 "200058001"을 저장하고 있으며

request.getParameter("name")

는 쿼리스트링의 두 번째 부분인 "name=Hong"를 처리하기위한 코드로 결과값으로 "Hong"을 저장하고 있다. 이 예를 통해 알 수 있듯 request.getParameter 메소드의 파라메터는 쿼리스트링을 구성하고 있는 "변수"="값"의 쌍 중 변수의 이름이 된다. 그러면 그 변수와 쌍을 이룬 값이 결과가 된다.

만약 쿼리스트링을 생략하고 주소창에

http://localhost:8080/JSPLecture/queryStr.jsp

만을 입력했다면 request.getParameter("no"), request.getParameter("name") 모두 값을 읽을 수 없으므로 null이 되어 다음과 같은 결과를 보인다.


사용자 삽입 이미지

쿼리스트링을 생략하고 queryStr.jsp를 실행한 결과



그러면 다음과 같이 쿼리스트링에 공백이 입력된 경우를 살펴보자.

http://localhost:8080/JSPLecture/queryStr.jsp?no=200058001&name=Hong Gil Dong

위 URL을 주소창에 입력하고 엔터키를 쳐보자.


그러면 입력한 URL이 다음과 같이 공백 부분이 "%20"으로 대치되어 프로그램이 실행되고 있음을 볼 수 있다.

http://localhost:8080/JSPLecture/queryStr.jsp?no=200058001&name=Hong%20Gil%20Dong

이는 예전의 브라우저가 쿼리스트링에 주어진 공백문자를 만나면 쿼리스트링의 끝으로 인식 그 뒤의 문자는 처리하지 않았기 때문이다. 따라서 공백문자를 처리하기 위해 몇 가지 편법을 사용하였는데 그 공백을 대신한 문자가 "%20" 이다. 그러므로 "queryStr.jsp" 실행 결과를 살펴보면 request.getParameter("name")에 의해 출력되는 값이 "Hong%20Gil%20Dong"이 아닌 "Hong Gil Dong"으로 올바르게 출력되고 있다.

사용자 삽입 이미지

쿼리스트링에 공백문자가 주어진 경우

[그림 7-2] 공백이 포함된 Query String

"%20" 이외에도 URL에서 공백문자를 처리하기 위한 또 다른 방법이 있는데 "%20" 대신 "+"를 사용하는 방법이다. "+" 역시 URL에서 사용되면 프로그램 내에서는 공백으로 처리되어 출력된다. 그러므로 다음 세 개의 URL은 모두 같은 결과를 출력한다.

http://localhost:8080/JSPLecture/queryStr.jsp?no=200058001&name=Hong Gil Dong
http://localhost:8080/JSPLecture/queryStr.jsp?no=200058001&name=Hong+Gil+Dong
http://localhost:8080/JSPLecture/queryStr.jsp?no=200058001&name=Hong%20Gil%20Dong

그러면 "queryStr.jsp"를 실행항 결과로 다음 그림과 같이 출력되게 하려면 쿼리스트링을 어떻게 줘야 할까 생각해 보자.

사용자 삽입 이미지

"+" 및 "=" 출력


위 결과를 보면 화면에 "+" 및 "="을 출력하고 있다. 그러나 URL에서 이 두 문자를 사용하면 "+"는 화면상에 공백으로 그리고 "="은 쿼리스트링의 "변수=값"의 형식에서 관계를 위해 사용되므로 올바르게 출력되지 않는다. 이를 위해서는 "+"과 "="을 위한 두 자리 16진수 문자코드(ASCII 호환)를 "%" 뒤에 써 주면 된다. 앞에서 공백을 위해 사용된 "%20" 역시 공백을 위한 두 자리 16진수 코드를 의미한다.

공백문자와 같이 변경이 필요한 특수 문자들은 다음과 같다.

화면출력URL문자 또는 코드
화면출력URL문자 또는 코드
공백
+%%25
&
%26+%2B
=%3D?%3F


그러므로 수식 "2 + 3 = 100"을 출력하기 위한 쿼리스트링은

"2+%2B+3+%3D+100" 또는 "2%20%2B%203%20%3D%20100"
 
이므로 다음과 같은 URL을 프로그램 "queryStr.jsp"에 전달하면 위 그림과 같은 결과를 얻을 수 있다.

http://localhost:8080/JSPLecture/queryStr.jsp?no=200058001&name=2+%2B+3+%3D+100

또는

http://localhost:8080/JSPLecture/queryStr.jsp?no=200058001&name=2%20%2B%203%20%3D%20100

'프로그래밍 > JSP' 카테고리의 다른 글

웹프로그램의 개발 목적  (0) 2009.03.24
JSP에서 폼 데이터 처리  (0) 2009.03.23
쿠키 및 세션을 이용한 카운터  (0) 2009.03.17
세션  (0) 2009.03.17
쿠키  (0) 2009.03.17
AND

쿠키를 이용한 카운터

다음 프로그램 "cCounter.jsp"는 쿠키를 이용해 카운터를 구현한 프로그램이다. 쿠키는 브라우저별로 각각 저장 관리되므로 이 프로그램은 프라우저별로 각각 1에서 시작하여 브라우저의 새로고침 버튼을 클릭할 때 마다 1 씩 증가된다.

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%
Cookie [] cookieArray = request.getCookies(); // 브라우저에서 전달된 모든 쿠키 저장
Cookie cookie = null;
int countNum = 0;
String countStr = "";

if(cookieArray != null) { // 브라우저에서 전달된 쿠키정보가 있다면
   for(int i = 0; i < cookieArray.length; i++) { // 전달된 모든 쿠키를 검사하며,
      if(cookieArray[i].getName().equals("counter")) { // "counter"란 이름의 쿠키정보를 찾아
         cookie = cookieArray[i]; // 저장하고
         break; // for문을 빠져나간다.
      }
   }
}
if(cookie != null) { // "counter"란 이름의 쿠키가 있으면
   countNum = Integer.parseInt(cookie.getValue()) + 1; // 값을 정수로 변환한 다음 1 증가한 후
   countStr = Integer.toString(countNum); / 다시 증가된 값을 문자열로 변환한 후
   cookie.setValue(countStr); // "counter"란 이름의 쿠키값을 새롭게 설정한다.
}
else { // "counter"란 이름의 쿠키가 없으면
   cookie = new Cookie("counter", "1"); // counter란 이름으로 초기값 1인 쿠키를 생성한다.
}

response.addCookie(cookie); // "counter"란 이름의 쿠키와 그 값을 클라이언트에 전달한다.
%>
<h2>당신은 <%=cookie.getValue()%>
번째 방문하셨습니다.</h2>
</body>
</html>

사용자 삽입 이미지

cCounter.jsp 실행결과


위 프로그램은 브라우저에서 전달된 쿠키 중 쿠키이름이 "counter"인 쿠키의 쿠키값을 찾는다. 만약 "counter"라는 이름의 쿠키가 없으면 "counter"란 이름과 1을 초기값으로 하는 쿠키를 생성한 후 response.addCookie 메소드를 이용 클라이언트에 쿠키를 저장한다. 만약 "counter"란 이름의 쿠키가 있다면 해당 쿠키의 값을 읽어 그 값을 하나 증가시킨 후 다시 지정한 후 클라이언트에 저장한다. 

사용자 삽입 이미지

cCounter.jsp의 원리


위 그림은 프로그램 "cCounter.jsp"의 처리과정을 도식화한 것이다. 좌측의 사각형은 클라이언트를 우측의 사각형은 서버를 나타낸다. "cCounter.jsp"으로의 첫 접속에서는 지정된 쿠키가 없으므로 클라이언트에서 서버로 전달되는 쿠키 또한 없다. 따라서 "cCounter.jsp"는 "counter"/"1"을 쌍으로 하는 쿠키를 생성하고 결과에 해당 쿠키를 클라이언트에 전달한다. 그러면 두 번째 접속에서 클라이언트는 저장된 쿠키 "counter"/"1"을 서버로 전달하고 "cCounter.jsp"는 하나 증가시킨 값으로 재 설정 "counter"/"2"를 쌍으로 하는 쿠키를 생성하고 결과에 해당 쿠키를 클라이언트에 새롭게 전달한다. 세 번째 접속에서는 쿠키 "counter"/"2"가 서버로 전달되고 서버는 "counter"/"3"으로 쿠키를 재 설정해 클라이언트로 전달한다. 그러므로 재 접속이 요구될 때 마다 하나 증가된 값이 서버로부터 클라이언트에 저장되게 된다.

세션을 이용한 카운터

아래 프로그램 "sCounter.jsp"은 세션을 이용해 카운터 프로그램을 작성한 것이다. 이 프로그램 역시 쿠키로 구현한 프로그램과 마찬가지로 브라우저별로 1부터 시작 재 접속이 요구될 때 마다 하나 씩 증가된다.

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%
Integer countNum =(Integer)session.getAttribute("counter"); 
//  "counter" 이름의 세션값을 저장한다.
if(countNum == null) // "counter"란 이름의 세션값이 없으면
{
   countNum = new Integer(1); // 초기값으로 1을 저장하고
}
else // "counter"란 이름의 세션값이 있으면
{
   int num = countNum.intValue(); // 그 값을 정수로 변환한 후
   num++; // 그 값을 하나 증가시킨 후 
   countNum = new Integer(num); // 증가된 값으로 저장한다.
}

session.setAttribute("counter", countNum)
// 새롭게 지정된 값을 "counter"란 이름과 함께 저장한다.
%>
<h2>당신은 <%=countNum.intValue()%>
번째 방문하셨습니다.</h2>
세션ID : <%= session.getId() %>
</body>
</html>

사용자 삽입 이미지

sCounter.jsp 실행결과


위 프로그램은 "cCounter.jsp"와 비교하여 쿠키 대신 세션을 이용했다는 차이점을 제외하면 구현 원리는 유사하다. 이 프로그램 역시 "counter"란 이름으로 저장된 세션이름이 있는지 찾은 후 없으면 초기값을 1로 가지는 "counter"라는 이름의 세션을 만들고 "counter"라는 이름의 세션이 있다면 그 값을 하나 증가시켜 다시 지정한다.

사용자 삽입 이미지

sCounter.jsp의 원리


위 그램은 "sCounter.jsp"의 처리관정을 도식화 한 것이다. 이 그림에서 최초 접속 시 클라이언트는 서버로 전달하는 세션정보 "JSESSIONID"가 없다. 따라서 "sCounter.jsp"에서는 "counter"란 이름의 세션 역시 찾을 수 없기 때문에 if 문의 조건식 

countNum == null

가 참이되어 초기값을 1로 하는 "counter"란 이름의 세션을 생성 서버에 저장한다. 그리고 이와 동시에 서버는 고유한 세션아이디를 생성 클라이언트에 "JSESSIONID"란 이름과 함께 쿠키로 전달한다. 그러면 두 번째 접속부터 클라이언트는 서버에 "JSESSIONID"/"세션아이디"를 쌍으로 하는 쿠키정보를 서버에 전달하게 된다. 그러면 서버는 클라이언트에서 전달된 세션아이디를 가지고 그와 관련된 저장공간에서 "counter"란 이름과 함께 쌍으로 저장된 값을 찾아 그 값을 하나 증가시킨 후 새롭게 변경된 세션정보를 다시 서버에 저장한다.

'프로그래밍 > JSP' 카테고리의 다른 글

JSP에서 폼 데이터 처리  (0) 2009.03.23
쿼리스트링(Query String)  (2) 2009.03.18
세션  (0) 2009.03.17
쿠키  (0) 2009.03.17
continue, break 문  (1) 2009.03.09
AND

세션

프로그래밍/JSP 2009. 3. 17. 15:10
세션은 서버가 저장 관리하는 웹프로그램의 실행에 필요한 정보로 쿠키와 같은 목적으로 사용되나 필요한 정보를 클라이언트가 아닌 서버가 가지고 있다는 점에서 차이가 있다. 세션은 다음과 같은 처리과정을 거친다.

우선 세션아이디라 불리는 연결과 관련된 고유값 생성하고 "JSESSIONID"라는 쿠키이름과 세션아이디를 쿠키값으로 가지는 쿠키의 생성과 동시에 서버에 세션아이디로 구분할 수 있는 저장공간 생성한 후 setAttribute 메소드에 의해 만들어진 세션정보를 생성된 공간에 저장한다. 그 후 해당 클라이언트로부터 접속이 이루어지면 해당 클라이언트는 "JSESSIONID"/"세션아이디"의 쌍으로 이루어진 쿠키 정보도 함께 전달한다. 그러면 서버는 이 쿠키정보로부터 전달된 세션아이디를 추출 이와 관련된 저장공간으로부터 세션정보를 읽는다.

JSP에서 세션은 session 객체에 의해 처리된다. seession 객체에서 사용되는 중요 메소드는 다음과 같다.

 Method

 설명

 String getId()

 현재 사용자의 고유한 세션id를 반환받음

 boolean isNew()

 사용자 컴퓨터에 세션 ID의 존재 여부를 반환 (만들어지지 않은 경우 true)

 void setMaxInactiveInterval(time)

 세션의 지속 시간을 초 단위로 결정

 Int getMaxInactiveInterval()

 현재 설정된 세션의 지속 시간을 초로 환산

 void setAttribute(string name, object value)

 현재 세션에 새로운 이름과 값의 속성을 저장

 Enumeration getAttributeNames()

 현재 세션에 저장된 모든 속성들의 이름을 Enumeration 형으로 반환

 void invalidate()

 현재 세션에 저장된 모든 속성을 삭제


세션 설정

세션의 설정은 session 객체의 setAttribute 메소드를 이용하며, 쿠키와 마찬가지로 "세션이름"/"세션값"의 쌍으로 생성된다.

다음 프로그램 "addSession.jsp"는 세션설정의 방법을 보여준다.

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%
String id = "lovejsp";
String pass = "1234";
session.setAttribute("sid", id);
session.setAttribute("spass", pass);
%>
세션을 설정했습니다.
</body>
</html>

사용자 삽입 이미지

addSession.jsp 실행결과



위 프로그램에서는 session.setAttribute 메소드를 이용 "sid"와 "spass"라는 세션이름에 각각 세션값  "lovejsp"와 "1234"의 쌍을 이루어 지정하였다. 이 정보는 서버의 어딘가에 고유세션아이디와 관련된 영역을 만들어 저장된다.

세션 읽기

지정된 세션은 session 객체의 getAttribute 메소드를 이용 프로그램에서 활용할 수 있다. 이 메소드에서 필요한 파라메터는 세션지정시 설정된 세션이름으로 이름과 연관되어 저장된 값을 얻을 수 있다. 다음 프로그램 "getSession.jsp"를 살펴보자.

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
세션아이디 <%= session.getId() %>
<br />
<%
String myid = (String)session.getAttribute("sid");
String mypass = (String)session.getAttribute("spass");
%>
아이디는 <%=myid%> 이고, 비밀번호는 <%=mypass%> 입니다.
</body>
</html>

사용자 삽입 이미지

getSession.jsp 실행결과



위 프로그램은 세션이름 "sid"와 "spass"에 저장된 값을 읽어 출력하고 있다. 따라서 프로그램 "addSession.jsp"에 의해 각각 값이 "lovejsp", "1234"가 저장되었으므로 위 프로그램의 출력 역시

"아이디는 lovejsp 이고 비밀번호는 1234 입니다"

가 출력된다. 만약 브라우저가 실행된 후 "addSesseio.jsp"가 실행되지 않고 바로 "getSession.jsp"가 실행되었다면 세션이름 "sid"와 "spass"로 서버에 저장된 값이 없으로므 그 결과는 다음과 같이 해당 값이 null로 처리되어 출력된다.

여기서 "JSESSIONID" 이름의 쿠키와 현재 세션아이디를 반환하는 session 객체의 getId의 결과를 프로그램 "SessionID.jsp"를 통해 살펴보자.

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
세션아이디 : <%= session.getId() %>
<br/><br/>
<table border="1">
<tr>
<td>쿠키이름</td>
<td>쿠키값</td>
<%
    Cookie [] cookie = request.getCookies();
   
    for(int i = 0; i < cookie.length; i++)
    {
%>
    <tr>
    <td><%=cookie[i].getName()%></td>
    <td><%=cookie[i].getValue()%></td>
    </tr>
<%
    }
%>
</table>
</body>
</html>

사용자 삽입 이미지

sessionID.jsp 실행결과


위 프로그램의 결과를 살펴보면 session.getId()에 의해 얻어진 값과 쿠키이름 "JSESSIONID"에 저장된 쿠키값이 일치함을 알 수 있다. 결과적으로 "JSESSIONID"에 저장된 쿠키값이 세션아이며 클라이언트에서 전달된 이 세션아이디를 통해 서버에 저장된 관련 세션정보를 찾게된다.

세션삭제

세션아이디는 기본적으로 한번 지정된 후 브라우저가 종료될 때까지 유지되었다가 브라우저 종료 후 새로 실행되면 새로운 세션아이디가 부여된다. 그러나 session.invalidate() 메소드를 이용하면 브라우저를 종료하지 않고 새로운 세션아이디를 부여할 수 있다. 다음 프로그램 "delSession.jsp"를 살펴보자.

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<% session.invalidate(); %>
기존 세션아이디 <%= session.getId() %>를 삭제하고 새로운 세션아이디를 부여했습니다.
</body>
</html>

사용자 삽입 이미지

addSession.jsp 실행결과

사용자 삽입 이미지

getSession.jsp 실행결과

사용자 삽입 이미지

delSession.jsp 실행결과

사용자 삽입 이미지

delSession.jsp 실행 후 getSession.jsp 실행결과


위 프로그램은 session.invalidate() 메소드에 의해 새로운 세션아이디를 부여한다. 그러므로
"addSession.jsp", "getSession.jsp", "delSession.jsp", "getSession.jsp"을 순서대로 실행하면 맨 마지막 실행한 "getSession.jsp"의 세션아이디가 새롭게 부여되어 변경되었음을 확인할 수 있으며, 이에 따라 새로 부여된 세션아이디로 지정된 "sid"와 "spass"값은 없으므로 null로 출력된다.

'프로그래밍 > JSP' 카테고리의 다른 글

쿼리스트링(Query String)  (2) 2009.03.18
쿠키 및 세션을 이용한 카운터  (0) 2009.03.17
쿠키  (0) 2009.03.17
continue, break 문  (1) 2009.03.09
while, do 문  (0) 2009.03.09
AND

쿠키

프로그래밍/JSP 2009. 3. 17. 12:28
앞서 여행사를 통한 항공편 예약에서 설명한 바와 같이 쿠키(Cookie)는 지속적으로 필요한 사용자의 정보를 저장하기위해 사용되는 기술로 다음과 같은 특징으로 설명할 수 있다.

    웹프로그램의 실행에 필요한 정보로 클라이언트-서버 사이에서 지속적으로 관리가 필요한 정보
    서버의 필요에 의해 서버가 주체가 되어 지정되는 정보
    클라이언트(브라우저)에서 보관되고 http 접속 시 자동으로 서버로 보내지는 작은 용량의 정보

JSP에서 쿠키는 Cookie 클래스 및 request 객체와 response 객체에 의해 만들어지고 이용된다. 다음은 request 객체와 response 객체에서 쿠키와 관련된 클래스 및 메소드를 정리한 것이다.

 Method

 설   명

 Cookie(String name, String value)

 이름과 값을 가지고 쿠키 객체를 생성한다

 setValue(String value)

 쿠키의 값을 설정한다

 setMaxAge(int expiry)

 쿠키의 유효시간을 설정한다.

 setPath(String dir)

 쿠키를 전송할 경로를 설정한다.

 setDomain(String addr)

 쿠키를 전송할 도메인을 설정한다.

 getName()

 브라우저에서 전송된 쿠키의 이름을 얻는다.

 getValue()

 브라우저에서 전송된 쿠키의 값을 얻는다.


 Method

 설   명

 response.addCookie(Cookie cookie)

 생성된 쿠키를 브라우저에 전송해 저장하도록 한다.

 request.getCookies()

 브라우저에서 전송된 쿠키 정보를 이용 쿠키객체를 생성한다.


쿠키 설정

쿠키는 서버에 의해 설정된다. 쿠키는 Cookie 클래스에 의해 생성되고 생성된 쿠키 객체는 response 객체의 addCookie 메소드에 의해 클라이언트(브라우저)에 전송되고 전송된 쿠키객체의 정보는 클라이언트에 저장되어 해당 서버에 http 접속 시 자동으로 쿠키 정보가 서버로 전달된다.

형식

Cookie cookie = new Cookie(cookie_name, cookie_value);
response.addCookie(cookie);

위 형식에서 쿠키객체는 Cookie 클래스의 생성자 Cookie에 의해 생성된다. 이 때 필요한 파라메터로 쿠키이름(cookie_name)과 쿠키값(cookie_value)이 요구된다. 두 파라메터 모두 클래스 String 형식이다. 생성된 쿠키 쿠키이름과 쿠키값의 쌍을 이루며 response.addCookie 메소드에 의해 클라이언트로 전달해야 한다. 이렇게 함으로써 다음 접속부터 클라이언트로부터 쿠키 정보를 받을 수 있다. 다음 프로그램 "addCookie.jsp"는 쿠키를 설정하는 예를 보여주고 있다.

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@page import = "java.util.Date"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%
    String name = "time";
    Date date = new Date();
    String value = date.toString();

    Cookie cookie = new Cookie(name, value);
    response.addCookie(cookie);
%>
쿠키 설정을 했습니다.
</body>
</html>

사용자 삽입 이미지

addCookie.jsp 실행결과


위 프로그램에서 String 캑체 name과 Date 객체 date에 각각 "time"과 Date 객체가 생성된 당시의 날짜와 시각이 저장되어 있다. 그리고 String 객체 value에 date 객체의 날짜와 시각을 String 형으로 변환하여 저장하고 있다. 그런 다음 Cokkie 객체 cookie를 쿠키이름과 쿠키값의 쌍으로 생성하고 생성된 Cookie 객체 cookie를 response 객체의 addCookie 메소드를 이용 클라이언트에 전달 저장하도록 하고 있다. 참고로 프로그램에서 사용된 value 객체는 Cookie 생성 시 필요한 두 개의 파라메터(쿠키이름, 쿠키값)가 모두 String 형식이므로 date 객체를 직접 두 번째 파라메터로 지정할 수 없기 때문이다.

쿠키 읽기

지정된 쿠키는 서버로 접속할 때 클라이언트로부터 자동으로 전달된다고 했다. 그러면이 쿠키는 어떻게서버에서 처리할까? 이는Cookie객체의 getCookies 메소드를 이용 처리할 수 있다. 다음 프로그램 "getCookies.jsp"를 살펴보자

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<table border="1">
<tr>
<td>쿠키이름</td>
<td>쿠키값</td>
<%
    Cookie [] cookie = request.getCookies();
   
    for(int i = 0; i < cookie.length; i++)
    {
%>
    <tr>
    <td><%= cookie[i].getName() %></td>
    <td><%= cookie[i].getValue() %></td>
    </tr>
<%
    }
%>
</table>
</body>
</html>

사용자 삽입 이미지

getCookies.jsp 실행결과


위 프로그램에서 request.getCookies()는 클라이언트로부터 서버로 전달된 쿠키이름과 쿠키값의 쌍으로 이루어진 모든 쿠키정보를 읽는다. 그러므로 읽어온 쿠키정보를 프로그램에서 이용하려면 Cookie 클래스에 의해 생성된 객체에 저장해야 한다. 위 프로그램에서는 클라이언트로부터 전달된 모든 쿠키 정보를 저장하기 위해 Cookie 배열을 이용해 저장하고 있다. 쿠키정보는 이름과 값의 쌍을 이루고 있다고 했으므로 각 정보는 getName() 메소드와 getValue 메소드를 이용하면 얻을 수 있으며, 위 프로그램에서는 이 두 메소드를 이용 그 값을 출력하고 있다.

그러나 위 프로그램을 실행했을 때 다음과 같이 오류가 발생할 수 있다.

사용자 삽입 이미지

getCookies.jsp 실행오류


이런 오류가 발생하는 이유는 클라이언트에서 서버로 전달된 쿠키가 없기 때문으로 브라우저를 띄우고 처음으로 실행한 프로그램이 "getCookies.jsp" 일 때 발생한다. 따라서 클라이언트에서 전달된 쿠키를 읽기위한 메소드 getCookies는 반드시 이 메소드가 실행되기 전에 쿠키가 지정되어 있어야 한다.

쿠키 삭제

클라이언트에 저장된 쿠키는 기본적으로 브라우저가 서버로부터 쿠키 정보를 받은 후에 브라우저가 종료되기 전까지 저장되어 있다가 브라우저가 종료되면 삭제된다. 그러나 브라우저가 종료되기 전 필요에 의해 삭제하려면 어떻게 할까? 이것은 Cookie 클래스의  setMaxAge 메소드를 이용 크라이언트에 저장된 쿠키를 삭제할 수 있다. setMaxAge 메소드는 쿠키자 유지되는 시간을 지정하는 함수로 값을 0으로 설정하면 쿠키가 삭제된다.

다음 프로그램 "delCookies.jsp"는 클라이언트에 저장된 모든 쿠키를 삭제하는 프로그램이다.

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%
Cookie [] cookie = request.getCookies();
for(int i = 0; i < cookie.length; i ++) {
    cookie[i].setMaxAge(0);
    response.addCookie(cookie[i]);
}
%>
설정된 모든 쿠키를 삭제했습니다.
</body>
</html>

사용자 삽입 이미지

delCookies.jsp 실행결과


위 프로그램은 request.getCookies() 메소드를 이용 클라이언트로부터 전달된 모든 쿠키를 읽은 후 각 쿠키의 지속시간을 setMacAge(0)에 의해 0으로 설정하고 클라이언트에 다시 지정함으로써 클라이언트가 쿠키정보를 삭제하도록 하고있다. "AddCookie.jsp"와 "delCookies.jsp"를 차례로 실행한 후 "getCookies.jsp"를 실행하면 다음과 같은 결과를 얻는다.

사용자 삽입 이미지

delCookie.jsp 실행 후 getCookies.jsp 결과


위 결과에서 살펴보면 "addCookie.jsp"에서 설정된 "쿠키이름/쿠키값"의 쌍인 "time"/"설정시각"은 "del.Cookies.jsp"에 의해 삭제되었음을 확인할 수 있다. 그러나 쿠키이름이 "JSESSIONID"과 관련된 항목은 뒤에 배울 세션과 관련된 쿠키 정보로 Tomcat과 같은 JSP 컨테이너에 자동으로 생성되는 정보이므로 삭제되지 않는다.

'프로그래밍 > JSP' 카테고리의 다른 글

쿠키 및 세션을 이용한 카운터  (0) 2009.03.17
세션  (0) 2009.03.17
continue, break 문  (1) 2009.03.09
while, do 문  (0) 2009.03.09
for 문  (0) 2009.03.09
AND