ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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
Designed by Tistory.