302 status 적용해야하는 상황
"회원가입"을 완료하면 /index.html로 이동해야 한다. URI가 "/user/create"로 유지되는 상태로 읽어서 클라이언트에게 전달할 파일이 없다. 따라서 회원가입을 완료한 후 /index.html 페이지로 이동하면서 브라우저의 URL도 /user/create가 아니라 /index.html로 변경해야 한다.
두번의 요청과 응답
회원가입을 처리하는 /user/create 요청과 첫 화면(/index.html)을 보여주는 요청을 분리한 후 HTTP의 302 상태 코드를 활용해 해결한다. 즉, 서버측에서는 /user/create 요청을 받아 회원가입을 완료한 후 응답을 보낼 때 클라이언트에게 /index.html로 이동하도록 할 수 있다. 이때 사용하는 상태 코드가 302 상태 코드이다. index.html로 이동하도록 응답을 보낼 때 사용하는 응답 헤더는 Location으로 아래와 같이 응답을 보내면 된다.
HTTP/1.1 302 Found
Location: /index.html
위와 같이 응답을 보내면 클라이언트는 첫 라인의 상태 코드를 확인한 후 302라면 Location의 값을 읽어 서버에 재 요청을 보내게 된다.
따라서, 302 상태 코드를 활용한 페이지 이동 방식은 많은 라이브러리와 프레임워크에서 리다이렉트 이동 방식으로 알려져 있다. 앞으로 웹 애플리케이션을 개발하면서 리다이렉트 방식으로 페이지를 이동한다고 하면 내부적으로 302 상태 코드를 활용해 이동하겠구나 라고 생각하면 된다.
소스 코드
if( requestURI.contains("/user/create")) {
String requestBody = IOUtils.readData(br, contentLength);
Map<String, String> parameterMap = HttpRequestUtils.parseQueryString(requestBody);
User user = new User(
parameterMap.get("userId"),
parameterMap.get("password"),
parameterMap.get("name"),
parameterMap.get("email") );
log.debug("User Model : {}", user.toString());
requestURI = "/index.html";
DataOutputStream dos = new DataOutputStream(out);
byte[] body = Files.readAllBytes(Paths.get("./webapp" + requestURI));
response302Header(dos, requestURI);
responseBody(dos, body);
}
private void response302Header(DataOutputStream dos, String requestURI) {
try {
dos.writeBytes("HTTP/1.1 302 Found \r\n");
dos.writeBytes("Location: " + requestURI );
dos.writeBytes("\r\n");
} catch (IOException e) {
log.error(e.getMessage());
}
}
'Java' 카테고리의 다른 글
[Java] HTTP 웹 서버 구현 / CSS 지원하기 (0) | 2023.03.17 |
---|---|
[Java] HTTP 웹 서버 구현 / 로그인 구현 (0) | 2023.03.17 |
[Java] HTTP 웹 서버 구현 / POST 방식으로 회원가입 (0) | 2023.03.17 |
[Java] HTTP 웹 서버 구현 / GET 방식으로 회원가입 (0) | 2023.03.17 |
[Java] HTTP 웹 서버 구현 / index.html 요청에 대한 응답 (0) | 2023.03.17 |
댓글