-
8. 블로그 프로젝트프로그래밍 2022. 7. 28. 17:08반응형
세션을 이용한 로그인 API를 구현하였다.
@RequiredArgsConstructor @RestController public class AccountApiController { private final AccountService accountService; @PostMapping("/api/login") public Boolean login(HttpServletRequest request, @RequestBody AccountRequestDto requestDto) { if (accountService.login(requestDto)) { HttpSession session = request.getSession(); session.setAttribute("success", requestDto); return true; } else { return false; } } @PostMapping("/api/account") public Boolean createAccount(@RequestBody AccountRequestDto requestDto) { return accountService.create(requestDto); } @PutMapping("/api/account") public void updatePassword(@RequestBody AccountRequestDto requestDto) { accountService.updatePassword(requestDto); } @DeleteMapping("/api/account") public void deleteAccount(@RequestBody AccountRequestDto requestDto) { accountService.delete(requestDto); } }
/api/login 부분에서 accountService의 login 메소드를 호출하고, true를 리턴하였을 때 success라는 속성의 세션을 설정한다. 여기서 계속 false를 리턴하는 오류가 나타났었는데, 이는 accountService의 login 메소드에서 비밀번호를 비교하는 부분에서 == 를 사용하여 발생한 문제였다. 자바에서는 문자열끼리의 비교를 할 때 == 를 사용하면 문자열을 비교해주는 것이 아니라 객체 자체의 비교를 수행하게 되어 올바른 결과가 나오지 않는다. 따라서 equals를 반드시 사용해주어야 한다.
@GetMapping("/") public String getMain(Model model, HttpServletRequest request, @RequestParam(required = false) String title, @RequestParam(required = false) String content) { if (!SessionCommon.isConfirm(request)) { return "login"; } if (title == null && content == null) { model.addAttribute("posts", postService.readAll()); } else if (title != null && content == null) { model.addAttribute("posts", postService.findByTitle(title)); } else { model.addAttribute("posts", postService.findByContent(content)); } return "main"; } @GetMapping("/create") public String getCreatePost(HttpServletRequest request) { if (!SessionCommon.isConfirm(request)) { return "login"; } return "create"; } @GetMapping("/update/{id}") public String getUpdatePost(HttpServletRequest request, @PathVariable Long id, Model model) { if (!SessionCommon.isConfirm(request)) { return "login"; } model.addAttribute("post", postService.readOne(id)); return "update"; } @GetMapping("/update/detail/{replyID}") public String updateDetail(HttpServletRequest request, @PathVariable Long replyID, Model model) { if (!SessionCommon.isConfirm(request)) { return "login"; } model.addAttribute("reply", replyService.findOne(replyID)); return "replyUpdate"; } @GetMapping("/detail/{id}") public String getDetail(HttpServletRequest request, @PathVariable Long id, Model model) { if (!SessionCommon.isConfirm(request)) { return "login"; } model.addAttribute("post", postService.readOne(id)); model.addAttribute("replies", replyService.findAll(id)); return "detail"; }
MainController의 일부분이다. 로그인을 하지 않았을 시 다른 페이지로 넘어가지지 않게 하기 위해 SessionCommon이라는 클래스를 만들고, isConfirm 메소드에 request를 인자로 넘겨주어 세션을 확인하게 한다.
public class SessionCommon { public static Boolean isConfirm(HttpServletRequest request) { HttpSession session = request.getSession(); AccountRequestDto requestDto = (AccountRequestDto) session.getAttribute("success"); if (requestDto == null) { return false; } else { return true; } } }
SessionCommon의 모습이다. isConfirm 메소드를 static으로 설정하여 따로 의존 관계를 만들지 않게 하였다. session.getAttribute() 메서드는 문자열을 매개변수로 받고, 그 문자열에 해당하는 세션이 없으면 null을 리턴한다. 이를 통해 null일 경우 접근할 수 없도록 하였다.
반응형'프로그래밍' 카테고리의 다른 글
Spring Web MVC 레퍼런스 (0) 2022.10.29 스프링 시큐리티 레퍼런스 (0) 2022.10.24 7. 블로그 프로젝트 (0) 2022.07.27 6. 블로그 프로젝트 (0) 2022.07.19 5. 블로그 프로젝트 (0) 2022.07.17