요청정보와 응답정보

corncheese·2023년 7월 2일
0

서블릿 API에서 요청정보와 응답정보를 다루는 객체는 HttpServletRequest와 HttpServletResponse이다.

HttpServletRequest는 클라이언트가 서버에 보내는 요청정보를 처리하는 객체이고, HttpServletResponse는 서버가 클라이언트로 보내는 응답정보를 처리하는 객체이다.

요청/응답에 대한 서블릿 처리 순서

  1. 클라이언트가 웹 브라우저에 서비스를 요청한다. 이때 HTTP 프로토콜 기반으로 요청정보가 만들어져 웹서버에 전달됩니다.
  2. 웹서버는 클라이언트로부터 전달받은 요청정보의 URI를 살펴보고, 서블릿이라면 서블릿 컨테이너에 처리를 넘긴다.
  3. 서블릿 컨테이너는 요청받은 서블릿 클래스 파일을 찾아서 실행한다.
  4. 최초 요청인지 파악하여, 최초 요청이라면 메모리에 로딩 후 객체를 생성하고 init()를 호출한다.
  5. init() 메서드 실행이 끝난 뒤에는 최초 요청이던, 아니던 서블릿 실행 요청이 들어올 때마다 실행되는 작업으로, 서블릿 컨테이너는 HttpServletRequest와 HttpServletResponse 객체를 생성한다.
  6. service() 메소드를 호출한다. 이때, 앞에서 생성한 HttpServletRequest와 HttpServletResponse 객체의 주소를 인자로 넘긴다. service() 메소드에서는 인자로 받은 두 객체를 사용하여 프로그램을 구현한다.
  7. service()메소드가 완료되면 클라이언트에 응답을 보내고,HttpServletRequest와 HttpServletResponse 객체는 소멸한다.

** HttpServletRequest와 HttpServletResponse 객체는 service() 메소드가 실행되는 동안에만 메모리에 상주하고 있기 때문, 그동안에만 사용할 수 있다.

응답정보 처리 - HttpServletResponse

HttpServletResponse 인터페이스는 우리가 웹 애플리케이셔션을 개발하면서 응답 관련 작업을 수행할 때 사용하는 ServletResponse 인터페이스를 상속한다. 따라서 일반적인 네트워크 통신에서 응답과 관련된 메소드들을 포함하고 있으며, 여기에 HTTP 프로토콜 통신 기반의 응답 관련 메서드들도 확장하여 포함하고 있다.

  • ServletResponse : 일반적인 네트워크 통신에서의 응답 관련 메소드 제공
  • HttpServletResponse : HTTP 통신 기반의 응답 관련 메소드 확장 제공

HttpServletResponse 인터페이스 주요 메소드

void addCookie(Cookie cookie) | 인자값으로 주어진 쿠키를 응답정보 헤더에 추가한다. 쿠키는 응답정보의 set-cookie 헤더의 값으로 추가되어 클라이언트로 전송한다.

String encodeRedirectURL(String url) | 클라이언트와 서버 간 세션이 유지되는 상태에서 브라우저 쿠키를 지원하지 않을 때 주어진 URL 뒤에 세션 아이디를 추가하고 인코딩하여 지원한다.

String encodeURL(String url) | 주어진 URL에 세션 아이디를 추가하여 인코딩해서 반환한다.

void sendRedirect(String location) | 응답을 클라이언트가 요청한 URL이 아니라 sendRedirect()에 주어진 URL로 재전송한다. 매개변수 location은 절대 URL이나 상대URL로 지정한다. 이 메소드는 서버의 특정 자원이 다른 URL로 이동할 때 사용할 수 있는 메소드이다.

public void setDateHeader(String name, long date) | 날짜를 밀리 초로 변환하여 주어진 이름과 날짜를 응답정보 헤더에 설정한다.

public void setHeader(String name, String value) | 응답정보의 헤더에 주어진 이름과 값을 설정한다.

public void setIntHeader(String name, int value) | 주어진 이름과 정숫값을 갖도록 응답정보 헤더에 추가한다.

public void setStatus(int sc) | 응답으로 전송될 HTTP 응답에 대한 상태코드를 설정한다.

요청정보 처리 - HttpServletRequest

브라우저에서 URL을 이용하여 웹서버에 서블릿 수행을 요청할 때 아래와 같은 요청정보를 전달한다.

  • 클라이언트의 IP주소, 포트 번호
  • 클라이언트가 전송한 요청 헤더 정보
  • 요청 방식, 요청 프로토콜의 종류와 버전, 요청하는 파일의 URI, 요청받는 서버의 정보
  • 서버의 호스트 이름, 포트 번호
  • 사용자가 서블릿 요청 시 추가로 전달한 정보
  • 질의 문자열

위와 같은 요청정보는 HttpServletRequest 인터페이스의 get 메소드를 통해 추출할 수 있고, HttpServletRequest는 service()나 doGet(), doPost() 메소드의 첫 번째 인자로 전달된다.

클라이언트의 요청 때마다 전달되는 ServletRequest 객체는 아래와 같은 메소드를 이용하여 요청정보를 추출할 수 있다.

ServletRequest의 주요 메소드

Object getAttribute(String name) | ServletRequest 객체 안에 등록된 데이터를 추출하여 반환한다.

Enumeration getAttributeNames() | ServletRequest 객체 안에 등록된 데이터들의 이름 전부를 하나의 Enumeration 객체에 담아서 반환한다.

int getContentLength() | 서비스 요청 시 보낸 요청정보 몸체에 포함된 데이터의 길이를 반환한다, 만약 길이를 알 수 없을ㄷ 때는 -1을 반환한다.

