[배경]
세션에 저장된 id값이 없을 경우, Interceptor를 통해 로그인 폼으로 이동하는 것까지는 좋았으나,
로그인 후 redirect로 설정한 main페이지로 고정된 이동이 마음에 들지 않았다.
[의도]
인터셉터를 통해 로그인하고 나면 유저가 원래 요청한 페이지로 이동하게 한다.
[원리]
FROM과 TO를 이해해야 한다.
어디서 요청을 하고, 어디로 요청을 했는지.
요청한 URL 값을 계속 가지고 다녀야 결국엔 요청 URL을 보여줄 수 있는 것
FROM은 아래의 메서드를 통해 알 수 있다.
- request.getRequestURL()
- request.getRequestURI()
✓ 예제 실습
Before 인터셉터
response.sendRedirect로 로그인 폼만 매칭할 경우, 로그인 폼으로 이동하는 순간, 요청했던 URL이 유실 된다.
따라서, 다음 Controller에서 지정한 페이지로밖에 이동할 수 없다.
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
if(session.getAttribute("sessionId")==null) {
System.out.println("sessionId 확인 실패");
response.sendRedirect("/loginView");
return false;
}
System.out.println("sessionId 확인 성공");
return true;
}
Before 로그인 Controller
//로그인 시작
@GetMapping(value="loginView")
public String loginView() {
return "member/login";
}
//로그인 폼에서 넘어온 값을 세션에 담아 메인으로 이동
@GetMapping(value="login")
public String login(JJMember member, HttpServletRequest request) {
HttpSession session = request.getSession();
session.setAttribute("sessionId", member.getId());
return "/main";
}
💡 문제의 이해
Before의 경우 인터셉터가 실행되자마자 최초에 요청했던 URL이 유실되었다.
그렇다면 요청 URL을 '최초 페이지 -> 인터셉터 -> 로그인 폼 -> 로그인 Action페이지' 모두 가지고 다니기 위해서 어떻게 해야할까?
After 인터셉터
response.sendRedirect로 로그인 폼과 요청 URL을 파라미터 값으로 넘김으로서 문제를 해결할 수 있다.
'최초 페이지 -> 인터셉터 -> 로그인 폼 ' 까지의 이동은 해결되었다.
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
if(session.getAttribute("sessionId")==null) {
System.out.println("sessionId 확인 실패");
//요청 URL을 가져오기 위해 request.getRequestURL이 추가 됨
response.sendRedirect("/loginView?requestURL="+request.getRequestURL());
return false;
}
System.out.println("sessionId 확인 성공");
return true;
}
다음 과정은 로그인 폼에서 요청 URL을 받아 로그인 Action페이지로 넘기는 것이다.
After 로그인 폼
아래와 같이 input 태그에 requestURL을 심어주고 hidden으로 숨기면 유저 모르게 컨트롤러로 넘길 수 있다.
<input type="hidden" name="requestURL" value="${param.requestURL}"/>
*${param} : 해당 파라미터 이름으로 값이 하나 밖에 없을 때 EL 내장 객체인 param을 사용하면 그 값을 읽을 수 있음
After 로그인 Controller
넘어온 URL 값을 포함하여 redirect..
//로그인 시작
@GetMapping(value="loginView")
public String loginView() {
return "member/login";
}
//로그인 폼에 추가된 requestURL값을 매개변수로 받아 null일 때, main으로.. 아니면 requestURL로 이동하게 한다.
@GetMapping(value="login")
public String login(JJMember member, String requestURL, HttpServletRequest request) {
HttpSession session = request.getSession();
session.setAttribute("sessionId", member.getId());
requestURL = requestURL==null || requestURL.equals("") ? "/main" : requestURL;
return "redirect:"+requestURL;
}
💡 추가적인 문제점 확인
여기까지 잘 따라했다면 추가 문제가 보일 것이다.
최초에 요청한 URL은 잘 가져왔는데, GET방식으로 함께 넘어온 파라미터가 유실되었다.
requestURL에서는 파라미터 값을 받아올 수 없음으로 당연한 결과이다.
다음 편에서는 파라미터까지 받아오는 법을 알아보자.
'Project > 2022.02_게시판 만들기' 카테고리의 다른 글
프로젝트 코드리뷰 (0) | 2022.03.07 |
---|---|
[스프링] 로그인 후 원래 요청한 페이지로 이동하기-2 (0) | 2022.03.07 |
[Javascript] 입력 검색어 제안 - datalist (0) | 2022.02.22 |
[스프링] 프로젝트 - 게시판 페이징 처리 (0) | 2022.02.19 |
[스프링] 프로젝트 - 게시판 댓글 구현(댓글 수정 편) (0) | 2022.02.19 |