팝업 로그인을 사용할 때 로그인이 성공적이면 팝업이 떠있던 페이지로 가는게 자연스럽다. 그러나.. 스프링 시큐리티에서 사용자가 팝업을 쓸지 뭘 쓸지 어떻게 알겠는가.. 기본 설정을 그대로 사용하면 무조건 루트(/)로 이동한다. 인증이 필요한 페이지를 요청했을 경우에는 로그인이 끝난뒤에 자연스레 요청했던 페이지로 이동해주긴 하지만 팝업은 사용자가 의도적으로 해당 페이지에서 로그인을 눌렀을 경우기 때문에 적절한 처리를 기대할 수 없다.

1. 우선 팝업 로그인 창을 띄우는 컨트롤러를 만들자.

@RequestMapping("/loginpopup")
public void loginpopup(@RequestHeader("Referer") String from, Model model){
    model.addAttribute("_to", from);
}

요기서 재밌는 스프링 @MVC 기능을 쓰고 있는데 바로 @RequestHeader다. 요청을 보내면 헤더 정보에 어디서 온 요청인지 알려주는 Referer 헤더가 들어있다. 팝업 로그인을 요청했던 그 URL이 바로 저기에 담겨오게 되고 나중에 로그인을 처리했을 때 저 URL로 이동하게 해줘야한다.

2. 팝업 로그인 뷰 파일

<input type="hidden" name="_to" value="${_to}" >

이렇게 히든 필드를 추가한다. 이 정보를 로그인 핸들러에서 참조할 수 있게 해주기 위해서..

3. 로그인 Success 핸들러 구현하기

public class PopupLoginSucessHandler extends SavedRequestAwareAuthenticationSuccessHandler {

    @Override
    protected String determineTargetUrl(HttpServletRequest request, HttpServletResponse response) {
        String s = request.getParameter("_to");
        System.out.println(s);
        if(s != null)
            return s;
        else
            return super.determineTargetUrl(request, response);
    }
}

인증이 필요한 요청을 했을 때 로그인 창으로 이동했다가 원래 요청했던 페이지로 이동시켜주는 핸들러가 바로 SavedRequestAwareAuthenticationSuccessHandler다. 따라서 이 기능을 살리면서 내가 원하는 부가 기능을 추가하기 위해 이녀석을 상속했고, 필요한 부분인 타겟 URL 설정 하는 메서드를 재정의했다. 코드 내용은 간단하니까.. 설명 패스..

4. 핸들러 등록

<beans:bean id="popupLoginSucessHandler" class="springsprout.service.security.PopupLoginSucessHandler"/>

<form-login login-page="/login"    authentication-success-handler-ref="popupLoginSucessHandler"/>

이렇게 연결해주면 된다.

끝…