-
Notifications
You must be signed in to change notification settings - Fork 309
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[톰캣 구현하기 - 3, 4단계] 달리 미션 제출합니다 (#442)
* refactor: 클래스 제거 * refactor: handler 구조 변경 * refactor: filter 구현 * style: 코드 컨벤션 적용 * feat: threadPool 적용 * test: study 요구조건 진행 * refactor: 불필요한 클래스 분리 통합 * feat: controller 추상 매서드 추가 * refactor: requestline 분리 * refactor: bufferedreader 자원관리 * style: 코드 컨벤션 적용 * refactor: 사용하지 않는 클래스 제거 * refactor: Map key value 변경 * refactor: 값객체 클래스명 변경 * refactor: 생성자 접근자 변경 * refactor: filter 등록을 안할 시 npe 방지 default filter 추가 * refactor: var 제거 * style: 코드 컨벤션 적용 * feat: handler 및 FilterChainManager 싱글톤으로 관리 * refactor: singleton 생성자 private 으로 변경
- Loading branch information
1 parent
841e70a
commit c33e0ec
Showing
41 changed files
with
735 additions
and
544 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
package nextstep.jwp.config; | ||
|
||
import java.util.Map; | ||
import nextstep.jwp.db.InMemorySession; | ||
import org.apache.coyote.http11.filter.Filter; | ||
import org.apache.coyote.http11.filter.FilterChain; | ||
import org.apache.coyote.http11.request.Request; | ||
import org.apache.coyote.http11.response.HttpStatus; | ||
import org.apache.coyote.http11.response.Response; | ||
import org.apache.coyote.http11.util.Resource; | ||
|
||
public class LoginFilter implements Filter { | ||
|
||
@Override | ||
public void doFilter(Request request, Response response, FilterChain filterChain) { | ||
|
||
final String uri = request.getPath(); | ||
final Map<String, String> cookie = request.getCookie(); | ||
|
||
if (uri.equals("/login") && cookie.containsKey("JSESSIONID")) { | ||
validKey(cookie.get("JSESSIONID"), response); | ||
} | ||
filterChain.doFilter(request, response); | ||
} | ||
|
||
private void validKey(String jSessionId, Response response) { | ||
if (InMemorySession.isLogin(jSessionId)) { | ||
response | ||
.setStatus(HttpStatus.FOUND) | ||
.setContentType("html") | ||
.setLocation("/index.html") | ||
.setResponseBody(Resource.getFile("index.html")) | ||
.setFiltered(true); | ||
return; | ||
} | ||
response | ||
.setStatus(HttpStatus.UNAUTHORIZED) | ||
.setContentType("html") | ||
.setResponseBody(Resource.getFile("401.html")) | ||
.setLocation("/401.html") | ||
.setFiltered(true); | ||
} | ||
} |
43 changes: 43 additions & 0 deletions
43
tomcat/src/main/java/nextstep/jwp/config/RegisterFilter.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
package nextstep.jwp.config; | ||
|
||
import java.util.Map; | ||
import nextstep.jwp.db.InMemorySession; | ||
import org.apache.coyote.http11.filter.Filter; | ||
import org.apache.coyote.http11.filter.FilterChain; | ||
import org.apache.coyote.http11.request.Request; | ||
import org.apache.coyote.http11.response.HttpStatus; | ||
import org.apache.coyote.http11.response.Response; | ||
import org.apache.coyote.http11.util.Resource; | ||
|
||
public class RegisterFilter implements Filter { | ||
|
||
@Override | ||
public void doFilter(Request request, Response response, FilterChain filterChain) { | ||
|
||
final String uri = request.getPath(); | ||
final Map<String, String> cookie = request.getCookie(); | ||
|
||
if ((uri.equals("/register")) && cookie.containsKey("JSESSIONID")) { | ||
validKey(cookie.get("JSESSIONID"), response); | ||
} | ||
filterChain.doFilter(request, response); | ||
} | ||
|
||
private void validKey(String jSessionId, Response response) { | ||
if (InMemorySession.isLogin(jSessionId)) { | ||
response | ||
.setStatus(HttpStatus.FOUND) | ||
.setContentType("html") | ||
.setLocation("/index.html") | ||
.setResponseBody(Resource.getFile("index.html")) | ||
.setFiltered(true); | ||
return; | ||
} | ||
response | ||
.setStatus(HttpStatus.UNAUTHORIZED) | ||
.setContentType("html") | ||
.setResponseBody(Resource.getFile("401.html")) | ||
.setLocation("/401.html") | ||
.setFiltered(true); | ||
} | ||
} |
16 changes: 16 additions & 0 deletions
16
tomcat/src/main/java/nextstep/jwp/controller/HelloWorldController.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
package nextstep.jwp.controller; | ||
|
||
import org.apache.coyote.http11.controller.AbstractController; | ||
import org.apache.coyote.http11.request.Request; | ||
import org.apache.coyote.http11.response.HttpStatus; | ||
import org.apache.coyote.http11.response.Response; | ||
|
||
public class HelloWorldController extends AbstractController { | ||
|
||
@Override | ||
protected void doGet(Request request, Response response) { | ||
response.setStatus(HttpStatus.OK) | ||
.setContentType("html") | ||
.setResponseBody("Hello world!"); | ||
} | ||
} |
67 changes: 21 additions & 46 deletions
67
tomcat/src/main/java/nextstep/jwp/controller/LoginController.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,68 +1,43 @@ | ||
package nextstep.jwp.controller; | ||
|
||
import java.io.File; | ||
import java.io.IOException; | ||
import java.nio.file.Files; | ||
import java.util.HashMap; | ||
import java.util.Map; | ||
import nextstep.jwp.db.InMemorySession; | ||
import nextstep.jwp.db.InMemoryUserRepository; | ||
import nextstep.jwp.exception.UnauthorizedException; | ||
import nextstep.jwp.model.AuthUser; | ||
import nextstep.jwp.model.User; | ||
import org.apache.coyote.http11.controller.AbstractController; | ||
import org.apache.coyote.http11.request.Request; | ||
import org.apache.coyote.http11.response.HttpStatus; | ||
import org.apache.coyote.http11.response.Response; | ||
import org.apache.coyote.http11.servlet.Servlet; | ||
import org.apache.coyote.http11.util.Resource; | ||
|
||
public class LoginController { | ||
public class LoginController extends AbstractController { | ||
|
||
public static Response login(Request request){ | ||
@Override | ||
protected void doPost(Request request, Response response) { | ||
Map<String, String> body = request.getBody(); | ||
AuthUser authUser = AuthUser.from(body); | ||
User user = InMemoryUserRepository.findByAccount(authUser.getAccount()).orElseThrow(()->new UnauthorizedException("해당 유저가 없습니다.")); | ||
if(!user.checkPassword(authUser.getPassword())){ | ||
User user = InMemoryUserRepository.findByAccount(body.get("account")) | ||
.orElseThrow(() -> new UnauthorizedException("해당 유저가 없습니다.")); | ||
if (!user.checkPassword(body.get("password"))) { | ||
throw new UnauthorizedException("아이디 및 패스워드가 틀렸습니다."); | ||
} | ||
String jSessionId = InMemorySession.login(user); | ||
Map<String,String> cookie = new HashMap<>(); | ||
if(!request.getCookie().containsKey("JSESSIONID")){ | ||
cookie.put("JSESSIONID",jSessionId); | ||
Map<String, String> cookie = new HashMap<>(); | ||
if (!request.getCookie().containsKey("JSESSIONID")) { | ||
cookie.put("JSESSIONID", jSessionId); | ||
} | ||
return Response.builder() | ||
.status(HttpStatus.FOUND) | ||
.contentType("html") | ||
.cookie(cookie) | ||
.location("index.html") | ||
.responseBody(getFile("index.html")) | ||
.build(); | ||
response.setStatus(HttpStatus.FOUND) | ||
.setContentType("html") | ||
.setCookie(cookie) | ||
.setLocation("index.html") | ||
.setResponseBody(Resource.getFile("index.html")); | ||
} | ||
|
||
public static Response signUp(Request request){ | ||
Map<String, String> requestBody = request.getBody(); | ||
final String account = requestBody.get("account"); | ||
final String password = requestBody.get("password"); | ||
final String email = requestBody.get("email"); | ||
User user = new User(account,password,email); | ||
InMemoryUserRepository.save(user); | ||
return Response.builder() | ||
.status(HttpStatus.FOUND) | ||
.contentType("html") | ||
.location("index.html") | ||
.responseBody(getFile("index.html")) | ||
.build(); | ||
} | ||
|
||
|
||
private static String getFile(String fileName){ | ||
try { | ||
final var fileUrl = Servlet.class.getClassLoader().getResource("static/" + fileName); | ||
final var fileBytes = Files.readAllBytes(new File(fileUrl.getFile()).toPath()); | ||
return new String(fileBytes); | ||
} catch (IOException e) { | ||
throw new RuntimeException(e); | ||
} catch (NullPointerException e){ | ||
return ""; | ||
} | ||
@Override | ||
protected void doGet(Request request, Response response) { | ||
response.setStatus(HttpStatus.OK) | ||
.setContentType("html") | ||
.setResponseBody(Resource.getFile("login.html")); | ||
} | ||
} |
34 changes: 34 additions & 0 deletions
34
tomcat/src/main/java/nextstep/jwp/controller/RegisterController.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
package nextstep.jwp.controller; | ||
|
||
import java.util.Map; | ||
import nextstep.jwp.db.InMemoryUserRepository; | ||
import nextstep.jwp.model.User; | ||
import org.apache.coyote.http11.controller.AbstractController; | ||
import org.apache.coyote.http11.request.Request; | ||
import org.apache.coyote.http11.response.HttpStatus; | ||
import org.apache.coyote.http11.response.Response; | ||
import org.apache.coyote.http11.util.Resource; | ||
|
||
public class RegisterController extends AbstractController { | ||
|
||
@Override | ||
public void doPost(Request request, Response response) { | ||
Map<String, String> requestBody = request.getBody(); | ||
final String account = requestBody.get("account"); | ||
final String password = requestBody.get("password"); | ||
final String email = requestBody.get("email"); | ||
User user = new User(account, password, email); | ||
InMemoryUserRepository.save(user); | ||
response.setStatus(HttpStatus.FOUND) | ||
.setContentType("html") | ||
.setLocation("index.html") | ||
.setResponseBody(Resource.getFile("index.html")); | ||
} | ||
|
||
@Override | ||
protected void doGet(Request request, Response response) { | ||
response.setStatus(HttpStatus.OK) | ||
.setContentType("html") | ||
.setResponseBody(Resource.getFile("register.html")); | ||
} | ||
} |
46 changes: 9 additions & 37 deletions
46
tomcat/src/main/java/nextstep/jwp/controller/ViewController.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,48 +1,20 @@ | ||
package nextstep.jwp.controller; | ||
|
||
import java.io.File; | ||
import java.io.IOException; | ||
import java.nio.file.Files; | ||
import org.apache.coyote.http11.controller.AbstractController; | ||
import org.apache.coyote.http11.request.Request; | ||
import org.apache.coyote.http11.response.HttpStatus; | ||
import org.apache.coyote.http11.response.Response; | ||
import org.apache.coyote.http11.servlet.Servlet; | ||
import org.apache.coyote.http11.util.Resource; | ||
|
||
public class ViewController { | ||
public static Response getLogin(Request request){ | ||
return Response.builder() | ||
.status(HttpStatus.OK) | ||
.contentType("html") | ||
.responseBody(getFile("login.html")) | ||
.build(); | ||
} | ||
|
||
public static Response getRegister(Request request){ | ||
return Response.builder() | ||
.status(HttpStatus.OK) | ||
.contentType("html") | ||
.responseBody(getFile("register.html")) | ||
.build(); | ||
} | ||
public class ViewController extends AbstractController { | ||
|
||
public static Response getVoid(Request request){ | ||
return Response.builder() | ||
.status(HttpStatus.OK) | ||
.responseBody("Hello world!") | ||
.contentType("html") | ||
.build(); | ||
} | ||
@Override | ||
protected void doGet(Request request, Response response) { | ||
|
||
String fileName = request.getPath(); | ||
|
||
private static String getFile(String fileName){ | ||
try { | ||
final var fileUrl = Servlet.class.getClassLoader().getResource("static/" + fileName); | ||
final var fileBytes = Files.readAllBytes(new File(fileUrl.getFile()).toPath()); | ||
return new String(fileBytes); | ||
} catch (IOException e) { | ||
throw new RuntimeException(e); | ||
} catch (NullPointerException e){ | ||
return ""; | ||
} | ||
response.setStatus(HttpStatus.OK) | ||
.setContentType(fileName.split("\\.")[1]) | ||
.setResponseBody(Resource.getFile(fileName)); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.