본문 바로가기
Java

[Java] HTTP 웹 서버 구현 / 302 status code 적용

by bkuk 2023. 3. 17.

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());
    }
}

 

댓글