서블릿&JSP/뉴렉쳐 서블릿&JSP강의

[서블릿/jsp] POST 요청

째로스 2023. 6. 17. 11:19

1. POST 요청

GET 요청은 모든 파라미터들을 URL에 담아 전송했지만,

POST 요청은 URL이 아닌 body에 포함시켜 전송한다. 따라서 어떤 내용을 전송했는지 URL에서 확인할 수 없다.

입력할 내용이 많은 경우 또는 전송할 내용에 보안상 중요한 내용이 있을 때 사용한다.

 

2. 코드

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<div>
		<form action="notice-reg" method="post">
			<div>
				<label>제목</label><input name="title" type="text" >
			</div>
			<div>
				<label>내용:</label>
				<textarea name="content"></textarea>
			</div>
			<div>
				<input type="submit" value="등록"/>
			</div>
		</form>
	</div>

</body>
</html>

form 태그에서 method를 post 방식으로 지정해준다.

@WebServlet("/notice-reg")
public class NoticeReg extends HttpServlet{
		@Override
		protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
			
			//UTF-8 형식으로 전송하는 것
			response.setCharacterEncoding("UTF-8");
			//웹 브라우저에 UTF-8 형식으로 읽으라고 하는 것
			response.setContentType("text/html; charset=UTF-8");
			PrintWriter out = response.getWriter();
			
			String title = request.getParameter("title");
			String content = request.getParameter("content");
			
			out.println(title);
			out.println(content);
			
		}
}

서블릿 클래스에서 파라미터를 받아오는 형식은 GET방식과 동일하다.

 

3. 출력 결과

입력 시 파라미터들의 값이 URL에 포함되지 않는 것을 확인할 수 있다.

대신 크롬에서 F12를 통해 개발자 모드로 진입하여 payload를 확인하면 아래와 같다.

 

입력값들이 body에 포함되어 전송됨을 확인할 수 있다.

 

4. POST 사용시  한글 입력문제

톰캣은 기본적으로 ISO-8859-1 형식을 전송단위로 사용한다.

UTF-8과 달리 문자열을 1바이트씩 전송하는데, 한글과 같은 2바이트 크기의 문자는 이로인해 깨지게된다.

저번 강의에서 서버에서 웹 브라우저로 데이터를 전송하는데 UTF-8 형식을 사용하도록 변경하였으나,

아직 웹 브라우저에서 서버로 전송되는 문자열은 1바이트씩 전송받고 있어 한글이 꺠지는 현상이 발생하는 것이다.

아래 코드를 통해 이를 해결할 수 있다.

@WebServlet("/notice-reg")
public class NoticeReg extends HttpServlet{
		@Override
		protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
			
			//UTF-8 형식으로 전송하는 것
			response.setCharacterEncoding("UTF-8");
			//웹 브라우저에 UTF-8 형식으로 읽으라고 하는 것
			response.setContentType("text/html; charset=UTF-8");
			//웹 브라우저가 보낸 입력 값을 UTF-8 형식으로 읽어오는 것
			request.setCharacterEncoding("UTF-8");
			
			PrintWriter out = response.getWriter();
			
			String title = request.getParameter("title");
			String content = request.getParameter("content");
			
			out.println(title);
			out.println(content);
			
		}
}