Lined Notebook

[스프링 MVC - 백엔드 웹 개발 기술] 06. HttpServletRequest 개요와 기본 사용법

by ymkim

01. HttpServletRequest의 개요

01-1. HttpServletRequest 역할

  • HTTP 요청 메시지를 개발자가 직접 파싱해도 되지만, 매우 불편하다
  • 서블릿은 개발자가 HTTP 요청 메시지를 편리하게 사용할 수 있도록 HTTP 요청 메시지를 파싱한다
  • 결과는 HttpServletRequest 객체에 담아서 제공한다
    • ex) protected void service(HttpServletRequest request, HttpServletResponse response) { }
  • HttpServletRequest를 사용하면 HTTP Body의 내용을 편리하게 사용 가능

01-2. HTTP 요청 메시지

POST /save HTTP/1.1 # 시작 라인
Host: localhost:8080  # 헤더 정보
Content-Type: application/x-www-form-urlencoded # 헤더 정보

username=kim&age=20 # 바디 정보
  • 시작 라인
    • HTTP 메서드
    • URL
    • 쿼리 스트링
    • 스키마, 프로토콜
  • 헤더
    • 헤더 조회
  • 바디
    • form 파라미터 형식 조회
    • message body 데이터 직접 조회

HTTP 메시지를 파싱하는 것에 더하여 HttpServletRequest 객체는 추가적인 부가 기능 제공한다.
대표적으로는 임시 저장소 기능세션 관리 기능이 존재한다.

임시 저장소 기능

  • 해당 HTTP 요청 시작 - 끝 까지 유지되는 임시 저장소 기능
  • HTTP 요청 정보가 살아있을때까지 유지되는 정보
    • 저장: request.setAttribute(name, value)
    • 조회: request.getAttribute(name, value)

세션 관리 기능

  • request.getSession(create: true);

02. HttpServletRequest 기본 사용법

02-1. 시작 라인 추출

private static void printStartLine(HttpServletRequest request) {
    // Parsing HTTP message start line
    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

    System.out.println("request.getRequestURL() = " + request.getRequestURL()); // <http://localhost:8080/request-header>
    System.out.println("request.getRequestURI() = " + request.getRequestURI()); // /request-header
    System.out.println("request.getQueryString() = " + request.getQueryString()); //username=hi
    System.out.println("request.isSecure() = " + request.isSecure()); // https 여부
    System.out.println("--- REQUEST-LINE - 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() = null
request.isSecure() = false
--- REQUEST-LINE - end ---

02-2. Header 정보 추출

//Header 모든 정보
private void printHeaders(HttpServletRequest request) {
    System.out.println("--- Headers - start ---");

		// 첫번째 방법
    Enumeration<String> headerNames = request.getHeaderNames();
    while (headerNames.hasMoreElements()) {
        String headerName = headerNames.nextElement();
        System.out.println(headerName + ":" + headerName);
    }

		// 두번째 방법
		request.getHeaderNames().asIterator()
                        .forEachRemaining(headerName -> System.out.println(headerName + ":" + headerName));

    System.out.println("--- Headers - end ---");
    System.out.println();
}
--- Headers - start ---
host:host
connection:connection
pragma:pragma
cache-control:cache-control
sec-ch-ua:sec-ch-ua
sec-ch-ua-mobile:sec-ch-ua-mobile
sec-ch-ua-platform:sec-ch-ua-platform
upgrade-insecure-requests:upgrade-insecure-requests
user-agent:user-agent
accept:accept
sec-fetch-site:sec-fetch-site
sec-fetch-mode:sec-fetch-mode
sec-fetch-user:sec-fetch-user
sec-fetch-dest:sec-fetch-dest
accept-encoding:accept-encoding
accept-language:accept-language
--- Headers - end ---

02-3. Header 편리하게 조회

// 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();

    // Accept-Language
    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();

    // Cookie
    System.out.println("[cookie 편의 조회]");
    if (request.getCookies() != null) {
        for (Cookie cookie : request.getCookies()) {
            System.out.println(cookie.getName() + ": " + cookie.getValue());
        }
    }
    System.out.println();

    // Contents
    System.out.println("[Content 편의 조회]");
    System.out.println("request.getContentType() = " + request.getContentType());
    System.out.println("request.getContentLength() = " + request.getContentLength());
    System.out.println("request.getCharacterEncoding() = " + request.getCharacterEncoding());
    System.out.println("--- Header 편의 조회 end ---");
    System.out.println();
}

블로그의 정보

기록하고, 복기하고

ymkim

활동하기