-
Notifications
You must be signed in to change notification settings - Fork 388
[1 - 2 단계 Tomcat 구현하기] 테드(김규태) 미션 제출합니다. #572
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
fed02f6
7e91356
ba5c36d
1079350
8309210
88ff134
a3a5a38
87faf32
ed82d8a
e80274a
055439f
20b3b92
236a0f6
06e8288
5f3c7f8
b9d83f4
280caf5
2cb85c0
d9bdda1
c509f08
455ea74
e094dda
ce0ca5d
ace0a51
de3b27b
ea605f6
6209a7a
6ad5478
9a67e20
4c7fa83
2fe0e5a
c45a246
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -6,4 +6,5 @@ server: | |
| accept-count: 1 | ||
| max-connections: 1 | ||
| threads: | ||
| min-spare: 2 | ||
| max: 2 | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,26 @@ | ||
| package com.techcourse.controller; | ||
|
|
||
| import java.io.IOException; | ||
| import org.apache.coyote.http11.request.HttpRequest; | ||
| import org.apache.coyote.http11.response.HttpResponse; | ||
|
|
||
| public abstract class AbstractController implements Controller { | ||
|
|
||
| @Override | ||
| public void service(HttpRequest request, HttpResponse response) throws IOException { | ||
| String method = request.getRequestLine().getMethod(); | ||
| if (method.equals("POST")) { | ||
| doPost(request, response); | ||
| } else if (method.equals("GET")) { | ||
| doGet(request, response); | ||
| } else { | ||
| response.setStatus405(); | ||
| } | ||
| } | ||
|
|
||
| protected void doPost(HttpRequest request, HttpResponse response) throws IOException { | ||
| } | ||
|
|
||
| protected void doGet(HttpRequest request, HttpResponse response) throws IOException { | ||
| } | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,9 @@ | ||
| package com.techcourse.controller; | ||
|
|
||
| import java.io.IOException; | ||
| import org.apache.coyote.http11.request.HttpRequest; | ||
| import org.apache.coyote.http11.response.HttpResponse; | ||
|
|
||
| public interface Controller { | ||
| void service(HttpRequest request, HttpResponse response) throws IOException; | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,96 @@ | ||
| package com.techcourse.controller; | ||
|
|
||
| import com.techcourse.db.InMemoryUserRepository; | ||
| import com.techcourse.model.User; | ||
| import java.io.IOException; | ||
| import java.util.HashMap; | ||
| import java.util.Map; | ||
| import java.util.Optional; | ||
| import com.techcourse.session.Session; | ||
| import com.techcourse.session.SessionManager; | ||
| import com.techcourse.view.View; | ||
| import com.techcourse.view.ViewResolver; | ||
| import org.apache.coyote.http11.HttpCookie; | ||
| import org.apache.coyote.http11.request.HttpRequest; | ||
| import org.apache.coyote.http11.response.HttpResponse; | ||
|
|
||
| public class LoginController extends AbstractController { | ||
|
|
||
| @Override | ||
| protected void doGet(HttpRequest request, HttpResponse response) throws IOException { | ||
| Session session = extractSession(request); | ||
| if (session != null) { | ||
| User user = (User) session.getAttribute("user"); | ||
| if (user != null) { | ||
| responseLoginSuccess(response, session); | ||
| return; | ||
| } | ||
| } | ||
| responseLoginPage(request, response); | ||
| } | ||
|
|
||
| @Override | ||
| protected void doPost(HttpRequest request, HttpResponse response) { | ||
| if (!request.hasBodyData()) { | ||
| throw new IllegalArgumentException("Query string is missing in the request"); | ||
| } | ||
|
|
||
| Map<String, String> requestFormData = request.getFormData(); | ||
| String userName = requestFormData.get("account"); | ||
| String password = requestFormData.get("password"); | ||
|
|
||
| Optional<User> account = InMemoryUserRepository.findByAccount(userName); | ||
| if (account.isEmpty()) { | ||
| responseLoginFail(response); | ||
| } else { | ||
| User user = account.get(); | ||
| if (user.checkPassword(password)) { | ||
| Session session = saveSession(user); | ||
| responseLoginSuccess(response, session); | ||
| } else { | ||
| responseLoginFail(response); | ||
| } | ||
| } | ||
| } | ||
|
|
||
| private Session extractSession(HttpRequest request) { | ||
| String cookie = request.getCookie(); | ||
| if (cookie == null) { | ||
| Map<String, String> cookies = new HashMap<>(); | ||
| for (String cookieParts : cookie.split(" ")) { | ||
| String[] keyAndValue = cookieParts.split("="); | ||
| cookies.put(keyAndValue[0], keyAndValue[1]); | ||
| } | ||
|
|
||
| String jsessionId = cookies.get("JSESSIONID"); | ||
| return SessionManager.findSession(jsessionId); | ||
| } | ||
|
|
||
| return null; | ||
| } | ||
|
Comment on lines
+56
to
+70
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 의견) 해당 메서드는 LoginController 보다는 SesseionManager의 책임이라고 느껴지는 것 같은데 테드의 생각이 궁금해요!🧐
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 쿠키에서 JSessionId를 추출하는 책임을 쿠키가 가지고 있는 것이 맞는 것 같아서 조정했습니다 |
||
|
|
||
| private Session saveSession(User user) { | ||
| Session session = new Session(); | ||
| session.setAttribute("user", user); | ||
| SessionManager.add(session); | ||
| return session; | ||
| } | ||
|
|
||
| private void responseLoginPage(HttpRequest request, HttpResponse response) throws IOException { | ||
| View view = ViewResolver.getView("/login.html"); | ||
| response.setStatus200(); | ||
| response.setResponseBody(view.getContent()); | ||
| response.setContentType(request.getContentType()); | ||
| } | ||
|
|
||
| private void responseLoginSuccess(HttpResponse response, Session session) { | ||
| response.setStatus302(); | ||
| response.setLocation("/index.html"); | ||
| response.setCookie(HttpCookie.ofJSessionId(session.getId())); | ||
| } | ||
|
|
||
| private void responseLoginFail(HttpResponse response) { | ||
| response.setStatus302(); | ||
| response.setLocation("/401.html"); | ||
| } | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,58 @@ | ||
| package com.techcourse.controller; | ||
|
|
||
| import com.techcourse.db.InMemoryUserRepository; | ||
| import com.techcourse.model.User; | ||
| import java.io.IOException; | ||
| import java.util.Map; | ||
| import com.techcourse.view.View; | ||
| import com.techcourse.view.ViewResolver; | ||
| import org.apache.coyote.http11.request.HttpRequest; | ||
| import org.apache.coyote.http11.response.HttpResponse; | ||
| import org.slf4j.Logger; | ||
| import org.slf4j.LoggerFactory; | ||
|
|
||
| public class RegisterController extends AbstractController { | ||
|
|
||
| private static final Logger log = LoggerFactory.getLogger(RegisterController.class); | ||
|
|
||
| @Override | ||
| protected void doPost(HttpRequest request, HttpResponse response) { | ||
| try { | ||
| if (!request.hasBodyData()) { | ||
| throw new IllegalArgumentException("RequestBody is missing in the request"); | ||
| } | ||
|
|
||
| Map<String, String> requestFormData = request.getFormData(); | ||
| String account = requestFormData.get("account"); | ||
| String password = requestFormData.get("password"); | ||
| String email = requestFormData.get("email"); | ||
|
|
||
| User user = new User(account, password, email); | ||
|
Comment on lines
+25
to
+30
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 의견) reqeustForm 에 account 가 없거나 email 이 없거나 등에 대한 검증은 추가해주면 좋을 것 같아요!
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 반영 완료 👍 |
||
| InMemoryUserRepository.save(user); | ||
| responseRegisterSuccess(response); | ||
|
|
||
| } catch (IllegalArgumentException e) { | ||
| response.setStatus400(); | ||
| response.setResponseBody(e.getMessage()); | ||
| log.info("Bad Request: {}", e.getMessage()); | ||
|
|
||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 불필요한 개행이네요😁
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 3단계 하면서 공백도 다시 확인했습니다 👍 |
||
| } | ||
| } | ||
|
|
||
| @Override | ||
| protected void doGet(HttpRequest request, HttpResponse response) throws IOException { | ||
| responseRegisterPage(request, response); | ||
| } | ||
|
|
||
| private void responseRegisterSuccess(HttpResponse response) { | ||
| response.setStatus302(); | ||
| response.setLocation("/index.html"); | ||
| } | ||
|
|
||
| private void responseRegisterPage(HttpRequest request, HttpResponse response) throws IOException { | ||
| View view = ViewResolver.getView("/register.html"); | ||
| response.setStatus200(); | ||
| response.setResponseBody(view.getContent()); | ||
| response.setContentType(request.getContentType()); | ||
| } | ||
| } | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
min-spare를 설정한 이유와 2인 근거가 궁금해요!There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이건 메인 브랜치 변경사항 받아오면서 생긴 부분인 것 같아요!