[spring]

  • 웹 브라우저가 요청하면 WAS는 HttpServletRequest 객체를 생성하여 저장합니다.

  • 또한 응답을 보낼 때 사용할 HttpServletResponse 개체를 만듭니다.

  • 두 객체를 서블릿에 전달하기 위해 doGet, doPost 및 Service와 같은 메소드에 매개변수로 전달됩니다.

HttpServlet 요청

HttpServletRequest의 역할


HTTP 요청 메시지

  • 클라이언트가 서버에 요청을 보내면 요청에 대한 정보가 HTTP 요청 메시지에 포함되어 서버로 전송됩니다.

  • HTTP 요청 메시지를 직접 파싱하여 사용할 수 있지만 매우 불편하다.

  • 서블릿은 편리한 사용을 위해 HTTP 요청 메시지를 구문 분석합니다.

  • 그리고 그 결과를 HttpServletRequest 객체에 넣어 제공함으로써 개발자가 HTTP 요청 메시지를 편리하게 사용할 수 있도록 해주는 객체이다.

1⃣ 요청 메시지 분석 기능

  • 출발선
    • HTTP 방식
    • URL
    • 쿼리 문자열
    • 체계, 프로토콜
  • 헤더
    • 헤더 검색
    • 양식 매개변수 형식 가져오기
    • 메시지 텍스트 데이터 직접 검색

2⃣ 추가기능

  • 캐시 기능
    • 해당 HTTP 요청의 처음부터 끝까지 보존되는 함수.
      • 저장: request.setAttribute(이름, 값)
      • 쿼리: request.getAttribute(이름)
  • 세션 관리 기능
    • request.getSession(만들기: 참)

HttpServletRequest의 기본 사용법

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

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

    }

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

    private void printHeader(HttpServletRequest request) {
        System.out.println("--- Headers - start ---");

        request.getHeaderNames().asIterator()
                .forEachRemaining(headerName -> System.out.println(headerName + ":" + request.getHeader(headerName)));
        System.out.println("--- Headers - end ---");
        System.out.println();
    }

    private void printStartLine(HttpServletRequest request) {
        System.out.println("--- REQUEST-LINE - start ---");
        System.out.println("request.getMethod() = " + request.getMethod()); //GET
        System.out.println("request.getProtocal() = " + 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-test
        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();
    }

    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()); System.out.println("request.getContentLength() = "+request.getContentLength()); System.out.println("request.getCharacterEncoding() = " + request.getCharacterEncoding()); System.out.println("--- Header 편의 조회 - 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: localhost:8080 connection: keep-alive cache-control: max-age=0 sec-ch-ua: "Chromium";v="88", "Google Chrome";v="88", ";Not A Brand";v="99" sec-ch-ua-mobile: ?0 upgrade-insecure-requests: 1 user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36 accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/ webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 sec-fetch-site: none sec-fetch-mode: navigate sec-fetch-user: ?1 sec-fetch-dest: document accept-encoding: gzip, deflate, br accept-language: ko,en-US;q=0.9,en;q=0.8,ko-KR;q=0.7 --- Headers - end ---
  • 헤더 편의 쿼리 결과
--- Header 편의 조회 start ---
(Host 편의 조회) request.getServerName() = localhost request.getServerPort() = 8080
(Accept-Language 편의 조회) locale = ko
locale = en_US
locale = en
locale = ko_KR
request.getLocale() = ko
(cookie 편의 조회)
(Content 편의 조회) request.getContentType() = null
request.getContentLength() = -1
request.getCharacterEncoding() = UTF-8
--- Header 편의 조회 end ---
  • 기타 정보는 HTTP 메시지 정보는 아니지만 HttpServletRequest를 통해 조회할 수 있습니다.

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();
}
<!
-- 결과 --> --- 기타 조회 start --- (Remote 정보) request.getRemoteHost() = 0:0:0:0:0:0:0:1 request.getRemoteAddr() = 0:0:0:0:0:0:0:1 request.getRemotePort() = 54305 (Local 정보) request.getLocalName() = localhost request.getLocalAddr() = 0:0:0:0:0:0:0:1 request.getLocalPort() = 8080 --- 기타 조회 end ---