웹 개발 기초/자바 웹을 다루는 기술

<hidden> 태그와 URL Rewriting 이용해 웹 페이지 연동하기

sungw00 2023. 2. 22. 00:29
728x90

<hidden> 태그를 이용하는 방법

<hidden> 태그는 브라우저에는 표시되지 않지만 미리 저장된 정보를 서블릿으로 전송하는 것이 가능.

 

LoginServlet.java와 login.html파일 준비

// LoginServlet.java
package sec01.ex01;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletConfig;
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 LogicServlet
 */
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see Servlet#init(ServletConfig)
	 */
	public void init(ServletConfig config) throws ServletException {
		System.out.println("init 메서드 호출");
	}

	/**
	 * @see Servlet#destroy()
	 */
	public void destroy() {
		System.out.println("destroy 메서드 호출");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html; charset=utf-8");
		request.setCharacterEncoding("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 = "안녕하세요<br> 로그인하셨습니다.<br><br>";
		data += "<html><body>";
		data += "아이디 : " + user_id;
		data += "<br>";
		data += "패스워드 : " + user_pw;
		data += "<br>";
		data += "주소 : " + user_address;
		data += "<br>";
		data += "email : " + user_email;
		data += "<br>";
		data += "휴대전화 : " + user_hp;
		data += "</body></html>";
		out.print(data);
	}
}
<!-- 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>

아이디와 비밀번호를 입력하면 <hidden> 태그에 미리 저장된 주소, 이메일, 휴대폰 번호를 서블릿으로 전송

http://localhost:8090/pro09/login.html 요청하여 값을 전달한 결과

 


URL Rewriting을 이용하는 방법

// LoginServlet.java
package sec01.ex02;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;

import javax.servlet.ServletConfig;
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 {
	/**
	 * @see Servlet#init(ServletConfig)
	 */
	public void init(ServletConfig config) throws ServletException {
		System.out.println("init 메서드 호출");
	}

	/**
	 * @see Servlet#destroy()
	 */
	public void destroy() {
		System.out.println("destroy 메서드 호출");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html; charset=utf-8");
		request.setCharacterEncoding("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 = "안녕하세요<br> 로그인하셨습니다.<br><br>";
		data += "<html><body>";
		data += "아이디 : " + user_id;
		data += "<br>";
		data += "패스워드 : " + user_pw;
		data += "<br>";
		data += "주소 : " + user_address;
		data += "<br>";
		data += "email : " + user_email;
		data += "<br>";
		data += "휴대전화 : " + user_hp;
		data += "<br>";
		out.print(data);
		
		user_address=URLEncoder.encode(user_address,"utf-8"); // GET 방식으로 한글을 전송하기 위해 인코딩
        // <a> 태그를 이용해 링크 클릭 시 서블릿 /second로 다시 로그인 정보를 전송
		out.print("<a href='/pro09/second?user_id="+user_id+"&user_pw="+user_pw+"&user_address="+user_address+"'>두 번째 서블릿으로 보내기</a>");
		data="</body></html>";
		out.print(data);
	}
}

 

// SecondServlet.java
package sec01.ex02;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletConfig;
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 SecondServlet
 */
@WebServlet("/second")
public class SecondServlet extends HttpServlet {
	/**
	 * @see Servlet#init(ServletConfig)
	 */
	public void init(ServletConfig config) throws ServletException {
		System.out.println("init 메서드 호출");
	}

	/**
	 * @see Servlet#destroy()
	 */
	public void destroy() {
		System.out.println("destroy 메서드 호출");
	}

	/**
	 * @see HttpServlet#doGet(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.println("<html><body>");
		if (user_id != null && user_id.length()!=0) {
        	// 첫 번째 서블릿의 ID 정보를 이용해 로그인 상태를 유지함
			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='/pro09/login.html'>로그인 창으로 이동하기</>");
		}
	}

}

첫 번째 서블릿에서 전송한 데이터 중 ID와 비밀번호를 가져왔으면 이미 첫 번째 서블릿에서 로그인한 것이므로 로그인 상태를 유지하도록 함

<!-- 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>

결과를 보면 다음과 같다.

로그인창 요청

첫 번째 서블릿에서 전달받은 로그인 정보를 출력한 후 두 번째 서블릿으로 보내기를 클릭하면

 

두 번째 서블릿에서 현재 로그인 상태와 회원 정보를 출력하고,

 

로그인 창을 거치지 않고 바로 /second 서블릿으로 요청하면 "로그인 하지 않았습니다." 라는 상태 안내 문구가 출력되며

'로그인 창으로 이동하기'가 표시됨.

 

<hidden> 태그와 GET 방식으로 웹 페이지들을 연동하는 방법에는 여러가지 단점이 있음.

  • 웹 페이지가 많아지면 일일이 로그인 상태를 확인하기 위해 로그인 정보를 다른 페이지로 전송해야 함
  • ID와 비밀번호를 GET 방식으로 전송하므로 브라우저에 노출되어 보안상으로도 좋지 않음
  • 전송할 수 있는 데이터 용량에도 한계가 존재

따라서 이 방법들은 웹 페이지 사이에 간단한 정보 정도를 공유할 때만 사용하는 것이 좋음

728x90