ServletInputStream getInputStream() | 요청정보 몸체로부터 바이너리 데이터를 읽어들이기 위해 한 번에 한 줄씩 읽을 수 있는 ServletInputStream 객체를 반환한다.

String getParameter(String name) | 클라이언트가 보낸 질의 문자열 중에서 인자로 지정된 name과 일치하는 것을 찾아 name, value를 반환한다.

Enumeration <String> getParameterNames() | 클라이언트가 서버로 보낸 질의 문자열들의 이름을 하나의 Enumeration 객체에 담아서 반환한다.

String[] getParameterValues(String name) | 클라이언트가 서버로 보낸 질의 문자열 중에서 인자로 지정된 name 과 일치하는 모든 값을 찾아 하나의 String타입의 배열에 담아 반환한다.

String getProtocol() | 클라이언트가 서버에 서비스를 요청하면서 사용한 프로토콜 정보를 반환한다.

BufferedReader getReader() | 요청정보 몸체로부터 문자 인코딩에 따라 텍스트를 읽어들이기 위한 BufferedReader 객체를 반환한다.

String getRemoteAddr() | 서버에 서비스를 요청한 클라이언트의 IP주소를 반환한다.

String getScheme() | 서비스 요청 시 사용한 http, https 또는 ftp등과 같은 프로토콜 이름을 반환한다.

String getServerName() | 서비스 요청받은 서버의 이름을 반환한다.

int getServerPort() | 클라이언트의 서비스를 요청받은 서버 포트 번호를 반환한다.

ServletContext getServletContext() | 서버가 시작될 때 웹 애플리케이션 단위로 생성된 ServletContext 객체 주소를 추출하여 반환한다.

void removeAttribute(String name) | ServletRequest 객체에 setAttribute(name) 메소드를 이용하여 등록된 데이터를 삭제한다.

void setAttribute(String name, Object o) | 클라이언트의 또 다른 서비스 요청에서도 계속해서 사용하고 싶은 데이터는 서버에 저장해야 하는데, ServletRequest 객체 안에 저장해둔다.

void setCharacterEncoding(String env) | 클라이언트가 요청정보 몸체에 포함해서 보내는 문자열들을 지정된 문자셋을 이용해 인코딩해준다.

HttpServletRequest의 메소드

String getHeader(String headerName) | HTTP 요청 헤더에 지정된 headerName의 값을 문자열로 반환한다. 만일 HTTP 요청 헤더에 headerName의 값이 없으면 null을 반환한다.

Enumeration getHeaderNames() | HTTP 요청 헤더에 포함된 모든 헤더의 이름을 Enumeration으로 반환한다.

Enumeration getHeaders(String headername) | HTTP 요청 헤더에 포함된 headerName의 모든 값을 Enumeration으로 반환한다.

int getHeader(String headerName) | HTTP 요청 헤더에 포함된 headerName의 값을 int로 반환한다. 지정된 headerName의 값을 int로 변환할 수 없을 때 NumberFormat Exceprion이 발생하고, headerName 헤더가 HTTP 요청 헤더에 없을 때 -1을 반환한다.

long getDateHeader(String headerName) | HTTP 요청 헤더에 포함된 headerName의 값을 밀리초로 변환하여 long으로 반환한다. 지정된 header의 값을 int로 변환할 수 없을 때 IllegalArgumentException이 발생하고, headerName 헤더가 HTTP 요청 헤더에 없을 때 -1을 반환한다.

String getPathInfo() | 클라이언트가 서비스 요청 시 보낸 URL의 뒷부분에 있는 path 정보를 반환한다.

HttpSession getSession() | 서비스를 요청한 클라이언트가 사용하는 HttpSession 객체를 반환한다. 반환할 HttpSession 객체가 없으면 서로 생성하여 반환한다.

HttpSession getSession(boolean create) | 서비스를 요청한 클라이언트가 사용하는 HttpSession 객체를 반환한다. 만일 반환할 HttpSession 객체가 없으면 getSession(true)이면 새로 생성하여 반환하며 getSession(false)이면 HttpSession 객체를 새로 생성하지 않고 null을 반환한다.

Stirng getRequestedSessionId() | 서비스를 요청한 클라이언트가 사용하는 HttpSession ID를 반환한다.

boolean isRequestedSessionIdValid() | 서비스가 요청한 클라이언트가 사용하는 HttpSession 객체가 유효한지 판단한다.

boolean isRequestedSessionIdFromCookie() | 서비스를 요청한 클라이언트가 사용하는 HttpSession의 ID가 쿠키로 전달되면 true, 그렇지 않으면 false 를 반환한다.

boolean isRequestedSessionIdFromURL() | 서비스를 요청한 클라이언트가 사용하는 HttpSession의 ID가 URL에 포함되면 true, 그렇지 않으면 false를 반환한다.

Cookie[] getCookies() | 서비스를 요청받는 서버가 서비스를 요청한 클라이언트에게 이전에 보낸 모든 쿠키를 추출한다.

String getRequestURI() | 클라이언트가 서비스 요청 시 보낸 URL에서 URI 부분만 반환한다.

String getQueryString() | 클라이언트가 GET 방식으로 서버에 보낸 질의 문자열들을 모두 추출하여 반환한다.

String getMethod() | 클라이언트가 서비스를 요청할 때 요청한 방식의 이름을 반환한다.

Stirng getPathTranslated() | 클라이언트가 서비스 요청 시 보낸 URL의 로 정보를 절대경로(path)로 변경하여 반환한다.

0개의 댓글