티스토리 뷰

[개발] - Spring/MVC 1

HttpServletRequest 기본 사용법

완벽한 장면 2023. 9. 19. 18:35

HttpServletRequest 역할

HTTP 요청 메시지를 개발자가 직접 파싱해서 사용해도 되지만, 매우 불편.

서블릿은 개발자가 HTTP 요청 메시지를 편리하게 사용할 수 있도록 개발자 대신에 HTTP 요청 메시지를 파싱한다.

그리고 그 결과를 HttpServletRequest 객체에 담아서 제공한다.


HttpServletRequest를 사용하면 다음과 같은 HTTP 요청 메시지를 편리하게 조회할 수 있다.

 

 

중요

 

 


HttpServletRequest - 기본 사용법

- HttpServletRequest가 제공하는 기본 사용법 알아보기

 

RequestHeaderServlet -1 

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

  @Override
  protected void service(HttpServletRequest request, HttpServletResponse response) 
  	throws ServletException, IOException {
    	printStartLine(request);
  }
}

 

메서드

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

 

 

실행 결과

--- REQUEST-LINE - start ---
request.getMethod() = GET
request.getProtocal() = 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 ---

 

설명

이 코드는 서블릿에서 클라이언트의 HTTP 요청에 대한 정보를 출력하는 메소드인 printStartLine을 정의.

이 메소드는 HttpServletRequest 객체를 인자로 받아서 해당 요청에 대한 중요한 정보를 콘솔에 출력.

 

System.out.println("request.getMethod() = " + request.getMethod());
- request.getMethod()는 클라이언트 요청의 HTTP 메소드를 반환. 

  주로 "GET", "POST", "PUT", "DELETE" 등의 값 중 하나.

 

System.out.println("request.getProtocol() = " + request.getProtocol());
- request.getProtocol()는 클라이언트 요청의 프로토콜을 반환. 

  일반적으로 "HTTP/1.1"과 같은 형식으로 반환됩니다.

 

System.out.println("request.getScheme() = " + request.getScheme());
- request.getScheme()은 요청이 사용하는 프로토콜 스킴을 반환.

  일반적으로 "http" 또는 "https" 중 하나.

 

System.out.println("request.getRequestURL() = " + request.getRequestURL());
- request.getRequestURL()은 요청의 URL을 반환.

  이 URL은 프로토콜, 호스트, 포트, 그리고 경로를 포함.

 

System.out.println("request.getRequestURI() = " + request.getRequestURI());
- request.getRequestURI()는 요청의 URI(Uniform Resource Identifier)를 반환.

  이는 경로를 포함하고 쿼리 문자열은 포함하지 않는다.

 

System.out.println("request.getQueryString() = " + request.getQueryString());
- request.getQueryString()은 요청의 쿼리 문자열을 반환. 

  쿼리 문자열은 URL에서 "?" 이후의 문자열로 키-값 쌍을 포함할 수 있습니다.

 

System.out.println("request.isSecure() = " + request.isSecure());
- request.isSecure()는 요청이 안전한 연결 (HTTPS)을 통해 이루어진 경우 true를 반환하고, 

  그 외의 경우 false를 반환.


이 printStartLine 메소드는 주로 디버깅이나 로깅 목적으로 사용되며, 클라이언트의 요청이 어떤 메소드, 프로토콜, URL, URI, 그리고 쿼리 문자열을 포함하는지를 확인하는 목적.

 


RequestHeaderServlet - 2

@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); // 모든 헤더 정보

  }
}

 

메서드

//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 + ": " + request.getHeader(headerName));
  }
*/
    request.getHeaderNames().asIterator()
        .forEachRemaining(
            headerName -> System.out.println(headerName + ": " + request.getHeader(headerName)));
    System.out.println("--- Headers - end ---");
    System.out.println();
  }

 

실행 결과

--- Headers - start ---
host: localhost:8080
connection: keep-alive
cache-control: max-age=0
sec-ch-ua: "Chromium";v="116", "Not)A;Brand";v="24", "Google Chrome";v="116"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
upgrade-insecure-requests: 1
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 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.7
sec-fetch-site: none
sec-fetch-mode: navigate
sec-fetch-user: ?1
sec-fetch-dest: document
accept-encoding: gzip, deflate, br
accept-language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
cookie: Idea-2cb03026=a6d91d98-a89f-40e6-9d4e-4dfec7692b2b
--- Headers - end ---

 

설명


서블릿에서 클라이언트의 HTTP 요청 헤더 정보를 모두 출력하는 메소드인 printHeaders.

이 메소드는 HttpServletRequest 객체를 인자로 받아서 해당 요청에 대한 모든 헤더 정보를 콘솔에 출력.

request.getHeaderNames().asIterator()...
- request.getHeaderNames() 메소드는 모든 헤더 이름을 나열하는 Enumeration<String>을 반환.
  .asIterator() 메소드를 사용하여 이 Enumeration을 반복 가능한 Iterator로 변환.
  .forEachRemaining(...)을 사용하여 모든 헤더를 반복하면서 아래 내용을 실행.

 

System.out.println(headerName + ": " + request.getHeader(headerName));
- 각 헤더 이름과 해당 헤더의 값을 콘솔에 출력.


이 메소드는 클라이언트의 HTTP 요청에 포함된 모든 헤더 정보를 출력. 

HTTP 요청 헤더는 클라이언트가 서버에게 요청을 보낼 때 전송되는 정보를 포함.

 

예를 들어, 사용자 에이전트(User-Agent), 쿠키(Cookie), 인증 정보(Authentication), 컨텐츠 유형(Content-Type) 등의 헤더 정보가 포함될 수 있다.

