HTTP 요청 메세지를 개발자가 직접 파싱해서 사용해도 되지만, 매우 불편하다.
Servlet은 개발자가 HTTP 요청 메세지를 편리하게 사용할 수 있도록 개발자 대신에 HTTP 요청 메세지를 파싱한다.
그리고 그 결과를 HttpServletRequest
객체에 담아서 제공
해당 HTTP 요청이 시작부터 끝날때 까지 유지되는 임시 저장소 기능이 있다.
request.setAttribute(name,value)
request.getAttribute(name)
request.getSession(create: true)
📌 중요)
HttpServletRequest, HttpServletResponse를 사용할때 가장 중요한 점은 이 객체들이 HTTP 요청 메세지, HTTP 응답 메세지를 편리하게 사용하도록 도와주는 객체라는 점!
따라서 이 기능에 대해 깊이있는 이해를 하기 위해 HTTP spec이 제공하는 요청,응답 메세지 자체를 이해해야 한다.
경로 : 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