서블릿&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);
}
}