이러한 헤더 정보는 서버 측에서 요청을 처리하는 데 필요한 추가 정보를 제공하므로 디버깅이나 문제 해결 시에 유용하게 사용된다.

 


 

RequestHeaderServlet - 3

@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);

  }
}

 

메서드

 //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());
    System.out.println("request.getContentLength() = " +
        request.getContentLength());
    System.out.println("request.getCharacterEncoding() = " +
        request.getCharacterEncoding());
    System.out.println("--- Header 편의 조회 end ---");
    System.out.println();
  }

 

실행 결과

--- 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 편의 조회]
Idea-2cb03026: a6d91d98-a89f-40e6-9d4e-4dfec7692b2b

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

 

설명

서블릿에서 클라이언트의 HTTP 요청 헤더 정보를 더 편리하게 조회하고 출력하는 메소드인 printHeaderUtils.

이 메소드는 HttpServletRequest 객체를 인자로 받아서 다양한 헤더 정보와 관련된 내용을 콘솔에 출력.


[Content 편의 조회]
이 부분은 HTTP 요청 본문(content)에 관련된 정보를 출력.

System.out.println("request.getServerName() = " + request.getServerName());
- request.getServerName()은 클라이언트 요청의 Host 헤더 값을 반환. 이는 서버 호스트 이름.

 

System.out.println("request.getServerPort() = " + request.getServerPort());
request.getServerPort()는 클라이언트 요청의 Host 헤더에 포함된 포트 번호를 반환합니다.

 

 

[Accept-Language 편의 조회]
이 부분은 클라이언트의 언어 설정과 관련된 정보를 출력.

 


request.getLocales().asIterator()...
- request.getLocales()은 클라이언트가 선호하는 언어 목록을 반환.
  .asIterator() 메소드를 사용하여 이 목록을 반복 가능한 Iterator로 변환.
  .forEachRemaining(...)을 사용하여 각 언어 설정을 출력.

 

System.out.println("request.getLocale() = " + request.getLocale());
- request.getLocale()은 클라이언트의 기본 언어 설정을 반환합니다.

 

 

 

[cookie 편의 조회]
이 부분은 클라이언트가 전송한 쿠키 정보를 출력합니다.

 

if (request.getCookies() != null) { ... }
- request.getCookies()는 클라이언트가 전송한 쿠키 배열을 반환합니다.
  쿠키 배열을 순회하면서 각 쿠키의 이름과 값 정보를 출력합니다.

 

 

[Content 편의 조회]
- 이 부분은 HTTP 요청 본문(content)에 관련된 정보를 출력.

 


System.out.println("request.getContentType() = " + request.getContentType());
- request.getContentType()은 요청 본문의 컨텐츠 타입을 반환.

 

System.out.println("request.getContentLength() = " + request.getContentLength());
- request.getContentLength()는 요청 본문의 길이를 반환.


System.out.println("request.getCharacterEncoding() = " + request.getCharacterEncoding());
- request.getCharacterEncoding()은 요청 본문의 문자 인코딩을 반환.

이 메소드는 클라이언트의 HTTP 요청과 관련된 다양한 헤더 정보를 편리하게 출력하여, 

서블릿 개발 및 디버깅 과정에서 이 정보를 사용하여 요청을 이해하고 처리할 때 도움을 줌.

 

 


RequestHeaderServlet - 4

@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); // 기타 정보
  }
}

 

메서드

  //기타 정보
  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() = 61039

[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 ---

 

설명

이 코드는 서블릿에서 클라이언트와 관련된 다양한 기타 정보를 조회하고 출력하는 메소드인 printEtc.

이 메소드는 HttpServletRequest 객체를 인자로 받아서 클라이언트와 관련된 여러 정보를 콘솔에 출력.

[Remote 정보]
아래에 나오는 코드들은 클라이언트와 관련된 원격 (Remote) 정보를 출력.


System.out.println("request.getRemoteHost() = " + request.getRemoteHost());
request.getRemoteHost()은 클라이언트 컴퓨터의 호스트 이름을 반환.


System.out.println("request.getRemoteAddr() = " + request.getRemoteAddr());
request.getRemoteAddr()은 클라이언트 컴퓨터의 IP 주소를 반환.


System.out.println("request.getRemotePort() = " + request.getRemotePort());
request.getRemotePort()은 클라이언트와 서버 간의 통신에 사용되는 포트 번호를 반환.

 


[Local 정보]
이 부분은 서버 자체에 대한 로컬 (Local) 정보를 출력.


System.out.println("request.getLocalName() = " + request.getLocalName());
request.getLocalName()은 서버 호스트의 이름을 반환.


System.out.println("request.getLocalAddr() = " + request.getLocalAddr());
request.getLocalAddr()은 서버 호스트의 IP 주소를 반환.


System.out.println("request.getLocalPort() = " + request.getLocalPort());
request.getLocalPort()은 서버와 클라이언트 간의 통신에 사용되는 서버의 포트 번호를 반환.

이 메소드는 클라이언트의 원격 정보 (호스트, IP 주소, 포트)와 서버의 로컬 정보를 출력하여 

서블릿이 클라이언트와 상호작용할 때 어떤 환경에서 실행되고 있는지 이해하는 데 도움을 줌.

 

728x90
반응형

'[개발] - Spring > MVC 1' 카테고리의 다른 글

HTTP 요청 데이터 - POST HTML Form  (1) 2023.09.19
HTTP 요청 데이터 - 개요, GET 쿼리 파라미터  (0) 2023.09.19
Hello 서블릿  (0) 2023.09.18
HTML, HTTP API, CSR, SSR  (0) 2023.09.06
동시 요청 - 멀티 쓰레드  (0) 2023.09.05
Comments
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
250x250