diff --git a/src/main/java/app/handler/LoginWithPost.java b/src/main/java/app/handler/LoginWithPost.java index f0e6b880a..6f64f319d 100644 --- a/src/main/java/app/handler/LoginWithPost.java +++ b/src/main/java/app/handler/LoginWithPost.java @@ -42,14 +42,14 @@ public HandlerResponse handle(QueryParameters params) { user.getUserRole(), user.getNickname()); - RedirectResponse res = RedirectResponse.to("/"); - res.setCookie( + RedirectResponse response = RedirectResponse.to("/"); + response.setCookie( CookieBuilder.of("SID", session.getId()) .path("/") .httpOnly() .sameSite(CookieBuilder.SameSite.LAX) .maxAge(VariableConfig.ABSOLUTE_MS) ); - return res; + return response; } } diff --git a/src/main/java/app/handler/LogoutWithPost.java b/src/main/java/app/handler/LogoutWithPost.java new file mode 100644 index 000000000..7eef24b61 --- /dev/null +++ b/src/main/java/app/handler/LogoutWithPost.java @@ -0,0 +1,28 @@ +package app.handler; + +import http.HttpMethod; +import http.request.HttpRequest; +import http.response.CookieBuilder; +import web.handler.SingleArgHandler; +import web.response.HandlerResponse; +import web.response.RedirectResponse; +import web.session.SessionStorage; + +public class LogoutWithPost extends SingleArgHandler { + private final SessionStorage sessionManager; + + public LogoutWithPost(SessionStorage sessionManager) { + super(HttpMethod.POST, "/user/logout"); + this.sessionManager = sessionManager; + } + + @Override + public HandlerResponse handle(HttpRequest request) { + String sid = request.getCookieValue("SID").orElse(null); + if (sid != null) sessionManager.invalidate(sid); + + RedirectResponse response = RedirectResponse.to("/"); + response.setCookie(CookieBuilder.delete("SID").path("/")); + return response; + } +} diff --git a/src/main/java/config/AppConfig.java b/src/main/java/config/AppConfig.java index 83441ea2d..d98b5eb29 100644 --- a/src/main/java/config/AppConfig.java +++ b/src/main/java/config/AppConfig.java @@ -1,9 +1,6 @@ package config; -import app.handler.HomeHandler; -import app.handler.LoginWithPost; -import app.handler.RegisterWithGet; -import app.handler.RegisterWithPost; +import app.handler.*; import exception.ExceptionHandlerMapping; import exception.handler.ErrorExceptionHandler; import exception.handler.ServiceExceptionHandler; @@ -90,6 +87,7 @@ public List webHandlerList() { registerWithGet(), registerWithPost(), loginWithPost(), + logoutWithPost(), homeHandler()) ); } @@ -120,6 +118,11 @@ public LoginWithPost loginWithPost() { () -> new LoginWithPost(sessionStorage())); } + public LogoutWithPost logoutWithPost(){ + return getOrCreate("logoutWithPost", + () -> new LogoutWithPost(sessionStorage())); + } + public HomeHandler homeHandler(){ return getOrCreate("homeHandler", HomeHandler::new); } diff --git a/src/main/java/http/response/HttpResponse.java b/src/main/java/http/response/HttpResponse.java index cd088ab0f..74ab1e2d5 100644 --- a/src/main/java/http/response/HttpResponse.java +++ b/src/main/java/http/response/HttpResponse.java @@ -75,6 +75,12 @@ public void setBody(File file, byte[] body) { setHeader("Content-Length", String.valueOf(body.length)); } + public void redirectTo(String path){ + setStatus(HttpStatus.FOUND); + setHeader("Location", path); + setHeader("Content-Length", "0"); + } + private String guessContentType(File file) { String byName = URLConnection.guessContentTypeFromName(file.getName()); if (byName != null) return byName; diff --git a/src/main/java/web/filter/MemberAuthorizationFilter.java b/src/main/java/web/filter/MemberAuthorizationFilter.java index 2fab21dcb..34fd05b75 100644 --- a/src/main/java/web/filter/MemberAuthorizationFilter.java +++ b/src/main/java/web/filter/MemberAuthorizationFilter.java @@ -1,6 +1,5 @@ package web.filter; -import http.HttpStatus; import http.request.HttpRequest; import http.response.HttpResponse; import web.filter.authentication.UserRole; @@ -13,9 +12,7 @@ public void runFilter(HttpRequest request, HttpResponse response, FilterChainCon if(request.getAuthenticationInfo().getRole().equals(UserRole.MEMBER)){ chain.doFilter(); } else { - response.setStatus(HttpStatus.FOUND); - response.setHeader("Location", "/login"); - response.setHeader("Content-Length", "0"); + response.redirectTo("/login"); } } } diff --git a/src/main/resources/templates/layout/header.html b/src/main/resources/templates/layout/header.html index 2418d0953..0b5bfd3be 100644 --- a/src/main/resources/templates/layout/header.html +++ b/src/main/resources/templates/layout/header.html @@ -6,6 +6,9 @@
  • 닉네임: {{userNickname}}
  • +
    + +
    {{else1}}
  • 로그인