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()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);
}
}
rq.getEncodedCurrentUri()) 가져오고 로그인 페이지에 전달2) 로그인.jsp
<input type="hidden" name="afterReplaceUri" value="${param.afterReplaceUri }"/>
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로 이동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();
}
../member/login?afterLoginUri=) 에 현재 페이지(getAfterLoginUri() ) 를 더한 uri을 반환 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;
}
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();
}
로그인 페이지에서 로그인 버튼을 누르게되면 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의 값이 된다.