diff --git a/tomcat/src/main/java/org/apache/coyote/http11/RequestMappingHandler.java b/tomcat/src/main/java/org/apache/catalina/RequestMappingHandler.java similarity index 68% rename from tomcat/src/main/java/org/apache/coyote/http11/RequestMappingHandler.java rename to tomcat/src/main/java/org/apache/catalina/RequestMappingHandler.java index 1c51b5f829..35c423044a 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/RequestMappingHandler.java +++ b/tomcat/src/main/java/org/apache/catalina/RequestMappingHandler.java @@ -1,5 +1,9 @@ -package org.apache.coyote.http11; +package org.apache.catalina; +import nextstep.jwp.LoginHandler; +import nextstep.jwp.model.User; +import org.apache.catalina.session.HttpSession; +import org.apache.catalina.session.SessionManager; import org.apache.coyote.http11.request.HttpMethod; import org.apache.coyote.http11.request.HttpRequest; import org.apache.coyote.http11.response.*; @@ -28,14 +32,34 @@ public enum RequestMappingHandler { } public static Controller findController(final HttpRequest request) { - String resourcePath = request.getRequestLine().getRequestUrl(); - HttpMethod requestMethod = request.getRequestLine().getHttpMethod(); + final String resourcePath = request.getRequestLine().getRequestUrl(); + final HttpMethod requestMethod = request.getRequestLine().getHttpMethod(); - return Arrays.stream(values()) + final Controller findController = Arrays.stream(values()) .filter(value -> value.condition.test(resourcePath, requestMethod)) .findFirst() .orElseThrow(() -> new IllegalArgumentException("잘못된 url 요청입니다.")) .getController(); + + if (findController instanceof LoginPostController + && (!request.hasJSessionId())) { + addSession(request); + } + if (findController instanceof LoginGetController + && request.hasJSessionId() + && SessionManager.isExist(request.getJSessionId())) { + request.setHasValidatedSessionTrue(); + } + return findController; + } + + private static void addSession(final HttpRequest request) { + final SessionManager sessionManager = new SessionManager(); + final LoginHandler loginHandler = new LoginHandler(); + final User user = loginHandler.getUser(request.getRequestBody()); + final HttpSession httpSession = new HttpSession("user", user); + sessionManager.add(httpSession); + request.addJSessionId(httpSession.getId()); } public static boolean isFileGetUrl(final String resourcePath, final HttpMethod requestMethod) { diff --git a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java index 90ccda685b..8523e2e433 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java @@ -1,6 +1,7 @@ package org.apache.coyote.http11; import nextstep.jwp.exception.UncheckedServletException; +import org.apache.catalina.RequestMappingHandler; import org.apache.coyote.Processor; import org.apache.coyote.http11.request.HttpRequest; import org.apache.coyote.http11.response.Controller; @@ -51,7 +52,4 @@ public void process(final Socket connection) { } } - // 쿠키값 빼내올때 문제점 - // doPost, doGet 추가수정 - // 세션 전략 세우기 } diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java b/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java index 0da6c372b7..a078d29b63 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java @@ -12,6 +12,7 @@ public class HttpRequest { private final RequestLine requestLine; private final RequestHeader requestHeader; private final String requestBody; + private boolean hasValidatedSession; public HttpRequest(final BufferedReader reader) throws IOException, URISyntaxException { final List lines = readAllLines(reader); @@ -19,6 +20,7 @@ public HttpRequest(final BufferedReader reader) throws IOException, URISyntaxExc requestLine = createRequestLine(lines); requestHeader = createRequestHeader(lines); requestBody = addRequestBody(lines, reader); + hasValidatedSession = false; } private static List readAllLines(final BufferedReader reader) { @@ -70,10 +72,18 @@ private int getContentLength(List lines) { return 0; } + public void addJSessionId(final String jSessionId) { + requestHeader.addSession(jSessionId); + } + public boolean hasJSessionId() { return requestHeader.hasJSessionId(); } + public void setHasValidatedSessionTrue() { + this.hasValidatedSession = true; + } + public String getJSessionId() { return requestHeader.getJSessionId(); } @@ -89,4 +99,8 @@ public RequestHeader getRequestHeader() { public String getRequestBody() { return requestBody; } + + public boolean isHasValidatedSession() { + return hasValidatedSession; + } } diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/RequestHeader.java b/tomcat/src/main/java/org/apache/coyote/http11/request/RequestHeader.java index 3cbbd1e6f8..f75bb5d4a4 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/RequestHeader.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/RequestHeader.java @@ -42,4 +42,8 @@ public String getJSessionId() { final String[] parts = cookie.split("="); return parts[1]; } + + public void addSession(String jSessionId){ + headers.put(COOKIE, "JSessionId=" + jSessionId); + } } diff --git a/tomcat/src/main/java/org/apache/coyote/http11/response/LoginGetController.java b/tomcat/src/main/java/org/apache/coyote/http11/response/LoginGetController.java index 56a9757bf2..081f1f2160 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/response/LoginGetController.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/response/LoginGetController.java @@ -2,7 +2,6 @@ import org.apache.coyote.http11.ContentType; import org.apache.coyote.http11.request.HttpRequest; -import org.apache.catalina.session.SessionManager; public class LoginGetController implements Controller { @@ -12,14 +11,13 @@ public void service(final HttpRequest request, final String resourcePath = request.getRequestLine().getRequestUrl() + ".html"; final String responseBody = ResourceResolver.resolve(resourcePath); - if (request.hasJSessionId() && SessionManager.isExist(request.getJSessionId())) { - response.setStatusCode(StatusCode.OK); - response.setResponseBody(ResourceResolver.resolve("/index.html")); - response.addHeader("Content-Type", ContentType.from("/index.html").getContentType() + ";charset=utf-8"); - response.addHeader("Content-Length", String.valueOf(ResourceResolver.resolve("/index.html").getBytes().length)); + if (request.isHasValidatedSession()) { + final String jSessionId = request.getJSessionId(); + response.addJSessionId(jSessionId); + response.setStatusCode(StatusCode.FOUND); + response.addHeader("Location", "/index.html"); return; } - response.setStatusCode(StatusCode.OK); response.setResponseBody(ResourceResolver.resolve(resourcePath)); response.addHeader("Content-Type", ContentType.from(resourcePath).getContentType() + ";charset=utf-8"); diff --git a/tomcat/src/main/java/org/apache/coyote/http11/response/LoginPostController.java b/tomcat/src/main/java/org/apache/coyote/http11/response/LoginPostController.java index fbf89e651a..8d65816344 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/response/LoginPostController.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/response/LoginPostController.java @@ -1,9 +1,6 @@ package org.apache.coyote.http11.response; import nextstep.jwp.LoginHandler; -import nextstep.jwp.model.User; -import org.apache.catalina.session.HttpSession; -import org.apache.catalina.session.SessionManager; import org.apache.coyote.http11.ContentType; import org.apache.coyote.http11.request.HttpRequest; @@ -22,16 +19,8 @@ public void service(final HttpRequest request, private void successLoginResponse(final HttpRequest request, final HttpResponse response) { - final SessionManager sessionManager = new SessionManager(); - if (!request.hasJSessionId()) { - final LoginHandler loginHandler = new LoginHandler(); - final User user = loginHandler.getUser(request.getRequestBody()); - final HttpSession httpSession = new HttpSession("user", user); - sessionManager.add(httpSession); - - final HttpSession session = sessionManager.findSession(httpSession.getId()); - response.addJSessionId(session.getId()); - } + final String jSessionId = request.getJSessionId(); + response.addJSessionId(jSessionId); response.setStatusCode(StatusCode.FOUND); response.addHeader("Location", "/index.html"); }