[Spring Boot 게시판] 32일차

김정현·2022년 11월 9일
0

SPRINGBOOT게시판

목록 보기
32/36

1. 로그인이 필요한 요청시 로그인 페이지로 이동

1) NeedLoginInterceptor

public class NeedLoginInterceptor implements HandlerInterceptor {
	@Autowired
	private Rq rq;
	
	@Override
	public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) throws Exception {
		if(!rq.isLogined()) {
			rq.printReplaceJs("로그인 후 이용가능 합니다.","../member/login");
			return false;
		}
		
		return HandlerInterceptor.super.preHandle(req, resp, handler);
	}
}
  • 로그인이 필요한 요청이 오면 NeedLoginInterceptor에서 가로채고 있으로
  • rq.printReplaceJs() 메소드(response)를 통해 로그인 페이지로 이동

2) printReplaceJs

public void printReplaceJs(String msg, String uri) {
		resp.setContentType("text/html; charset=UTF-8");
		println(Ut.jsReplace(msg,uri));				
	}
  • printHistoryBackJs() 메소드와 동일하나 history.back()이 아닌 location.replace()

2. 로그인 후 원래 요청한 페이지로 이동

1) NeedLoginInterceptor

public class NeedLoginInterceptor implements HandlerInterceptor {
	@Autowired
	private Rq rq;
	
	@Override
	public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) throws Exception {
		if(!rq.isLogined()) {
			String afterReplaceUri = rq.getEncodedCurrentUri();
			rq.printReplaceJs("로그인 후 이용가능 합니다.","../member/login?afterReplaceUri="+afterReplaceUri);
			return false;
		}
		
		return HandlerInterceptor.super.preHandle(req, resp, handler);
	}
}
  • 로그인후 요청한 페이지로 이동 시키기 위해 uri를 알아야한다.
  • rq객체로 부터 uri를(rq.getEncodedCurrentUri()) 가져오고 로그인 페이지에 전달

2) 로그인.jsp

<input type="hidden" name="afterReplaceUri" value="${param.afterReplaceUri }"/>
  • 실질적으로 세션에 로그인 정보를 기록하는 doModify(controller)에 afterReplaceUri데이터를 함께 전달하기위함

3) doLogin

@RequestMapping("/usr/member/doLogin")
	@ResponseBody
	public String doLogin(String loginId, String loginPw, @RequestParam(defaultValue = "/") String afterReplaceUri) {
						~~~ 생 략 ~~~
		return Ut.jsReplace(Ut.f("%s님 환영합니다.", member.getName()), afterReplaceUri);
	}
  • 세션에 로그인 정보를 기록 후 로그인 페이지 전달받은 afterReplaceUri로 이동

3. 특정 페이지에서 로그인 후 다시 원래 페이지로 복귀

1) head.jspf

    <c:if test="${!rq.isLogined()}">
        <li class="hover:underline">
            <a class="flex h-full items-center px-3" href="${rq.loginUri}">
                <span>LOGIN</span>
            </a>
        </li>
    </c:if>
  • 특정 페이지에서 로그인을 한후 원래 페이지를 알아야 복귀 가능하다.
  • 페이지의 상단의 로그인 버튼은 head.jspf에 작성 되있으므로 head.jspf의 로그인 버튼의 href 수정
  • 로그인버튼의(href="../member/login") href에 원래페이지의 uri를 추가하여 원래 페이지로 복귀를 하게끔 한다.

2) rq.getLoginUri()

    public String getLoginUri() {
            return "../member/login?afterLoginUri=" + getAfterLoginUri();
        }
  • head.jspf에 로그인버튼 클릭시 이동 되는 uri를 메소드로 구현한것으로
  • 로그인 페이지(../member/login?afterLoginUri=) 에 현재 페이지(getAfterLoginUri() ) 를 더한 uri을 반환

4. 로그인 후 접근할 수 없는 페이지는 afterLoginUri 값을 유지

1) Ut.getPramMap

   public static Map<String, String> getParamMap(HttpServletRequest request) {
		Map<String, String> param = new HashMap<>();

		Enumeration<String> parameterNames = request.getParameterNames();

		while (parameterNames.hasMoreElements()) {
			String paramName = parameterNames.nextElement();
			String paramValue = request.getParameter(paramName);

			param.put(paramName, paramValue);
		}

		return param;
	}
  • http요청시 파라미터와 값을 HashMap으로 반환 하는 메소드

2) rq.getAfterLoginUri()

	 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(paramMap.get("afterLoginUri"));
		}
		return getEncodedCurrentUri();
	}
  • 아래의 메소드는 로그인 버튼 클릭시 현재 uri를 더하는 메소드

    public String getLoginUri() {
    		return "../member/login?afterLoginUri=" + getAfterLoginUri();
    	}
    • getAfterLoginUri()는 현재페이지의 uri를 반환
  • 로그인 페이지에서 로그인 버튼을 누르게되면 AfterLoginUri가 계속 더한값이 나오는 문제 발생

  • 또한 로그인페이지에서 로그인 버튼을 클릭후 로그인시 원래 있던 페이지가 로그인 페이지로 적용되는 문제 발생

  • 이를 해결 하기위해 getAfterLoginUri() 수정

  • http://localhost:8081/usr/home/main 뷰에서 로그인 버튼의 href는 ../member/login?afterLoginUri= + /usr/home/main

  • ../member/login?afterLoginUri= + /usr/home/main 에서

  • 로그인 버튼(즉, 로그인 페이지에서 로그인버튼)의 href는 ../member/login?afterLoginUri= + paramMap에 afterLoginUri의 값이 된다.

0개의 댓글