Spring/SpringMVC

HttpServletRequest - 기본 사용법

느리지만 꾸준하게 2022. 4. 21. 20:40

HttpServletRequest를 사용하는 방법에 대해서 알아보자.

 

아래코드를 Extract Method로 해서 extracting을 해주고

package hello.setvlet.basic.request;

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

@WebServlet(name = "requestHeaderServlet", urlPatterns = "/request-header")
public class RequestHeaderServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("--- REQUEST-LINE - start ---");
        System.out.println("request.getMethod() = " + request.getMethod()); //GET
        System.out.println("request.getProtocal() = " + request.getProtocol()); //
        
        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();
        String method = request.getMethod();
        request.getProtocol();
    }
}

package hello.setvlet.basic.request;

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

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

        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();
        String method = request.getMethod();
        request.getProtocol();
    }
}

 

request-header라고 지정해주면 

아래에 request 정보들이 쭉 나열될 것이다.

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

 

 

request-header?username=hello라고 치게되면 queryString을 확인할 수 있다.

즉 query parameter를 확인할 수 있는 것이다.

--- 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() = username=hello
request.isSecure() = false
--- REQUEST-LINE - end ---

 

 

 

Header의 모든 정보를 가져오는 방법이 두가지가 있는데

 

먼저 getHeaderNames();라고 있다. 옛날방식이다.

//Header 모든 정보
    private void printHeaders(HttpServletRequest request) {
        System.out.println("--- Headers - start ---");

        Enumeration<String> headerNames = request.getHeaderNames();
        // hasMoreElements로 해서 다음 요소가 있냐 물어보고 있으면
        // nextElement 해서 값을 꺼낸다.
        while (headerNames.hasMoreElements()) {
            String headName = headerNames.nextElement();
        }

        System.out.println("--- Headers - end ---");
        System.out.println();
    }

 

RequestServletHeader의 전체코드는 아래와 같다. 실행시키고 

http://localhost:8080/request-header?/username=hello를 다시 돌려주면 Header 정보들이 쭉 노출이 된다.

package hello.setvlet.basic.request;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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);
        printHeaders(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()); //

        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();
        String method = request.getMethod();
        request.getProtocol();
    }
    //Header 모든 정보
    private void printHeaders(HttpServletRequest request) {
        System.out.println("--- Headers - start ---");

        // http의 모든 header 정보를 다 꺼내서 출력할 수가 있다.
        Enumeration<String> headerNames = request.getHeaderNames();
        // hasMoreElements로 해서 다음 요소가 있냐 물어보고 있으면
        // nextElement 해서 값을 꺼낸다.
        while (headerNames.hasMoreElements()) {
            String headName = headerNames.nextElement();
            System.out.println(headName + ": " + headName);
        }

        System.out.println("--- Headers - end ---");
        System.out.println();
    }
}
--- Headers - start ---
host: host
connection: connection
pragma: pragma
cache-control: cache-control
sec-ch-ua: sec-ch-ua
sec-ch-ua-mobile: sec-ch-ua-mobile
sec-ch-ua-platform: sec-ch-ua-platform
upgrade-insecure-requests: upgrade-insecure-requests
user-agent: user-agent
accept: accept
sec-fetch-site: sec-fetch-site
sec-fetch-mode: sec-fetch-mode
sec-fetch-user: sec-fetch-user
sec-fetch-dest: sec-fetch-dest
accept-encoding: accept-encoding
accept-language: accept-language
--- Headers - end ---

 

 

아래와 같이 작성을 해줄 수도 있다.

    // 요즘 스타일은 아래와 같다.
    request.getHeaderNames().asIterator()
                    .forEachRemaining(headerName -> System.out.println(headerName + ": " + headerName));

    System.out.println("--- Headers - end ---");
    System.out.println();
}
--- Headers - start ---
host: host
connection: connection
cache-control: cache-control
sec-ch-ua: sec-ch-ua
sec-ch-ua-mobile: sec-ch-ua-mobile
sec-ch-ua-platform: sec-ch-ua-platform
upgrade-insecure-requests: upgrade-insecure-requests
user-agent: user-agent
accept: accept
sec-fetch-site: sec-fetch-site
sec-fetch-mode: sec-fetch-mode
sec-fetch-user: sec-fetch-user
sec-fetch-dest: sec-fetch-dest
accept-encoding: accept-encoding
accept-language: accept-language
--- Headers - end ---

 

 

 

 

HTTP 헤더에 있는 정보를 편리하게 해주는 기능을 작성하면

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 = en
locale = ko
locale = ko_KR
locale = en_US
request.getLocale() = en

[cookie 편의 조회]

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

 

 

 

getLocales로 꺼내면 헤더에 Locale 정보를 다 꺼낼 수 있다.

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

 

 

 

en,ko;q=0.9,ko-KR;q=0.8,en-US;q=0.7 부분에서는 영어 - 한국어 - ~ 순서를 보낼 수가 있다.

System.out.println("request.getLocale() = " + request.getLocale()); 이 부분이 자동으로 뽑힌다.

System.out.println("request.getLocale() = " + request.getLocale());
[Accept-Language 편의 조회]
locale = en
locale = ko
locale = ko_KR
locale = en_US
request.getLocale() = en

 

 

도중에 에러가 났는데 여기 Q&A를 참고하자.

 

 

 

그리고 Content 편의 조회 로그를 보게되면 null로 되어있는데 get방식으로써

http 메시지 body에 뭔가 담겨있어야하는데 없어서 그렇다. postman으로 조회를 해보자.

[Content 편의 조회]
request.getContentType() = null
request.getContentLength() = -1
request.getCharacterEncoding() = UTF-8
--- Header 편의 조회 end ---
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();
}

 

아래와 같이 postman에서 post로 해준 다음 Body에 row - text로 설정하고  send를 해주면 

Postman이 만들어서 넘겨준 Content 내용을 꺼낼 수가 있다. 

[Content 편의 조회]
request.getContentType() = text/plain
request.getContentLength() = 6
request.getCharacterEncoding() = UTF-8
--- Header 편의 조회 end ---

 

기타정보에 대해서 알아보자.

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

 

 

 

remote 정보와 local 정보등을 보여준다.

remote 정보는 요청이 온 거에 대한 정보이고 local정보는 나의 서버에 대한 정보이다.

--- 기타 조회 start ---
[Remote 정보]
request.getRemoteHost() = 0:0:0:0:0:0:0:1
request.getRemoteAddr() = 0:0:0:0:0:0:0:1
request.getRemotePort() = 64396

[Local 정보]
request.getLocalName() = localhost
request.getLocalAddr() = 0:0:0:0:0:0:0:1
request.getLocalPort() = 8080
--- 기타 조회 end ---

 

 

  • 여기까지 HttpServletRequest를 통해서 HTTP 메시지의 start-line, header 정보 조회 방법을 이해했다.
  • 이제 본격적으로 HTTP 요청 데이터를 어떻게 조회하는지 알아보자.

 

 

 

 

 

 

 

 

 

 

 

<출처 김영한: 스프링 MVC 1편 - 벡앤드 웹 개발 핵심 기술>

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard

 

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의

웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., -

www.inflearn.com

 

'Spring > SpringMVC' 카테고리의 다른 글

HTTP 요청 데이터 - GET 쿼리 파라미터  (0) 2022.04.21
HTTP 요청 데이터 - 개요  (0) 2022.04.21
HttpServletRequest - 개요  (0) 2022.04.21
Hello 서블릿  (0) 2022.04.21
서블릿 - 프로젝트 생성  (0) 2022.04.21