Servlet 2 - HttpServletRequest

Jan 9, 2023

5 mins read

Servlet 1 내용에 이어 이번에는 HttpServletRequest에 대해 좀 더 자세히 들여다 봄. (인프런 강의 듣는 중)

[HttpServletRequest 역할]

HTTP 요청 메시지를 개발자가 직접 파싱해서 사용해도 되지만, 매우 불편할 것이다. 서블릿은 개발자가 HTTP 요청 메시지를 편리하게 사용할 수 있도록 개발자 대신에 HTTP 요청 메시지를 파싱한다. 그리고 그 결과를 HttpServletRequest 객체에 담아서 제공한다. (선생님 강의 자료)

[HttpServletRequest 요청 메시지 찍어보기]

  • hello.servlet.basic 아래 request 패키지를 하나 만든 후 서블릿을 생성한다.(이클립스 프로젝트는 Servlet 1 에서 이어짐)
package hello.servlet.basic.request;

import java.io.IOException;
import java.util.Enumeration;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

@WebServlet(name = "requestHeaderServlet", urlPatterns = "/request-header")
public class RequestHeaderServlet extends HttpServlet{

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		printStartLine(request);
		printHeaders(request);
		printHeaderUtils(request);
		printEtc(request);
		response.getWriter().write("ok");
		
	}

	//start line 정보
	private void printStartLine(HttpServletRequest request) {
		
		System.out.println("--- REQUEST-LINE - start ---");
		System.out.println("request.getMethod() = " + request.getMethod()); 	//GET
		System.out.println("request.getProtocol() = " + request.getProtocol()); //HTTP/1.1
		System.out.println("request.getScheme() = " + request.getScheme()); 	//http
		
		// http://localhost:8080/request-header
		System.out.println("request.getRequestURL() = " + request.getRequestURL());		// /request-header
		System.out.println("request.getRequestURI() = " + request.getRequestURI());		//username=hi
		System.out.println("request.getQueryString() = " +	request.getQueryString());
		System.out.println("request.isSecure() = " + request.isSecure()); //https 사용 유무
		
		System.out.println("--- REQUEST-LINE - end ---");
		System.out.println();
	}
	
	//Header 모든 정보
	private void printHeaders(HttpServletRequest request) {
		
		System.out.println("--- HEADERS - start ---");

//		Enumeration<String> headerNames = (Enumeration<String>)request.getHeaderNames();
//		
//		while (headerNames.hasMoreElements()) {
//			String headerName = (String) headerNames.nextElement();
//			System.out.println(headerName);
//		}
		
		//위에 코드를 간결하게 
		request.getHeaderNames().asIterator().forEachRemaining(headerName -> System.out.println(headerName));
		
		System.out.println("--- HEADERS - end ---");
	}
	
	//Header 편리한 조회
	private void printHeaderUtils(HttpServletRequest request) {
		
		 System.out.println("--- Header 편의 조회 start ---");
		 System.out.println("[Host 편의 조회]");
		 System.out.println("request.getServerName() = " +	request.getServerName()); //Host 헤더
		 System.out.println("request.getServerPort() = " +	request.getServerPort()); //Host 헤더
		 System.out.println();
		 
		 System.out.println("[Accept-Language 편의 조회]");
		 request.getLocales().asIterator().forEachRemaining(locale -> System.out.println("locale = " + locale));
		 System.out.println("request.getLocale() = " + request.getLocale());
		 System.out.println();
		 
		 System.out.println("[cookie 편의 조회]");
		 if (request.getCookies() != null) {
			 for (Cookie cookie : request.getCookies()) {
				 System.out.println(cookie.getName() + ": " + cookie.getValue());
			 }
		 }
		 System.out.println();
		 
		 System.out.println("[Content 편의 조회]");
		 System.out.println("request.getContentType() = " +	request.getContentType()); //GET방식으로 요청하면 null임 , Postman으로 확인해볼 수 있음
		 System.out.println("request.getContentLength() = " + request.getContentLength());
		 System.out.println("request.getCharacterEncoding() = " + request.getCharacterEncoding());
		 System.out.println("--- Header 편의 조회 end ---");
		 System.out.println();
	}
	
	//기타 정보
	private void printEtc(HttpServletRequest request) {
		
		 System.out.println("--- 기타 조회 start ---");
		 System.out.println("[Remote 정보]");
		 System.out.println("request.getRemoteHost() = " +
		request.getRemoteHost()); //
		 System.out.println("request.getRemoteAddr() = " +
		request.getRemoteAddr()); //
		 System.out.println("request.getRemotePort() = " +
		request.getRemotePort()); //
		 System.out.println();
		 System.out.println("[Local 정보]");
		 System.out.println("request.getLocalName() = " +
		request.getLocalName()); //
		 System.out.println("request.getLocalAddr() = " +
		request.getLocalAddr()); //
		 System.out.println("request.getLocalPort() = " +
		request.getLocalPort()); //
		 System.out.println("--- 기타 조회 end ---");
		 System.out.println();
	}

}
  • 응답 로그
--- REQUEST-LINE - start ---
request.getMethod() = GET
request.getProtocol() = HTTP/1.1
request.getScheme() = http
request.getRequestURL() = http://localhost:8080/request-header
request.getRequestURI() = /request-header
request.getQueryString() = username=hello
request.isSecure() = false
--- REQUEST-LINE - end ---

--- HEADERS - start ---
host
connection
cache-control
sec-ch-ua
sec-ch-ua-mobile
sec-ch-ua-platform
upgrade-insecure-requests
user-agent
accept
sec-fetch-site
sec-fetch-mode
sec-fetch-user
sec-fetch-dest
accept-encoding
accept-language
--- HEADERS - end ---
--- Header 편의 조회 start ---
[Host 편의 조회]
request.getServerName() = localhost
request.getServerPort() = 8080

[Accept-Language 편의 조회]
locale = ko_KR
locale = ko
locale = en_US
locale = en
request.getLocale() = ko_KR

[cookie 편의 조회]

[Content 편의 조회]
request.getContentType() = null
request.getContentLength() = -1
request.getCharacterEncoding() = UTF-8
--- Header 편의 조회 end ---

--- 기타 조회 start ---
[Remote 정보]
request.getRemoteHost() = 0:0:0:0:0:0:0:1
request.getRemoteAddr() = 0:0:0:0:0:0:0:1
request.getRemotePort() = 1886

[Local 정보]
request.getLocalName() = 0:0:0:0:0:0:0:1
request.getLocalAddr() = 0:0:0:0:0:0:0:1
request.getLocalPort() = 8080
--- 기타 조회 end ---
  • 위 응답에서 ContentType이 null인 이유는 GET방식으로 보냈기 때문이다.
    POST로 보내려면 Postman을 사용하여 request를 보내본다.
    content type과 길이가 찍히는걸 볼 수 있다.

postman_request

[Content 편의 조회]
request.getContentType() = text/plain
request.getContentLength() = 6
request.getCharacterEncoding() = UTF-8