HttpServletRequest의 정의

Servlet은 개발자가 HTTP 요청 메시지를 편리하게 사용할 수 있도록 개발자 대신에 HTTP 요청 메시지를 파싱하고, 그 결과를 HttpServletRequest 객체에 담아서 제공합니다.

HTTP 요청 메시지 조회

http://localhost:8080/hello?username=hello에 접속한 상황

1. Start-Line 정보

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

결과

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

2. 헤더 정보

request.getHeaderNames().asIterator().forEachRemaining(headerName -> 
	System.out.println(headerName + ": " + request.getHeader(headerName))
);

결과

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

3. Accept Language 편의 조회

request.getLocales().asIterator().forEachRemaining(locale -> 
	System.out.println("locale = " + locale)
);
// 제일 우선순위 높은 한 언어만 가져옴
System.out.println("request.getLocale() = " + request.getLocale());

결과

locale = ko  
locale = en_US  
locale = en
locale = ko_KR
 
request.getLocale() = ko

testCookie란 이름으로 hello값을 가진 쿠키 값을 넣었을 때

if (request.getCookies() != null) {
    for (Cookie cookie : request.getCookies()) {
        System.out.println(cookie.getName() + ": " + cookie.getValue());
	}
}

결과

testCookie: hello

5. Remote 정보

System.out.println("request.getRemoteHost() = " + request.getRemoteHost());
System.out.println("request.getRemoteAddr() = " + request.getRemoteAddr());
System.out.println("request.getRemotePort() = " + request.getRemotePort());

결과

request.getRemoteHost() = 0:0:0:0:0:0:0:1 
request.getRemoteAddr() = 0:0:0:0:0:0:0:1 
request.getRemotePort() = 54305

6. Local 정보

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

결과

request.getLocalName() = localhost
request.getLocalAddr() = 0:0:0:0:0:0:0:1
request.getLocalPort() = 8080

전달값 조회

1. 쿼리 파라미터

//단일 파라미터 조회
String username = request.getParameter("username"); 
//파라미터 이름들 모두 조회
Enumeration<String> parameterNames = request.getParameterNames(); 
//파라미터를 Map으로 조회
Map<String, String[]> parameterMap = request.getParameterMap(); 
//동일한 이름의 복수 파라미터 조회
String[] usernames = request.getParameterValues("username"); 

2. 단순 텍스트

ServletInputStream inputStream = request.getInputStream();
String messageBody = 
	StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);

3. JSON

들어오는 데이터가 {"username": "hello", "age": 20} 형태인 경우

// 우선 해당 JSON 형태에 맞게 데이터 클래스를 생성
 
@Getter @Setter
 public class JsonData {
     private String username;
     private int age;
}
// 단순 텍스트를 불러올 때와 마찬가지로 우선 body값을 불러옴
ServletInputStream inputStream = request.getInputStream();
String messageBody = 
	StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
	
// objectMapper를 사용하여 읽어온 body값을 미리 생성한 데이터 클래스에 맞게 매핑해줌
JsonData jsonData = objectMapper.readValue(messageBody, JsonData.class);

임시 저장소 기능

해당 HTTP 요청이 시작할 때 부터 끝날 때 까지 유지되는 임시 저장소 기능을 제공

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

세션 관리 기능

request.getSession(create: true)