본문 바로가기

개발/Java

[JAVA - WEB] 서블릿 요청 및 데이터 전송

728x90
반응형
GET/POST 전송 방식

 

웹 브라우저에서 서블릿으로 전송하는 방법은 크게 GET 방식과 POST 방식이 있습니다.

 

주소창으로 구분해보자면 GET 방식은 물음표(?) 뒤에 여러가지 데이터를 붙여서 전송하는 방식이고 POST 방식은 기본 주소 외에 아무 데이터도 보여지지 않게 숨겨서 전송하는 방식입니다.

 

GET/POST 방식 비교

 

GET POST
서브릿에 데이터를 전송할 때는 데이터가 URL 뒤에 name=value... 의 형태로 전송됩니다.
여러 개의 데이터를 전송할 때는 '&' 로 구분해서 전송합니다.
보안이 취약합니다.
전송할 수 있는 데이터는 최대 255자 입니다.
기본 전송 방식이고 사용이 쉽습니다.
웹 브라우저에 직접 입력해서 전송할 수도 있습니다.
서블릿에서는 doGet() 을 이용해 데이터를 처리합니다.
서블릿에 데이터를 전송할 때는 TCP/IP 프로토콜 데이터의 HEAD 영역에 숨겨진 채 전송됩니다.
보안에 유리합니다.
전송 데이터 용량이 무제한입니다.
전송 시 서블릿에서는 또다시 가져오는 작업을 해야 하므로 처리 속도가 GET 방식보다 느립니다.
서블릿에서는 doPost() 를 이용해 데이터를 처리합니다.

 

 

 

GET 방식으로 서블릿 요청

 

앞의 게시물에서 실습했던 내용이 GET 방식으로 요청하는 방식입니다.

https://jeusyhk.tistory.com/entry/JAVA-WEB-%EC%84%9C%EB%B8%94%EB%A6%BF-%EA%B8%B0%EB%B3%B8

 

[JAVA - WEB] 서블릿 기본

서블릿의 기본 기능 수행과정 서블릿의 기본 기능 수행과정은 다음과 같습니다. 1. 클라이언트로부터 요청을 받습니다. 2. 요청 처리, 데이터베이스 연동 등과 같은 비즈니스 로직을 처리합니다.

jeusyhk.tistory.com

 

login/html 에서 아이디와 비밀번호를 입력 후 로그인 버튼을 클릭하면 주소창은 다음과 같이 변합니다.

http://localhost:8090/pro06/login?user_id=aaa&user_pw=bbb

이처럼 주소 창에서 입력한 아이디와 비밀번호를 모두 확인할 수 있기 때문에 보안 상에 좋지 않습니다.

 

 

 

POST 방식으로 서블릿 요청

 

login.html 의 코드 중에 form 의 method 를 get 에서 post 로 변경합니다.

 

<form name="frmLogin" method="post" action="login" encType="UTF-8">

 

 

서블릿 클래스 생성 시에 doPost 를 체크하여 생성한 후 doPost 메서드를 작성합니다.

 

...
protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		String user_id = request.getParameter("user_id");
		String user_pw = request.getParameter("user_pw");
		System.out.println("아이디 : " + user_id);
		System.out.println("비밀번호 : " + user_pw);
        
		String data = "<html>";
		data += "<body>";
		data += "아이디 : " + id;
		data += "<br>";
		data += "비밀번호 : " + pw;
		data += "</html>";
		data += "</body>";
		out.print(data);
	}
...

 

로그인 창에서 아이디와 비밀번호 입력 후 로그인 버튼을 클릭하면 주소창에 아이디와 비밀번호는 표시되지 않습니다.

 

 

 

 

GET 방식과 POST 방식 요청 동시 처리

 

동시처리라고 해서 거창할 것은 없고 Get 과 Post 를 구분하지 않아도 되는 요청일 경우 공통함수 하나를 생성하여 둘다 처리하도록 코드를 작성합니다.

 

서블릿 파일 생성 시에 doGet 과 doPost 를 둘다 체크한 후 생성한 후 doHandle(...) 함수를 선언하여 작성합니다.

 

...
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("doGet call");
		doHandle(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("doPost call");
		doHandle(request, response);
	}

	private void doHandle(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		System.out.println("doHandle call");
		String user_id = request.getParameter("user_id");
		String user_pw = request.getParameter("user_pw");
		System.out.println("아이디 : " + user_id);
		System.out.println("비밀번호 : " + user_pw);
	}
...

 

작성한 후 html 파일의 method 를 get 으로 변경해서 실행해보고 post 로 변경해서 실행해봐도 결과는 동일합니다.

 

 

 

자바스크립트로 서블릿 요청

 

<form> 에 입력된 데이터를 바로 전송하기 보다 아이디나 비밀번호의 형태가 올바른지, 비어있지는 않는지 등의 유효성 검사를 한 후 정상일 경우에만 서블릿으로 데이터를 전송하게 되면 서블릿에서 불필요한 처리를 하지 않아도 됩니다.

 

여기서는 자바스크립트로 입력된 데이터의 유효성 검사를 진행한 후 자바스크립트 함수에서 서블릿을 요청하도록 하겠습니다.

 

html 파일을 생성후 코드를 작성합니다.

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script type="text/javascript">
	function fn_validate() {
		var frmLogin = document.frmLogin;
		var user_id = frmLogin.user_id.value;
		var user_pw = frmLogin.user_pw.value;

		if ((user_id.length == 0 || user_id == "")
				|| (user_pw.length == 0 || user_pw == "")) {
			alert("아이디와 비밀번호는 필수입니다.");
		} else {
			frmLogin.method = "post";
			frmLogin.action = "login5";
			frmLogin.submit();
		}
	}
</script>

<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="button" onClick="fn_validate()" value="로그인"> 
		<input type="reset" value="다시입력"> 
	</form>
</body>
</html>

 

브라우저에 표시되지 않지만 추가적인 정보를 전송하고 싶을 경우에는 type 에 hidden 속성을 이용하여 전송합니다.

 

<input type = "hidden" name = "user_tel" value = "010-0000-0000" />

 

 

서블릿 파일을 생성한 후 doPost 메서드의 코드를 작성합니다.

 

...
	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 id = request.getParameter("user_id");
		String pw = request.getParameter("user_pw");
		
		System.out.println("아이디 : " + id);
		System.out.println("비밀번호 : " + pw);

		String data = "<html>";
		data += "<body>";
		data += "아이디 :  " + id;
		data += "<br>";
		data += "비밀번호 : " + pw;
		data += "<br>";

		data += "</html>";
		data += "</body>";
		out.print(data);
	}
...

 

마찬가지로 hidden 속성을 받아서 처리하려면 String tel = request.getParameter("user_tel") 로 받아서 처리하면 됩니다.

 

 

user_tel 까지 처리해서 표기한 화면을 확인할 수 있습니다.

 

 

여기까지 임미다.

728x90