나는 분명 일정추가로 이동하고 싶었는데 로그인 후에도 메인 페이지로 이동하는것을 알 수 있다.
분명! url에 로그인 후 이동하려는 페이지도 넣었고 코드도 잘못된게 없어보이는데 왜 이런 현상이 일어나는 것일까
1. 먼저 미 로그인 사용자를 처리하는 인터셉터 먼저 살펴보자.
로그인 실패시 "/login?redirectURL=" + "가려했던 페이지" 로 이동하라고 분명 잘 처리하고 있었다.
response.sendRedirect("/login?redirectURL="+requestURI);
2. 그렇다면 로그인을 처리하는 컨트롤러로 가보자. 해당 컨트롤러는 로그인 할시 @RequestParam으로 받아온 redirectURL을 이용하여 해당페이지로 이동하는 로직을 가지고 있다.
분명 컨트롤러도 틀리지 않았는데 도대체 뭐가 문제일까!
(실패시에도 url은 유지된다. 왜냐하면 클라이언트에게 redirect로 새로운 요청을 처리하게 한것이 아니고 단순히 클라이언트에게 login.html을 내보내라는 것이기 때문에 url은 유지된다.)
3. html이 문제일 수 있다.
나는 여기서 실수를 저질렀는데 로그인을 한다면 당연히 action="/login"을 해야한다고 생각했다.
당연히 이렇게 해야 @PostMapping("/login")으로 작성된 로그인 컨트롤러를 통해 로그인이 처리된다고 생각했기때문이다. 이 방법은 옳다. 하지만 로그인전 눌렀던 페이지로 로그인후 이동할때는 잘못된 코드작성이다.
만약 action="/login"을 작성하게 된다면 @PostMapping("/login")에는 url이 "/login"만 전송되게 된다.
당연한 일이다. 왜냐하면 "우리는 form을 "/login"으로 처리해주세요 라고 서버에 보냈기 때문이다."
하지만 이건 우리가 원했던 결과가 아니다. 우리는 "/login?redirectURL=[원하는 페이지]"를 서버가 처리하기 원한다.
따라서 action을 비워줘야한다.
Get으로 /login을 받고 접근한 상태에서
action=""을 한다면 자기 자신의 url(/login?redirectURL=[원하는 페이지])로 서버로 요청을 보내 우리가 원하는 결과를 얻을 수 있다.