-
[스프링MVC - 1편] HttpServletRequest스프링&스프링부트 2025. 1. 2. 19:33
HttpServletRequest 역할
HTTP 요청 메시지를 개발자가 직접 파싱해서 사용해도 되지만, 매우 불편하다
서블릿은 개발자가 HTTP 요청 메시지를 편리하게 사용할 수 있도록 개발자 대신에 HTTP 요청 메시지를 파싱한다
그리고 그 결과를 HttpServletRequest 객체에 담아서 제공한다
... POST /save HTTP/1.1 (START LINE) Host: localhost:8080 (헤더) Content-Type: application/x-www-form-urlencoded (헤더) username=kim&age=20 (바디) ...
HttpServletRequest를 사용하면 위와 같은 HTTP 요청 메시지를 편리하게 조회할 수 있다
- START LINE
- HTTP 메소드
- URL쿼리 스트링
- 스키마, 프로토콜
- 헤더
- 헤더 조회
- 바디
- form 파라미터 형식 조회
- message body 데이터 직접 조회
HttpServletRequest 객체는 추가로 여러가지 부가기능도 함께 제공한다.
- 임시 저장소 기능
해당 HTTP 요청이 시작부터 끝날 때 까지 유지되는 임시 저장소 기능
저장: request.setAttribute(name, value)
조회: request.getAttribute(name)
- 세션 관리 기능
request.getSession(create: true)
* HttpServletRequest, HttpServletResponse를 사용할 때 가장 중요한 점은 이 객체들이 HTTP 요청 메시지,
HTTP 응답 메시지를 편리하게 사용하도록 도와주는 객체라는 점이다. 따라서 이 기능에 대해서 깊이있는 이해를
하려면 HTTP 스펙이 제공하는 요청, 응답 메시지 자체를 이해해야 한다
HttpServletRequest - 기본 사용법
@WebServlet(name="requestHeaderServlet", urlPatterns="/request-header") public class RequestHeaderServlet extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1. printStartLine(request); // 2. printHeaders(request); // 3. printHeaderUtils(request); // 4. printEtc(request); response.getWriter().write("ok"); } }
1. start line 정보 - printStartLine(request)
//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(); /* * --- 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 --- * */ }
2. Header의 모든 정보 - printHeaders(request)
// Header 모든 정보 private void printHeaders(HttpServletRequest request) { System.out.println("--- Headers - start ---"); /* // Header 정보 가져오는 옛날 방법 Enumeration<String> headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()) { String headerName = headerNames.nextElement(); System.out.println(headerName + ": " + request.getHeader(headerName)); } */ // Header 정보 가져오는 요즘 방법 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: "Google Chrome";v="131", "Chromium";v="131", "Not_A Brand";v="24" sec-ch-ua-mobile: ?0 sec-ch-ua-platform: "macOS" upgrade-insecure-requests: 1 user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.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, zstd accept-language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7 --- Headers - end --- * */ }
3. Header 편리한 조회 - printHeaderUtils
// 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 편의 조회] [Content 편의 조회] request.getContentType() = null request.getContentLength() = -1 request.getCharacterEncoding() = UTF-8 --- Header 편의 조회 end --- * */ }
- 이경우 request.getContentType() = null 로 출력되고 있는데 postman을 사용하면 null이 아닌 값을 확인할 수 있다
> post로 text를 보내게 되면 값이 제대로 넘어오는 것을 확인할 수 있다
4. 기타 정보 - printEtc
(기타 정보는 HTTP 메시지의 정보는 아니다)
// 기타 정보 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() = 64500 * [Local 정보] * request.getLocalName() = localhost * request.getLocalAddr() = 0:0:0:0:0:0:0:1 * request.getLocalPort() = 8080 * --- 기타 조회 end --- * */ }
728x90'스프링&스프링부트' 카테고리의 다른 글
[스프링MVC - 1편] HTTPServletResponse (1) 2025.01.05 [스프링MVC - 1편] HTTP 요청 데이터 (2) 2025.01.02 [스프링MVC - 1편] Hello 서블릿 (0) 2024.12.25 [intelliJ / springboot] 'Java/JavaVirtualMachines/openjdk-23.0.1/Contents/Home/bin/java' finished with non-zero exit value 1 (0) 2024.12.25 [스프링MVC - 1편] 자바 백엔드 웹 기술 역사 (0) 2024.12.22 - START LINE