diff --git a/src/main/java/db/SessionDataBase.java b/src/main/java/db/SessionDataBase.java new file mode 100644 index 00000000..6fab7f03 --- /dev/null +++ b/src/main/java/db/SessionDataBase.java @@ -0,0 +1,17 @@ +package db; + +import java.util.HashMap; +import java.util.Map; + +public class SessionDataBase { + + private static final Map SESSIONS = new HashMap<>(); + + public static void save(String sessionId, String userId) { + SESSIONS.put(sessionId, userId); + } + + public static void remove(String sessionId) { + SESSIONS.remove(sessionId); + } +} diff --git a/src/main/java/webserver/HttpRequest.java b/src/main/java/webserver/HttpRequest.java index 83b5ad10..63c6fde1 100644 --- a/src/main/java/webserver/HttpRequest.java +++ b/src/main/java/webserver/HttpRequest.java @@ -22,8 +22,7 @@ public HttpRequest(BufferedReader br) throws IOException { private void init() throws IOException { String requestLine = URLDecoder.decode(br.readLine(), StandardCharsets.UTF_8); - String[] requestLineSplit = requestLine.split(" "); - this.requestLine = new RequestLine(requestLineSplit[0], requestLineSplit[1], requestLineSplit[2]); + this.requestLine = new RequestLine(requestLine); this.headers = IOUtils.readRequestHeader(br); this.parameters = parseParameter(); } @@ -48,4 +47,7 @@ public String getParameter(String key) { return parameters.get(key); } + public String getHeader(String header) { + return headers.get(header); + } } diff --git a/src/main/java/webserver/HttpResponse.java b/src/main/java/webserver/HttpResponse.java index 28d2978d..9565c24e 100644 --- a/src/main/java/webserver/HttpResponse.java +++ b/src/main/java/webserver/HttpResponse.java @@ -19,10 +19,32 @@ public HttpResponse(OutputStream out) { } - public void response302Header() { + public void response302WithExpiredCookieHeader(String path, String cookie) { try { dos.writeBytes("HTTP/1.1 302 FOUND \r\n"); - dos.writeBytes("Location: http://localhost:8080/index.html\r\n"); + dos.writeBytes("Location: http://localhost:8080" + path + "\r\n"); + dos.writeBytes("Set-Cookie: sessionId=" + cookie + "; Max-Age=-1; path=/"); + dos.writeBytes("\r\n"); + } catch (IOException e) { + log.error(e.getMessage()); + } + } + + public void response302WithCookieHeader(String path, String cookie) { + try { + dos.writeBytes("HTTP/1.1 302 FOUND \r\n"); + dos.writeBytes("Location: http://localhost:8080" + path + "\r\n"); + dos.writeBytes("Set-Cookie: sessionId=" + cookie + "; path=/"); + dos.writeBytes("\r\n"); + } catch (IOException e) { + log.error(e.getMessage()); + } + } + + public void response302Header(String path) { + try { + dos.writeBytes("HTTP/1.1 302 FOUND \r\n"); + dos.writeBytes("Location: http://localhost:8080" + path + "\r\n"); dos.writeBytes("\r\n"); } catch (IOException e) { log.error(e.getMessage()); diff --git a/src/main/java/webserver/RequestHandler.java b/src/main/java/webserver/RequestHandler.java index b7104ab2..2e34f981 100644 --- a/src/main/java/webserver/RequestHandler.java +++ b/src/main/java/webserver/RequestHandler.java @@ -1,6 +1,7 @@ package webserver; import db.DataBase; +import db.SessionDataBase; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; @@ -8,9 +9,12 @@ import java.io.OutputStream; import java.net.Socket; import java.nio.charset.StandardCharsets; +import java.util.Map; +import java.util.UUID; import model.User; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import util.HttpRequestUtils; public class RequestHandler extends Thread { @@ -32,21 +36,57 @@ public void run() { new InputStreamReader(in, StandardCharsets.UTF_8)); HttpRequest httpRequest = new HttpRequest(br); + HttpResponse httpResponse = new HttpResponse(out); - if (httpRequest.getPath().contains("/user/create")) { + if (httpRequest.getPath().equals("/user/create")) { User user = new User( httpRequest.getParameter("userId"), httpRequest.getParameter("password"), httpRequest.getParameter("name"), httpRequest.getParameter("email") ); - DataBase.addUser(user); - HttpResponse httpResponse = new HttpResponse(out); - httpResponse.response302Header(); + + try { + DataBase.addUser(user); + httpResponse.response302Header("/index.html"); + } catch (IllegalArgumentException e) { + log.debug("exception: {}", e.getMessage()); + httpResponse.response302Header("/user/form.html"); + } + return; + } + + if (httpRequest.getPath().equals("/user/login")) { + User user = DataBase.findUserById(httpRequest.getParameter("userId")); + if (user == null) { + httpResponse.response302Header("/user/login_failed.html"); + return; + } + if (!user.getPassword().equals(httpRequest.getParameter("password"))) { + httpResponse.response302Header("/user/login_failed.html"); + return; + } + String sessionId = UUID.randomUUID().toString(); + log.debug("return cookie: {}", sessionId); + SessionDataBase.save(sessionId, user.getUserId()); + httpResponse.response302WithCookieHeader("/index.html", sessionId); + return; + } + + if (httpRequest.getPath().equals("/user/logout")) { + Map cookies = HttpRequestUtils.parseCookies( + httpRequest.getHeader("Cookie")); + String sessionId = cookies.get("sessionId"); + log.debug("sessionId = {}", sessionId); + if (sessionId == null) { + httpResponse.response302Header("/index.html"); + return; + } + httpResponse.response302WithExpiredCookieHeader("/index.html", sessionId); + SessionDataBase.remove(sessionId); return; } - HttpResponse httpResponse = new HttpResponse(out); httpResponse.writeBody(httpRequest.getPath()); httpResponse.response200Header(); httpResponse.responseBody(); diff --git a/src/main/java/webserver/RequestLine.java b/src/main/java/webserver/RequestLine.java index 79130f82..92f0754a 100644 --- a/src/main/java/webserver/RequestLine.java +++ b/src/main/java/webserver/RequestLine.java @@ -10,10 +10,11 @@ public class RequestLine { private String path; private String httpVersion; - public RequestLine(String httpMethod, String path, String httpVersion) { - this.httpMethod = httpMethod; - this.path = path; - this.httpVersion = httpVersion; + public RequestLine(String requestLine) { + String[] requestLineSplit = requestLine.split(" "); + this.httpMethod = requestLineSplit[0]; + this.path = requestLineSplit[1]; + this.httpVersion = requestLineSplit[2]; } public String getPath() { diff --git a/webapp/index.html b/webapp/index.html index 1675898a..939884b9 100644 --- a/webapp/index.html +++ b/webapp/index.html @@ -71,7 +71,7 @@
  • 로그인
  • 회원가입
  • --> -
  • 로그아웃
  • +
  • 로그아웃
  • 개인정보수정
  • @@ -145,4 +145,4 @@ - \ No newline at end of file +