쿠키와 세션 - <hidden> 태그와 URL Rewriting을 이용해 웹페이지 연동하기
클라이언트와 서버 간에 정보를 교환하는데 클라이언트 PC 또는 서버의 메모리에 저장해 두고 사용하면 프로그램의 속도를 향상시킬 수 있다.
쇼핑몰을 이용할 때 메인 페이지에서 미리 로그인한 후 다른 웹 페이지에서 상품에 관한 댓글을 다는 경우가 있다. 글쓰기 창에서는 따로 로그인하지 않아도 된다. 하지만, 로그인을 하지 않았을 경우에는 '로그인 후 이용하세요'라는 메시지가 나타난다.
이 기능은 쇼핑몰을 이용하는 사람들은 다 알지만 실제 HTTP 프로토콜 방식으로 통신하는 웹페이지는 서로 어떤 정보도 공유하지 않는다.
사용자 입장에서 웹 페이지 상태나 정보 공유를 위해서는 프로그래머가 세션 트래킹(Session Tracking)이라는 웹 페이지 연결 기능을 구현해야 한다.
HTTP 포로토콜
- 서버-클라이언트 통신 시 stateless 방식으로 통신
- 브라우저에서 새 웹페이지를 열면 기존의 웹페이지나 서블릿에 관한 어떤 연결 정보도 유지하지 않음
- 새로 열린 페이지에서 어떤 정보도 알 수 없음
- 페이지가 서로 독점적이어서 서로의 상태를 알 수 없음
웹 페이지 연동하는 방법
- <hidden> 태그 : HTML의 <hidden> 태그를 이용해 웹 페이지들 사이의 정보 공유
<input type="hidden" value='$(id)'>
태그 사용
- URL Rewriting : GET 방식으로 URL 뒤에 정보를 붙여서 다른 페이지로 전송
second02?name=lee
-> 다음 페이지에서getParameter()
로 받아서 사용
- 쿠키 : 클라이언트 PC의 Cookie 파일에 정보를 저장한 후 웹 페이지들이 공유
- 세션 : 서버 메모리에 정보를 저장한 후 웹 페이지들이 공유
hedden과 URL Rewriting 방식은 GET 방식으로 전송하기 때문에 데이터 노출, 길이 제한, 보안 문제가 있다.
<hidden> 태그 사용
- 현재 페이지에 데이터를 숨겨놓고 연결된 다음 페이지로 데이터를 보내는 방법
- 두 웹 페이지가 데이터를 공유한다.
- 페이지 1에서
<input type="hidden" name='id' value='abcd'>
로 데이터를 숨김 -> 페이지 2에서request.getParameter()
로 받아서 사용 가능
<hidden> 태그와 URL Rewriting을 활용한 예제
login.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인창</title>
</head>
<body>
<form name="frmLogin" method="post" action="login" >
아이디 :<input type="text" name="user_id"><br>
비밀번호:<input type="password" name="user_pw" ><br>
<input type="submit" value="로그인"> <input type="reset" value="다시입력">
<!-- hidden 태그 -->
<input type="hidden" name="user_address" value="서울시 종로구" >
<input type="hidden" name="user_email" value="test@naver.com" >
<input type="hidden" name="user_hp" value="010-1111-1111" >
</form>
</body>
</html>
LoginServlet
@WebServlet(name = "LoginServlet", value = "/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(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_pw = request.getParameter("user_pw");
String user_address = request.getParameter("user_address");
String user_email = request.getParameter("user_email");
String user_hp = request.getParameter("user_hp");
String data = "<html><body>";
data += "안녕하세요!<br> 로그인하셨습니다.<br><br>";
data += "아이디 : " + user_id + "<br>";
data += "비밀번호 : " + user_pw + "<br>";
data += "주소 : " + user_address + "<br>";
data += "이메일 : " + user_email + "<br>";
data += "휴대전화 : " + user_hp;
out.print(data);
// URL Rewriting 방식 이용
user_address = URLEncoder.encode(user_address, "utf-8");
out.print("<br><br><a href='/Gradle___com_example___Servlet02_1_0_SNAPSHOT_war/second?user_id=" + user_id
+ "&user_pw=" + user_pw
+ "&user_address=" + user_address
+ "'>두 번째 서블릿으로 보내기</a>");
data = "</body></html>";
out.print(data);
}
}
SecondServlet
@WebServlet(name = "SecondServlet", value = "/second")
public class SecondServlet extends HttpServlet {
@Override
protected void doGet(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_pw = request.getParameter("user_pw");
String user_address = request.getParameter("user_address");
out.println("<html><body>");
if (user_id != null && user_id.length() != 0) {
out.println("이미 로그인 상태입니다 <br><br>");
out.println("첫 번째 서블릿에서 넘겨준 아이디 : " + user_id + "<br>");
out.println("첫 번째 서블릿에서 넘겨준 비밀번호 : " + user_pw + "<br>");
out.println("첫 번째 서블릿에서 넘겨준 주소 : " + user_address + "<br>");
out.println("</body></html>");
} else {
out.println("로그인 하지 않았습니다. <br><br>");
out.println("다시 로그인하세요! <br>");
out.println("<a href='login.html'>로그인창으로 이동하기</>");
}
}
}
'Back > Servlet' 카테고리의 다른 글
쿠키와 세션 - 세션을 이용한 웹 페이지 연동 기능 (0) | 2021.12.30 |
---|---|
쿠키와 세션 - 쿠키를 이용한 웹 페이지 연동 기능 (0) | 2021.12.29 |
서블릿 포워드(Servlet Forward) (0) | 2021.12.29 |
[Intellij]서블릿 DB연동(4) - 커넥션 풀 (DBCP: Connection Pool) (0) | 2021.12.28 |
서블릿 DB 연동(3) (0) | 2021.12.28 |