-> 블로그 이전

[JSP] request 객체

2022. 3. 17. 21:46Language`/JSP (Java Server Page)

request 객체

우리가 주소창에 어떤 웹 사이트의 주소를 입력하면

>> 웹 브라우저(Client)는 웹 서버(Server)에 연결하고, 요청 정보들을 전송한다

  • 여기서 이 요청 정보를 제공하는 것이 "request 객체"이다

 

request 객체가 제공하는 기능들

  • Client(웹 브라우저)와 관련된 정보 읽기
  • Server와 관련된 정보 읽기
  • Client가 전송한 request 파라미터 읽기
  • Client가 전송한 request 헤더 읽기 (HTTP 메시지 헤더)
  • Client가 전송한 cookie 읽기
  • 속성 처리

 

1) Client 정보 & Server 정보 읽기

메소드 설명
String getRemoteAddr() 웹 서버에 연결한 Client의 IP주소
long getContentLength() Client가 전송한 request 정보의 길이
>> 이 때, 길이를 알 수 없을 경우 "-1" 리턴
String getCharacterEncoding() Client가 request를 보낼 때 사용한 캐릭터의 인코딩 
String getContentType() Client가 request를 보낼 때 사용한 Content Type
String getProtocol() Client가 request한 프로토콜
String getMethod() 웹 브라우저가 정보를 전송할 때 사용한 방식
String getRequestURI() 웹 브라우저가 요청한 URL에서의 경로
String getContextPath() JSP 페이지가 속한 웹 App의 컨텍스트 경로
String getServerName() 연결할 때 사용한 서버 이름
int getServerPort() 서버가 실행중인 포트 번호
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Hello Chap03</title>
</head>
<%
  String remoteAddr = request.getRemoteAddr();
  int contentLength = request.getContentLength();
  String characterEncoding = request.getCharacterEncoding();
  String contentType = request.getContentType();
  String protocol = request.getProtocol();
  String method = request.getMethod();
  String requestURI = request.getRequestURI();
  String contextPath = request.getContextPath();
  String serverName = request.getServerName();
  int serverPort = request.getServerPort();
%>
<body>
클라이언트 IP = <%=remoteAddr%><br>
Request 정보 길이 = <%=contentLength%><br>
Request 정보 인코딩 = <%=characterEncoding%><br>
Request 정보 컨텐츠 타입 = <%=contentType%><br>
Request 프로토콜 = <%=protocol%><br>
Request 메소드 = <%=method%><br>
Request URI = <%=requestURI%><br>
Web Application Context Path = <%=contextPath%><br>
서버 이름 = <%=serverName%><br>
서버 포트번호 = <%=serverPort%>
</body>
</html>

 

2) Client(웹 브라우저)가 전송한 파라미터 읽기

메소드 설명
String getParameter(String name) 이름이 "name"인 파라미터의 값을 구하기
>> 없으면 null 리턴
String [] getParameterValues(String name) 이름이 "name"인 모든 파라미터의 값을 배열로 구하기
>> 없으면 null 리턴
java.util.Enumeration getParameterNames() 웹 브라우저가 전송한 파라미터의 이름 목록을 구하기
java.util.Map getParameterMap() 웹 브라우저가 전송한 파라미터의 Mapping 쌍 구하기
>> [파라미터 이름 : 값]으로 구성

 

1) form을 통해서 Client가 Server로 Request 보내기 (form.jsp)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Hello Chap03</title>
</head>
<body>
<form action="requestParameter.jsp" method="post">
    이름: <input type="text" name="name"/><br><br>
    나이: <input type="text" name="age"/><br><br>
    이메일: <input type="email" name="email"/><br><br>
    아이디: <input type="text" name="id"/><br><br>
    비밀번호: <input type="password" name="password"/><br><br>
    기술 스택:
        <input type="checkbox" name="tech" value="spring">Spring
        <input type="checkbox" name="tech" value="springboot">Spring Boot
        <input type="checkbox" name="tech" value="springsecurity">Spring Security
        <input type="checkbox" name="tech" value="jpa">JPA
        <input type="checkbox" name="tech" value="mybatis">MyBatis
        <input type="checkbox" name="tech" value="react">React
        <input type="checkbox" name="tech" value="vuejs">Vue.js
        <input type="checkbox" name="tech" value="svelte">Svelte
    <br><br>
    <button type="submit">데이터 전송</button>
</form>
</body>
</html>

 

2) Server는 Client가 보낸 Request 정보 읽기 (requestParameter.jsp)

<%@ page import="java.util.Map" %>
<%@ page import="java.util.Enumeration" %>
<%@ page import="java.util.Arrays" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Hello Chap03</title>
</head>
<%
    request.setCharacterEncoding("UTF-8"); // 인코딩 지정

    // getParameter
    String name = request.getParameter("name");
    String age = request.getParameter("age");
    String email = request.getParameter("email");
    String id = request.getParameter("id");
    String password = request.getParameter("password");

    // getParameterValues()
    String[] techList = request.getParameterValues("tech");

    // getParameterNames()
    Enumeration<String> parameterNames = request.getParameterNames();

    // getParameterMap()
    Map<String, String[]> parameterMap = request.getParameterMap();
%>
<body>
<h3>getParameter(...)</h3>
이름 = <%=name%><br>
나이 = <%=age%><br>
이메일 = <%=email%><br>
아이디 = <%=id%><br>
비밀번호 = <%=password%>
<br><br>
<h3>getParameterValues("tech")</h3>
기술 스택 =
<%
    out.print("[ ");
    for (String tech : techList) {
        out.print(tech + " ");
    }
    out.print("]");
%>
<br><br>
<h3>getParameterNames()</h3>
<%
    while (parameterNames.hasMoreElements()) {
        String pName = parameterNames.nextElement();
        out.print(pName + " ");
    }
%>
<br><br>
<h3>getParameterMap()</h3>
<%
    for (String mName : parameterMap.keySet()) {
        out.print(mName + " -> [ ");
        for (String value : parameterMap.get(mName)) {
            out.print(value + " ");
        }
        out.print("]<br>");
    }
%>
</body>
</html>

requestParam.jsp의 <% %> 처음부분을 보면 request.setCharacterEncoding("UTF-8")이라는 설정이 보인다

웹 브라우저는 Server에 파라미터들을 전송할 떄 charset을 이용해서 파라미터 값들을 "인코딩"한다.
그러면 이러한 파라미터 정보들을 받은 Server는 브라우저가 전송한 파라미터 데이터를 "디코딩"한다

이 때 브라우저 - Server간에 사용한 charset정보가 일치해야 정확하게 인코딩/디코딩 할 수 있다.
따라서 브라우저가 "UTF-8"로 인코딩한 데이터를 서버에서 디코딩할 때 반드시 "UTF-8"로 디코딩해야 한다는 의미이다

서버측에서 setCharacterEncoding을 설정하지 않으면 default인 "ISO-8859-1"을 charset으로 사용하게 된다

## GET 방식 요청 인코딩 결정 규칙 3가지 ##
1. <a> 태그의 링크 태그에 Query String 추가 = 웹 페이지 인코딩 사용
2. FORM의 method를 "GET"으로 지정해서 전송 = 웹 페이지 인코딩 사용
3. 웹 브라우저 주소에 직접 Query String을 포함하는 URL을 입력 = 웹 브라우저마다 다르다

>> Tomcat 8버전 이상부터는 GET 방식으로 전달된 파라미터 값을 읽어올때 사용하는 default charset이 "UTF-8"이다

 

 

3) Request에 대한 HTTP 메시지 헤더 읽기

메소드 설명
String getHeader(String name) 지정한 이름의 헤더 값을 구한다
>> host / user-agent / accept / connection / ....
java.util.Enumeration getHeaders(String name) 지정한 이름의 헤더 목록 구하기
>> accept-encoding의 경우 value가 여러개가 존재할 수 있기 때문에 해당 값들을 Enumeration으로 가져온다
>> value가 1개이면 그냥 getHeader로 value를 가져오면 된다
java.util.Enumeration getHeaderNames() 모든 헤더의 이름을 구하기
int getIntHeader(String name) 지정한 헤더의 값을 정수 값으로 읽기
long getDateHeader(String name) 지정한 헤더의 값을 시간 값으로 읽기
>> 시간은 1970년 1월 1일 이후로 1/1000초 단위로 계산
<%@ page import="java.util.Enumeration" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Hello Chap03</title>
</head>
<body>
<%
    Enumeration<String> emr = request.getHeaderNames();
    while(emr.hasMoreElements()){
        String headerName = emr.nextElement();
        Enumeration<String> emrH = request.getHeaders(headerName);

        out.print(headerName + " >> ");
        while(emrH.hasMoreElements()){
            String headerValue = emrH.nextElement();
            out.print(headerValue + " ");
        }
        out.println("<br><br>");
    }
%>
</body>
</html>