1. 상황

비로그인 상태에서 계정필요 페이지에 접근했을 때, 로그인 페이지로 연결해주는 것은 어렵지 않게 구현할 수 있다.

그러나 연결된 로그인 페이지에서 로그인을 성공한 뒤, 바로 이전 페이지로 연결하는 기능도 추가하고 싶었다.

또한 이 프로젝트에는 PathVariable을 이용하여 여러 변수들을 활용하는 페이지도 있는데,

이 변수들이 살아있는 상태로 페이지에 연결하도록 하고싶었다.

 

2. 큰 틀

우선 나는 이 기능을 개인 프로젝트에 적용한 것이라, 실제 현업에서는 어떤 방식으로 쓰는지는 모르겠다.

더 효율적인 방법도 있을 수 있으며 참고 정도로만 보면 좋겠다.

 

1. 계정 필요 페이지에 비로그인 상태로 접근할 경우

2. 해당 Controller에서 로그인 페이지로 연결: 이때 '이전 url과 PathVariable 정보'도 같이 넘김

3. 로그인 페이지에서 로그인 데이터를 서버로 전송 요청: '이전 url과 PathVariable 정보'도 같이 전송

4. 계정 관리 Controller에서 요청 정보를 살피고, 일반 경로 로그인 페이지가 아닐 경우 '이전 url과 PathVariable 정보'를 활용하여 이전 페이지로 연결

 

3. 세부 과정

1. 계정 필요 페이지에 비로그인 상태로 접근할 경우

우선 해당 Controller에서 비로그인 상태를 잡는다.

 

2. 해당 Controller에서 로그인 페이지로 연결: 이때 페이지에 '이전 url과 PathVariable 정보' 같이 넘김

로그인 페이지로 연결하되, 현재 페이지 주소를 url 파라미터로 같이 넘긴다.

아래는 해당 Controller 메서드이다.

@RequestMapping("/sortingTime/{변수1}/{변수2}/{변수3}")
    public String sortingTime(Model model, HttpSession session, 
            @PathVariable(value = "변수1") String 변수1, 
            @PathVariable(value = "변수2") int 변수2, 
            @PathVariable(value = "변수3") String 변수3) {

        // 비로그인 상태인 경우
        if (loginInfo == null) {
            String url = "sortingTime/" + 변수1 + "/변수2/" + 변수3;
            try {
                String urlEncoded = URLEncoder.encode(url, "UTF-8");
                return "redirect:/로그인페이지?redirect=" + urlEncoded;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        
        // 로그인 상태인 경우
        model.addAttribute("변수1", 변수1);
        model.addAttribute("변수2", 변수2);
        return "로그인 상태시 가는 주소";
    }

이때 자꾸 한글 부분만 전송이 안되고 "??" 이렇게 물음표로 표현돼서 헤맸었는데,

한글이 url에 맞춰 인코딩이 되어있지 않아서 생긴 문제점이었다. 

 

3. 로그인 페이지에서 로그인 데이터를 서버로 전송 요청: '이전 url과 PathVariable 정보'도 같이 전송

일단 로그인 페이지에서 '이전 url과 PathVariable 정보'를 받기만 하면, 

로그인 페이지에서는 로그인 정보와 '이전 url과 PathVariable 정보'를 같이 서버에 전송하기만 하면 된다!

난 hidden type을 이용하여 서버로 같이 보냈다.

<input type="hidden" id="redirectUrl" name="redirectUrl"/>
<input type="hidden" id="redirectUrlTag" name="redirectUrlTag"/>

<script>
    // url에서 파라미터로 전달된 정보 가져오기
    var pathfull = new URL(window.location.href);
    var pathParam = pathfull.searchParams.get('redirect');
    var pathParamDevided = pathParam.split("/");

    window.onload = function() {
      alert(pathParam);
      document.getElementById('redirectUrl').value = pathParamDevided[0] + "/" + pathParamDevided[1] + "/" + pathParamDevided[2] + "/";
      document.getElementById('redirectUrlTag').value = pathParamDevided[3];
    }
</script>

여기서 보내는 정보를 그대로 url로 활용하기 때문에

"/"로 같이 포함하면 서버에서 "/"도 같이 url 인코딩을 하게 되어 "%2F"로 변환되어 url로 활용하지 못한다.

때문에 여기서는 한글 부분만 다른 변수로 따로 보냈다.

 

4. 계정 관리 Controller에서 요청 정보를 살피고, 일반 경로 로그인 페이지가 아닐 경우 경우 '이전 url과 PathVariable 정보'를 활용하여 이전 페이지로 연결

계정 관리 Controller이다.

@PostMapping("/account/login")
    public String loginSubmit(LoginReqDto loginReqDto, Errors errors, HttpSession session, HttpServletRequest request) {
        // 로그인 시도
        try{
            // 로그인 세션 생성
            
            // 페이지에서 보내는 정보 가져오기
            String redirectURL = request.getParameter("redirectUrl");
            String redirectUrlTag = request.getParameter("redirectUrlTag");
            
            // 페이지에서 보내는 정보가 있을 경우(일반 경로 로그인 페이지가 아닐 경우)
            if (redirectURL != "") {
                try {
                    String tagEncoded = URLEncoder.encode(redirectUrlTag, "UTF-8");
                    String urlEncoded = redirectURL + tagEncoded;
                    return "redirect:/"+ urlEncoded;
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } 
            
            // 일반 경로 로그인 페이지일 경우, 로그인 성공 페이지로
            return "account/loginSuccess";
        } catch(익셉션 e) {
            // 익셉션 처리
        }
    }

일반 경로 로그인 페이지인지 아닌지 구분하여, 

일반 경로가 아닐 경우, 로그인 세션 생성 뒤 + '이전 url과 PathVariable 정보'를 이용하여 이전 페이지로 바로 연결해주면 완성!

'개인 프로젝트 > 기능' 카테고리의 다른 글

Spring에 RESTful 적용을 위한 Ajax 사용  (0) 2022.04.19

+ Recent posts