Project/2022.02_게시판 만들기

[스프링] 로그인 후 원래 요청한 페이지로 이동하기-1

멋쟁휘개발자 2022. 3. 7. 16:21

[배경]

세션에 저장된 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에서는 파라미터 값을 받아올 수 없음으로 당연한 결과이다.

 

다음 편에서는 파라미터까지 받아오는 법을 알아보자.

 

로그인 후 원래 요청한 페이지로 이동하기-2