Cache-Control: no-cache, no-store, must-revalidate
Connection: keep-alive
Content-Length: 3
Content-Type: text/plain;charset=utf-8
Date: Thu, 21 Apr 2022 16:48:03 GMT
Keep-Alive: timeout=60
my-header: hello
Pragma: no-cache
Set-Cookie: myCookie=good; Max-Age=600; Expires=Thu, 21-Apr-2022 16:58:03 GMT
응답 HttpServletResponse에 대해서 알아보자.
HTTP 응답 메시지 생성
- HTTP 응답코드 지정 200 400 500 401 403 등등
- 헤더 생성
- 바디 생성
편의 기능 제공
- Content-Type, 쿠키, Redirect(300대)
코드로 한 번 자세히 알아보자.
response 패키지 안에 ResponseHeaderServlet 클래스를 만들어 주고
실행을 시킨 다음 localhost:8080/response-header에서 network를 확인하면
// ResponseHeaderServlet
package hello.setvlet.basic.response;
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;
import java.io.PrintWriter;
@WebServlet(name = "responseHeaderServlet", urlPatterns = "/response-header")
public class ResponseHeaderServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 직접 200 적는거 보다 SC_OK가 낫다.
// [status - line]
response.setStatus(HttpServletResponse.SC_OK);
// [response - headers]
response.setHeader("Content-Type", "text/plain");
// 캐시 완전 무효화
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
// 과거버전까지 캐시를 없앤다.
response.setHeader("Pragma", "no-cache");
// 내가 원하는 임의의 header에 실려나간다.
response.setHeader("my-header", "hello");
PrintWriter writer = response.getWriter();
writer.println("ok");
}
}
network 결과가 잘 나온다.
content type에 utf-8을 넣고 다시 돌려보자. content-type에 utf-8이 잘 들어갔다.
// [response - headers]
response.setHeader("Content-Type", "text/plain;charset=utf-8");
writer.println("안녕하세요");
Bad Request도 한번 보자. 아래부분을
response.setStatus(HttpServletResponse.SC_OK);
바꾸고 재실행하면 400 결과가 잘나온다.
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
Content 편의 메서드를 작성해보자. 편의 메서드를 넣어주고 content-type이 2인것을 확인해주자.
// RequestHeaderServlet class
package hello.setvlet.basic.response;
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;
import java.io.PrintWriter;
@WebServlet(name = "responseHeaderServlet", urlPatterns = "/response-header")
public class ResponseHeaderServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 직접 200 적는거 보다 SC_OK가 낫다.
// [status - line]
response.setStatus(HttpServletResponse.SC_OK);
// [response - headers]
response.setHeader("Content-Type", "text/plain;charset=utf-8");
// 캐시 완전 무효화
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
// 과거버전까지 캐시를 없앤다.
response.setHeader("Pragma", "no-cache");
// 내가 원하는 임의의 header에 실려나간다.
response.setHeader("my-header", "hello");
// [Header 편의 메서드]
content(response);
PrintWriter writer = response.getWriter();
// print를 해줘서 content-type이 2인것을 확인
writer.print("ok");
}
private void content(HttpServletResponse response) {
//Content-Type: text/plain;charset=utf-8
//Content-Length: 2
//response.setHeader("Content-Type", "text/plain;charset=utf-8");
response.setContentType("text/plain");
response.setCharacterEncoding("utf-8");
// response.setContentLength(2); //(생략시 자동 생성)
}
}
쿠키 편의 메서드에 대해서 알아보자.
// [Header 편의 메서드]
// content(response);
cookie(response);
private void cookie(HttpServletResponse response) {
//Set-Cookie: myCookie=good; Max-Age=600;
// response.setHeader("Set-Cookie", "myCookie=good; Max-Age=600");
Cookie cookie = new Cookie("myCookie", "good");
cookie.setMaxAge(600); //600초
// addCookie를 하면 response.setHeader("Set-Cookie", "myCookie=good; Max-Age=600");와 같은 결과가 나온다.
response.addCookie(cookie);
}
ResponseHeaders에 결과값이 잘 들어온 것을 확인 할 수 있다.
Cache-Control: no-cache, no-store, must-revalidate
Connection: keep-alive
Content-Length: 3
Content-Type: text/plain;charset=utf-8
Date: Thu, 21 Apr 2022 16:48:03 GMT
Keep-Alive: timeout=60
my-header: hello
Pragma: no-cache
Set-Cookie: myCookie=good; Max-Age=600; Expires=Thu, 21-Apr-2022 16:58:03 GMT
다시 리프레시하면 웹 브라우저에서 서버로 쿠키를 또 보낸다.
리다이렉트 편의 메서드를 만들어보자.
redirect(response);
private void redirect(HttpServletResponse response) throws IOException {
//Status Code 302
//Location: /basic/hello-form.html
//response.setStatus(HttpServletResponse.SC_FOUND); //302
//response.setHeader("Location", "/basic/hello-form.html");
response.sendRedirect("/basic/hello-form.html");
}
http://localhost:8080/basic/response-header에서
http://localhost:8080/basic/hello-form.html로 redirection이 된다.
network 상으로 뜨지 않아서 이렇게 적었다. 왜 뜨지 않을까??,,,,, response-header이 304라고 떴다.
response-header status 302
hello-form.html status 200
굉장히 불편하다. 한줄로 sendRedirect로 해주자.
private void redirect(HttpServletResponse response) throws IOException {
//Status Code 302
//Location: /basic/hello-form.html
// response.setStatus(HttpServletResponse.SC_FOUND); //302
// response.setHeader("Location", "/basic/hello-form.html");
response.sendRedirect("/basic/hello-form.html");
}
Response는 크게 어려움이 없다.
이렇게 실행하게 되면 HTTP 응답 스펙에 있는 start-line를 세팅하고 header 세팅하고 body-content에 있는 message body가 넣어지게 된다.
<출처 김영한: 스프링 MVC 1편 - 벡앤드 웹 개발 핵심 기술>
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의
웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., -
www.inflearn.com
'Spring > SpringMVC' 카테고리의 다른 글
회원 관리 웹 애플리케이션 요구사항 (0) | 2022.04.23 |
---|---|
HTTP 응답 데이터 - 단순 텍스트, HTML / API JSON (0) | 2022.04.22 |
HTTP 요청 데이터 - API 메시지 바디 - JSON (0) | 2022.04.22 |
HTTP 요청 데이터 - API 메시지 바디 - 단순 텍스트 (0) | 2022.04.22 |
HTTP 요청 데이터 - POST HTML Form - 로그 에러 (0) | 2022.04.21 |