티스토리 뷰

Servlet

세션 트래킹

dev23 2024. 8. 12. 19:45
반응형

세션 트래킹

- 사용자 입장에서 페이지 사이의상태나 정보를 공유하려면 프로그래머가 세션 트래킹(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 을 입력해 로그인 페이지에 접속한다.

 

 

로그인 페이지

 

- 아이디/비밀번호 입력 후 [로그인] 버튼을 누르면 다음과 같이 입력하지 않았던 정보들도 출력된다.

hidden 태그에 입력된 정보도 출력된 페이지

 

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 로 바로 요청을 하게 되면 다음과 같은 페이지가 나타난다.

user_id가 없는 경우

- <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
링크
«   2024/09   »
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
글 보관함