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의 값
이 된다.