jiisoo
지수로그
jiisoo
전체 방문자
오늘
어제

블로그 메뉴

  • home
  • Github
  • 알고리즘 문제풀이 저장소
  • 분류 전체보기 (80)
    • Java (1)
    • Spring (30)
    • JPA (15)
    • cs (8)
      • 디자인패턴 (1)
      • 네트워크 (5)
      • Database (1)
      • 운영체제 (1)
    • algorithm (18)
      • 알고리즘 & 자료구조 이론 (12)
      • 알고리즘 풀이 (6)
    • 면접 준비 (0)
    • 회고 (5)
      • ATDD (4)
      • 학습테스트로 배우는 spring 2기 (1)
      • 프로젝트 (0)

인기 글

최근 댓글

최근 글

태그

티스토리

hELLO · Designed By 정상우.
jiisoo

지수로그

[spring] HttpServletRequest
Spring

[spring] HttpServletRequest

2023. 2. 21. 18:06
  • 웹 브라우저가 요청을 하면 서블릿 컨테이너는 웹 서버로부터 들어온 클라이언트의 요청을 넘겨받아
  • HttpServletRequest 객체를 생성하여 저장한다.
  • 또한 응답을 보낼 때 사용하기 위해  HttpServletResponse 객체를 생성하여 
  • Servlet 에게 두 객체를 전달하는데 doGet, doPost, Service 등과 같은 메서드에 파라미터로 전달되어 사용된다.

 

🌳 HttpServletRequest 

🐢 HttpServletRequest 의 역할 

 

HTTP 요청 메세지

  • 클라이언트가 서버에 요청을 보낼때 요청에 대한 정보를 HTTP 요청 메세지에 담아 서버로 보내온다.
  • HTTP 요청 메세지를 직접 파싱해서 사용해도 되지만 , 매우 불편하다.
  • 서블릿은 HTTP 요청 메세지를 편리하게 사용할 수 있도록 파싱해준다.
  • 그리고 그 결과를 HttpServletRequest 객체에 담아 제공하여 개발자가 HTTP 요청 메세지를 편리하게 사용할 수 있도록 해주는 객체이다.

 

 

1️⃣ 요청 메세지 분석 기능

  • START LINE
    • HTTP 메소드
    • URL
    • 쿼리스트링
    • 스키마, 프로토콜
  • 헤더 
    • 헤더 조회
  • 바디 
    • form 파라미터 형식 조회
    • message body 데이터 직접 조회

2️⃣ 부가 기능

  • 임시 저장소 기능
    • 해당 HTTP 요청이 시작부터 끝날 때 까지 유지되는 기능.
      • 저장 : request.setAttribute(name, value)
      • 조회 : request.getAttribute(name)
  • 세션 관리 기능 
    • request.getSesstion(create:true)

 

 

 

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

    }
}

 

 

  • start-line 조회 결과 
--- 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 ---

 

 

 

<김영한 - '스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술' 을 참고 하였습니다.>

'Spring' 카테고리의 다른 글

[spring] HttpServletResponse  (0) 2023.02.23
[spring] HTTP 요청 데이터  (0) 2023.02.22
[spring] 서블릿  (0) 2023.02.20
[spring] 웹 애플리케이션 이해  (0) 2023.02.18
[spring] 빈 스코프 (2)  (0) 2023.02.12
    'Spring' 카테고리의 다른 글
    • [spring] HttpServletResponse
    • [spring] HTTP 요청 데이터
    • [spring] 서블릿
    • [spring] 웹 애플리케이션 이해
    jiisoo
    jiisoo

    티스토리툴바