HTTP ServletRequest 개요

shinyeongwoon·2022년 12월 24일
0

spring MVC

목록 보기
5/32

Http ServletRequest 개요

HttpServletRequest 역할

HTTP 요청 메세지를 개발자가 직접 파싱해서 사용해도 되지만, 매우 불편하다.
Servlet은 개발자가 HTTP 요청 메세지를 편리하게 사용할 수 있도록 개발자 대신에 HTTP 요청 메세지를 파싱한다.
그리고 그 결과를 HttpServletRequest 객체에 담아서 제공

임시 저장소 기능

해당 HTTP 요청이 시작부터 끝날때 까지 유지되는 임시 저장소 기능이 있다.

  • 저장 : request.setAttribute(name,value)
  • 조회 : request.getAttribute(name)

세션 관리 기능

request.getSession(create: true)

📌 중요)
HttpServletRequest, HttpServletResponse를 사용할때 가장 중요한 점은 이 객체들이 HTTP 요청 메세지, HTTP 응답 메세지를 편리하게 사용하도록 도와주는 객체라는 점!
따라서 이 기능에 대해 깊이있는 이해를 하기 위해 HTTP spec이 제공하는 요청,응답 메세지 자체를 이해해야 한다.

HttpServletRequset - 기본 사용법

경로 : hello.servlet1.basic.request
RequestHeaderServlet class file 만들기

package hello.servlet1.basic.request;

// 사용할 URL : http://localhost:8080/request-header?username=hello

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;

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

    /**start line 정보 받아오기
     *
     * @param request
     *
     * getMethod : HTTP Method 받아오기 : GET, POST,PUT,PATCH,DELETE...
     * getProtocol : Protocol 과 version
     * getScheme : scheme 만 받아오기
     * getRequestURL : 요청 URL 받아오기 : http://localhost:8080/request-header
     * getRequestURI : 요청 URI 받아오기 : /request-header
     * getQueryString : username=hello
     * isSecurer : https 사용 유무
     */
    private void printStartLine(HttpServletRequest request){
        System.out.println("Request-Line-start");

        System.out.println("request.getMethod = " + request.getMethod());
        System.out.println("request.getProtocol = " + request.getProtocol());
        System.out.println("request.getScheme = " + request.getScheme());
        System.out.println("request.getRequestURL = " + request.getRequestURL());
        System.out.println("request.getRequestURI = " + request.getRequestURI());
        System.out.println("request.getQueryString = " + request.getQueryString());
        System.out.println("request.isSecure = " + request.isSecure());

        System.out.println("Request-Line-end");
        System.out.println();
    }

    private void printHeader(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("header-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());
        System.out.println("request.getServerPort() = " + request.getServerPort());
        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();
    }

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

}

🤞 참고)
로컬에서 테스트하면 IPv6 정보가 나오는데 IPv4 정보를 보고 싶으면 다음 옵션을 VM option에 넣어주면 된다.
-Djava.net.preferIPv4Stack=true

0개의 댓글