[Spring Boot 게시판] 33일차

김정현·2022년 11월 10일
0

SPRINGBOOT게시판

목록 보기
33/36

1. getAttr로 afterLoginUri가 없는 경우 해결, 로그아웃 후 다시 원래 페이지로 이동(로그인을 필요로 한다면 메인페이지로 이동)

1) getAttr로 afterLoginUri가 없는 경우

public String getAfterLoginUri() {
		String requestUri = req.getRequestURI();
		switch (requestUri) {
		case "/usr/member/login":
		case "/usr/member/join":
		case "/usr/member/findLoginId":
		case "/usr/member/findLoginPw":
			return Ut.getUriEncoded(Ut.getAttr(paramMap, "afterLoginUri", ""));
		}
		return getEncodedCurrentUri();
	}
  • /usr/member/login 으로 요청시 파라미터 afterLoginUri의 값이 null이므로
  • 로그인페이지의 상단 로그인버튼의 이동 경로(href="${rq.loginUri}") 를 지정할수 없는 문제발생
  • ${rq.loginUri}는 로그인후 이동할 uri를 인코딩한 반환값을 더하고 있으므로
  • 로그인후 이동할페이지(afterLoginUri)의 값이 null이므로 인코딩 시(Ut.getUriEncoded()) NullPointException 발생
  • 즉, uri요청시 파라미터의 키와 밸류를 paramMap으로 저장했으므로
  • afterLoginUri가 없을경우 paramMap에는 저장되있지 않는다.
  • 인코딩시(Ut.getUriEncoded()) NullPointException발생 이를 해결하기위해
  • Ut.getAttr() 메소드 적용

2) Ut.getAttr()

    public static String getAttr(Map map, String attrName, String defaultValue) {
        if(map.containsKey(attrName)) {
            return (String)map.get(attrName);
        }
        return defaultValue;
    }
  • map에서 attrName 키가 존재하지 않는다면
  • defaultValue 값을 반환
  • 있다면 키에 대한 밸류값을 반환

3) 로그아웃 후 다시 원래 페이지로 이동

    public String getAfterLogoutUri() {
            String requestUri = req.getRequestURI();
            switch (requestUri) {
            case "/usr/article/write":
            case "/usr/article/modify":
            case "/usr/member/myPage":
                return Ut.getUriEncoded("/");
            }
            return getEncodedCurrentUri();
        }
  • 로그인 후 원래 페이지로 이동하는 방식이 동일
  • 로그아웃 페이지로 이동할때 현재 페이지의 uri를 함께 전달한다.
  • 이때 현재 페이지(req.getRequestURI())가 로그아웃 후 이동 되면 안되는 uri이면 / 로 이동
  • write / modify / myPage는 로그인이 필요한 페이지 이므로 / 이동 시킴

2. 게시물 리스트에서 게시물 상세페이지로 이동시 listUri 정보를 가지고 이동

문제점

  • 상세보기 페이지에서 로그인 후 뒤로가기 버튼을 누르면 리스트가아닌 로그인페이지가 나타는 문제
  • 기존 뒤로가기 버튼은 history.back() 이므로 리스트페이지가 아닌 로그인 페이지로 돌아감

1) 리스트 페이지

    <c:forEach var="article" items="${articles}">
        <tr>
            <td>${article.id } </td>
            <td>${article.forPrintType1RegDate}</td>
            <td><a class="~~생략~~" href="${rq.getArticleDetailUriFromArticleList(article)}">${article.title}</a></td>
            <td>${article.extra__writer}</td>
            <td>${article.hitCount}</td>
            <td>${article.goodReactionPoint}</td>
        </tr>
    </c:forEach>
  • 위의 코드는 반복문을 통해 게시물들을 리스팅
  • 게시물의 제목을 클릭시 상세보기 페이지로 이동
  • 상세보기 페이지에서 뒤로가기 버튼 클릭시 이전 리스트페이지로 돌아오기 위해
  • href="${rq.getArticleDetailUriFromArticleList(article)}" : 이동시 현재 리스트페이지의 uri를 함께 보냄

2) rq.getArticleDetailUriFromArticleList

	public String getArticleDetailUriFromArticleList(Article article) {
		
		return "../article/detail?id="+article.getId()+"&listUri="+getEncodedCurrentUri();
	} 
  • 위의 메소드는 해당 게시물의 상세보기페이지 uri에 현재리스트페이지의 주소를 추가한 uri를 반환

3) 상세보기 페이지

	<c:if test= "${not empty param.listUri}" >			
		<a class ="btn-text-link btn btn-active btn-ghost mx-4" href="${param.listUri}">뒤로가기</a>
	</c:if>
	<c:if test= "${empty param.listUri}" >			
		<button class ="btn-text-link btn btn-active btn-ghost mx-4" onclick="history.back();">뒤로가기</button>
	</c:if>	
  • 리스트페이지에서 현재 리스트 페이지 주소(listUri)를 쿼리스트링으로 전달했기 때문에 상세보기 페이지에서 이전 리스트 페이지의 주소 알수있다.
  • 뒤로가기 버튼 클릭전달 받은 리스트페이지의 주소로 이동
  • 이때 직접 usr/article/detail?id 로 요청시에는 이전 리스트페이지의 주소의 값을 전달되지 않기 때문에 history.back() 버튼을 노출

3. 댓글 작성,수정,삭제를 해도 원래의 상세페이지의 Uri 정보 유지

1) 상세보기 페이지

   <c:if test="${reply.extra__actorCanModify }">
		<a class="btn btn-ghost" href="../reply/modify?id=${reply.id }&replaceUri=${rq.encodedCurrentUri}">수정</a>
   </c:if>
   <c:if test="${reply.extra__actorCanDelete }">
		<a class="btn btn-ghost" onclick="if(confirm('삭제 하시겠습니까?') == false) return false;"
						href="../reply/doDelete?id=${reply.id }&replaceUri=${rq.encodedCurrentUri}">삭제</a>
   </c:if>
  • 상세보기 페이지에서 댓글 수정후 원래 상세보기 페이지로 이동하나

  • listUri의 정보를 잃게 되므로 뒤로가기 버튼 클릭시 history.back() 동작

  • 댓글 수정후 이동할페이지에 이전 리스트 uri 정보를 추가

  • 댓글 삭제 후 에도 이전리스트페이지 정보를 가지고있는 uri로 이동하기위해 추가

2) 댓글 수정페이지(listUri를 전달)

	<input type="hidden" name="replaceUri" value="${param.replaceUri }" />
  • 이전 리스트 페이지 정보를 가지고있는 uri(replaceUri)를 doModify에 전달

  • doModify에서 수정 후 전달받은 replaceUri로 이동

  • 댓글 작성, 삭제시 에도 listUri정보를 전달하여 작성,삭제후에도 listUri정보가 유지된 uri로 이동

  • 빈 href 속성 사용하기

    href=""는 현재 접속한 페이지에의 링크와 동일한 의미로 해석

0개의 댓글