Post

백엔드 웹 개발 노트2.1 - HTTP Request ServletMethod

1. HTTPServletRequest에 대해

HTTPServletRequest는 HTTP 요청 메시지를 개발자가 편리하게 사용할 수 있도록 개발자 대신에 HTTP 요청 메시지를 파싱해옴. 이런 것이 없다면 개발자가 직접 파싱해야할 것이다.!

이렇게 파싱한 결과를 HTTPServletRequest객체에 담아서 제공한다.

중요한 것은 HTTPservletRequest객체는 파싱한 정보를 개발자가 편히 사용할 수 있게끔 도와주는 것이므로 HTTP 파싱정보에 대한 해석은 개발자 몫이다. 따라서 HTTP에 대한 이해가 기본적으로 깔려있어야 한다는 것이다.

HTTPServletReqeust는 파싱한 정보를 제공할 뿐만 아니라 추가적인 기능이 있다.

1
2
3
4
5
6
7
8
//Key와 Value로 데이터를 임시 저장
request.setAttribute(name,value)
//Key로 데이터를 꺼냄.
request.getAttribute(name)

//세션관리 기능.
//세션 확인
request.getSession(create: true)

위 처럼 임시 저장소 기능도 제공하며 세션관리 기능도 제공한다.

2. HTTPServletRequest 메소드들

새 자바파일을 만들어서 Servlet을 등록해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package hello.servlet.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 = "httprequesttest", urlPatterns = "/kms-request-header")
public class HttpRequestTest extends HttpServlet {

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

2.1 printStartLine() - > StartLine에 대한 정보.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private void printStartLine(HttpServletRequest request) {
        System.out.println("-----Start Line 정보 -----");
        //Post, Get, Put 등 요청 방식
        System.out.println("HTTP Method: " + request.getMethod());
        //Protocol 정보 HTTP 버전 등
        System.out.println("HTTP protocol : " + request.getProtocol());
        //scheme 정보 http
        System.out.println("HTTP scheme : " + request.getScheme());
        //URL 정보 (전체 경로)
        System.out.println("HTTP URI : " + request.getRequestURL());
        //URI 정보 (루트에서의 경로)
        System.out.println("HTTP URL : " + request.getRequestURI());
        //Secure 정보 https 여부
        System.out.println("HTTP Secure : " + request.isSecure());
        //Query String 정보 확인하려면 url의 끝에 아무값이나 넣어보자.
        System.out.println("HTTP QueryString : " + request.getQueryString());
        System.out.println("-----Start Line 정보 끝-----");
        System.out.println();
    }

이렇게 작성하고 <localhost:8080/kms-request-header?test=name>에 접근하면 다음과 같이 콘솔에 찍힌다.

2.2 printHeaderData() -> 헤더 정보

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    private void printHeaderData(HttpServletRequest request){
        System.out.println("-----Header 정보 -----");

        //옛날방식으로 헤더정보 꺼내오기.
        /*
        Enumeration<String> headerNames = request.getHeaderNames();

        while(headerNames.hasMoreElements()){
            String headerdata = headerNames.nextElement();
            System.out.println(headerdata + request.getHeader(headerdata));
        }
         */

        //최근 방법으로 꺼내기.
        request.getHeaderNames().asIterator().
                forEachRemaining(headername -> System.out.println(headername + request.getHeader(headername)));
        System.out.println("-----Header 정보 끝-----");
        System.out.println();
    }

2.3 printHeaderUtils() - > 헤더 편의 기능

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
    private void printHeaderUtils(HttpServletRequest request) {
        System.out.println("--- Header 편의 조회 start ---");
        System.out.println("[Host 편의 조회]");
        //Host 정보
        System.out.println("request.getServerName() = " + request.getServerName());
        //Port 정보
        System.out.println("request.getServerPort() = " + request.getServerPort());
        System.out.println();
        System.out.println("[Accept-Language 편의 조회]");
        //lcoal 정보 (언어 우선순위)
        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 편의 조회]");
        //Post방식으로 데이터를 전송하면 알 수 있다.
        //받은 데이터의 전송 형식 text 등
        System.out.println("request.getContentType() = " + request.getContentType());
        //받은 데이터의 길이 (byte)
        System.out.println("request.getContentLength() = " +request.getContentLength());
        //받은 데이터의 인코딩 형식
        System.out.println("request.getCharacterEncoding() = " + request.getCharacterEncoding());
        System.out.println("--- Header 편의 조회 끝 ---");
        System.out.println();

    }

2.4 printEtc() -> 네트워크 관련

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private void printEtc(HttpServletRequest request) {
        System.out.println("--- 그 외의 기능 (네트워크 관련) ---");
        System.out.println("request getRemoteUser() : " + request.getRemoteUser());
        System.out.println("request getRemoteAddr() : " + request.getRemoteAddr());
        System.out.println("request getRemoteHost() : " + request.getRemoteHost());
        System.out.println("request getRemotePort() : " + request.getRemotePort());

        //

        System.out.println("request getLocalAddr() : " + request.getLocalAddr());
        System.out.println("request getLocalName() : " + request.getLocalName());
        System.out.println("request getLocalPort() : " + request.getLocalPort());

        System.out.println("--- 그 외의 기능 (네트워크 관련) 끝 ---");
        System.out.println();
    }
This post is licensed under CC BY 4.0 by the author.