티스토리 뷰
세션 트래킹
- 사용자 입장에서 웹 페이지 사이의상태나 정보를 공유하려면 프로그래머가 세션 트래킹(Session Tracking)이라는 웹
페이지 연결 기능을 구현해야 한다.
- HTTP 프로토콜은 서버-클라이언트 통신 시 stateless 방식으로 통신을 한다. 즉, 브라우저에서 새 웹 페이지를 열면
기존의 웹 페이지나 서블릿에 관한 어떤 연결 정보도 새 웹페이지에서는 알 수 없다.
웹 페이지 연동 방법
- <hidden> 태그 : HTML의 <hidden> 태그를 이용해 웹 페이지들 사이의 정보를 공유한다.
- URL Rewriting : GET 방식으로 URL 뒤에 정보를 붙여서 다른 페이지로 전송한다.
- 쿠키 : 클라이언트 PC의 Cookie 파일에 정보를 저장한 후 웹 페이지들이 공유한다.
- 세션 : 서버 메모리에 정보를 저장한 후 웹페이지들이 공유한다.
<hidden> 세션 트래킹
- <hidden> 태그는 브라우저에는 표시되지 않지만 미리 저장된 정보를 서블릿으로 전송할 수 있다.
- <hidden> 태그를 이용해 클라이언트의 데이터를 서버에 보내는 예제를 확인해 보자.
* login.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인 창</title>
</head>
<body>
<form name = "frmLogin" method="post" action="login" encType="UTF-8">
아이디 :
<input type="text" name="user_id" /><br>
비밀번호 :
<input type="password" name="user_pw" /><br>
<input type="submit" value="로그인" />
<input type="reset" value="다시 입력" />
<input type="hidden" name="user_address" value="서울시" />
<input type="hidden" name="user_email" value="test@gmail.com" />
<input type="hidden" name="user_hp" value="010-1111-2222" />
</form>
</body>
</html>
* LoginServlet.java
package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class LoginServlet
*/
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
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 + "<br>";
data += "</body></html>";
out.print(data);
}
public void destroy() {
System.out.println("destroyed");
}
}
- 코드 작성 후 톰캣을 재시작하고 브라우저에 localhost:[port]/[project_name]/login.html 을 입력해 로그인 페이지에 접속한다.
- 아이디/비밀번호 입력 후 [로그인] 버튼을 누르면 다음과 같이 입력하지 않았던 정보들도 출력된다.
URL Rewriting 세션 트래킹
- URL Rewriting을 이용해 로그인창에서 입력 받은 ID와 비밀번호를 다른 서블릿으로 전송하여 로그인 상태를 확인한다.
* LoginServlet.java
package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class LoginServlet
*/
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
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 + "<br>";
// GET 방식으로 한글을 전송하기 위해인코딩한다.
user_address = URLEncoder.encode(user_address, "utf-8");
// <a> 태그를 이용해 링크 클릭 시 서블릿 /second로다시 로그인 정보를 전송한다.
out.print("<a href='/SessionTracking/second?user_id=" + user_id + "&user_pw=" + user_pw +
"&user_address=" + user_address + "'>두 번째 서블릿으로 보내기</a>");
data += "</body></html>";
out.print(data);
}
public void destroy() {
System.out.println("destroyed");
}
}
* SecondServlet.java
package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class LoginServlet
*/
@WebServlet("/second")
public class SecondServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
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.print("<html><body>");
if( user_id != null && user_id.length() != 0 ) {
// 첫 번째 서블릿의 ID 정보를 이용해 로그인 상태를 유지한다.
out.print("이미 로그인 상태입니다!<br><br>");
out.print("첫 번째 서블릿에서 넘겨준 아이디 : " + user_id+ "<br>");
out.print("첫 번째 서블릿에서 넘겨준 비밀번호 : " + user_pw+ "<br>");
out.print("첫 번째 서블릿에서 넘겨준 주소 : " + user_address+ "<br>");
out.print("</body></html>");
}else {
// 로그인창을 거치지 않고 바로요청한 경우에는 로그인창으로 다시 이동하도록 안내한다.
out.print("로그인 하지 않았습니다.<br><br>");
out.print("다시 로그인하세요!<br>");
out.print("<a href='/pro09/login.html'>로그인창으로 이동하기 </a>");
}
}
public void destroy() {
System.out.println("destroyed");
}
}
- 코드 작성 후 톰캣을 재시작하고 브라우저에 localhost:[port]/[project_name]/login.html 을 입력해 로그인 페이지에 접속한다.
- 아이디/비밀번호 입력 후 [로그인] 버튼을 클릭하면 다음과 같은 페이지가 출력된다.
- 위 페이지에서 "두 번째 서블릿으로 보내기" 링크를 클릭하면 다음 페이지가 나타난다.
- 만약 login.html 페이지에서 로그인을 하지 않고 /second 로 바로 요청을 하게 되면 다음과 같은 페이지가 나타난다.
- <hidden> 태그와 GET 방식으로 웹 페이지를 연동하는 방법은 단점이 많다. 웹 페이지가 많아지면 일일이 로그인상태를 확인하기 위해 로그인 정보를 다른 웹 페이지로 전송해야 한다. ID와 비밀번호를 GET 방식으로 전송하므로 브라우저에
노출되어 보안상으로도 좋지 않다. 전송할수 있는 데이터 용량에도 한계가 있다.
- 따라서 이 방식은 웹 페이지 사이에 간단한 정보 정도를 공유할 때만 사용하는 것이 좋다.
'Servlet' 카테고리의 다른 글
세션 트래킹 - 세션 (0) | 2024.08.12 |
---|---|
세션 트래킹 - 쿠키 (0) | 2024.08.12 |
서블릿 컨텍스트(ServletContext) (0) | 2024.08.12 |
서블릿 - 바인딩 (1) | 2024.08.12 |
서블릿 포워드(Forward) (0) | 2024.08.12 |
- Total
- Today
- Yesterday
- Binding
- react
- httpServletRequest
- Network
- CSS
- HTML
- Redux
- a 태그
- 제이쿼리
- Spring
- 미들웨어
- javaserverpage
- CSS 속성
- nodejs
- Servlet
- 서블릿
- 서브넷팅
- 세션
- 네트워크
- el
- JSP
- 내장객체
- 리액트
- 스프링
- html css
- Session
- FMT
- script element
- Spring MVC
- Java Server Page
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |