[Spring Boot 게시판] 13일차

김정현·2022년 10월 13일
0

SPRINGBOOT게시판

목록 보기
12/36

1. 로그인, 로그아웃 상태에 따라서 버튼 노출 제어

head.jspf

		<c:if test="${!rq.isLogined()}">
            <li class="hover:underline">
                <a class="flex h-full items-center px-3" href="../member/login">
                    <span>LOGIN</span>
                </a>
            </li>
		</c:if>
        <c:if test="${rq.isLogined()}">
            <li class="hover:underline">
                <a class="flex h-full items-center px-3" href="../member/doLogout">
                    <span>LOGOUT</span>
                </a>
            </li>
  • LOGIN, LOGOUT 버튼은 head.jspf에 코드가 작성되있음
  • 인터셉터를 통해 rq객체(로그인에 관한 정보를 담은 객체)를 만들어서 requset.setAttribute() 하고 있기 때문에
  • rq객체를 통해 로그인상태 와 로그아웃 상태에따른 버튼 노출을 제어 , c:if 태그 사용

2. 로그인, 로그아웃에 Rq 적용 및 로그아웃 후 메인페이지로 이동

1) 로그인, 로그아웃에 Rq 적용

        public String doLogin(HttpServletRequest req, String loginId, String loginPw) {
            Rq rq = (Rq) req.getAttribute("rq");

            if (rq.isLogined()) {
                return Ut.jsHistoryBack("이미 로그인 되었습니다.");
            }
  • rq객체를 통해 로그인 정보를 가져옴

2) rq.login(), rq.logout()

   		public void login(Member member) {
            session.setAttribute("loginedMemberId", member.getId());
            session.setAttribute("loginedMemberLoginId", member.getLoginId());		
        }

        public void logout() {
            session.removeAttribute("loginedMemberId");
            session.removeAttribute("loginedMemberLoginId");		
        }
  • 로그인,로그아웃 기능을 rq객체에 login() , logout() 메소드를 만들어 사용
  • rq객체에는 HttpSevletRequest객체가 저장되있어 HttpSevletRequest객체를 통해 HttpSession을 가져오고
  • login() , logout()메소드를 HttpSession을 통해 구현

3) 로그아웃 후 메인페이지로 이동

@RequestMapping("/usr/member/doLogout")
	@ResponseBody
	public String doLogout(HttpServletRequest req) {
		Rq rq = (Rq) req.getAttribute("rq");

		if (rq.isLogined() == false) {
			return Ut.jsHistoryBack("로그아웃 상태 입니다.");
		}

		rq.logout();

		return Ut.jsReplace("로그아웃 했습니다.", "/");
	}
  • 위에 작성한 메서드 rq.logout() 통해 로그아웃을 하고
  • Ut.jsReplace("로그아웃 했습니다.", "/"); 를 통해 로그아웃후 메인페이지로 이동

3. modify form을 보여주기 전에 체크, modify form 제작, url로 수정하려는 시도 방어, 수정 후에 replace

1) 수정 시도시 수정페이지를 보여주기 이전에 체크

    @RequestMapping("/usr/article/modify")
	public String showModify(HttpServletRequest req, Model model, int id) {
		Rq rq = (Rq) req.getAttribute("rq");

		Article article = articleService.getForPrintArticle(rq.getLoginedMemberId(), id);
		model.addAttribute("article", article);
		
		if (article == null) {
			return rq.jsHistoryBackOnView(Ut.f("%d번 게시물은 존재하지 않습니다.", id));
		}
		ResultData actorCanModifyRd = articleService.actorCanModify(rq.getLoginedMemberId(), article);
		
		if (actorCanModifyRd.isFail()) {
			return rq.jsHistoryBackOnView(actorCanModifyRd.getMsg());
		}

		return "usr/article/modify";
	}
  • 수정페이지를 보여주기 전에 게시물 존재여부, 권한 체크하여 수정페이지로 이동 제한
  • @ResponseBody어노테이션이 없기때문에
  • rq.jsHistoryBackOnView()의 메소드는 jsp파일위치 를 반환 해야한다.
  • 게시물 존재하지 않을시, 권한이 없다면 반환된 jsp파일위치로 이동
  • 게시물이 존재하고 권한이 있을시 modify.jsp파일을 보여주게 됨

2) rq.jsHistoryBackOnView

   		public String jsHistoryBackOnView(String msg) {
		req.setAttribute("msg", msg);
		req.setAttribute("historyBack", true);
		return "usr/common/js";
	}
  • 게시물 존재하지 않을시 , 수정 권한이 없을시 이동해야할 jsp파일의 위치를 반환하는 메소드
  • rq객체 에는 HttpSevletRequest객체를 가지고 있다.
  • "usr/common/js" 로 이동전에 setAttribute를 통해 msghistoryBack을 request객체에 담는다.

3) usr/common/js.jsp

	<script>
        var historyBack = '${historyBack}' == 'true';
        var msg = '${msg}'.trim();
        if (msg) {
            alert(msg);
        }
        if (historyBack) {
            history.back();
        }
        var replaceUri = '${replaceUri}'.trim();
        if (replaceUri) {
            location.replace(replaceUri);
        }
	</script>
  • 수정페이지로 이동 실패시 보여주게 되는 jsp파일
  • 자바스크립트에서도 EL표현식을 사용할수 있다.
  • request객체로부터 담겨져있는 msg historyBack을 통해 페이지 뒤로가기메세지경고창 을 구현

4) url로 수정하려는 시도 방어, 수정 후에 replace

	@RequestMapping("/usr/article/doModify")
	@ResponseBody
	public String doModify(HttpServletRequest req, int id, String title, String body) {
		Rq rq = (Rq) req.getAttribute("rq");

		Article article = articleService.getForPrintArticle(rq.getLoginedMemberId(), id);

		if (article == null) {
			return Ut.jsHistoryBack(Ut.f("%d번 게시물은 존재하지 않습니다.", id));
		}
		
		ResultData actorCanModifyRd = articleService.actorCanModify(rq.getLoginedMemberId(), article);
		if (actorCanModifyRd.isFail()) {
			return Ut.jsHistoryBack(actorCanModifyRd.getMsg());					
		}
		
		articleService.modifyArticle(id, title, body);
		return Ut.jsReplace(Ut.f("%d번 게시물 수정", id), Ut.f("../article/detail?id=%d", id));
	}
  • 권한체크를 통과하고 수정 페이지(/usr/article/modify)에서 /usr/article/doModify로 이동하는 정상적인 루트 문제가 없지만
  • /usr/article/doModify url로 직접 수정시도시수정권한체크를 하여 수정시도를방어```해야한다.

자바스크립트 조건식

자바스크립트의 조건식은 논리형 데이터(true, false)가 아닌 다른 형의 데이터가 입력되어도 true 또는 false로 인식된다.

0, null, “”(빈 문자), undefined

이 값들이 조건식에 입력되면 false를 반환한다.

이 외의 값은 true 로 인식된다

0개의 댓글