Java/Spring Boot

Spring boot Interceptor Ajax 체크 (Redirect 이슈)

요술공주밍키 2023. 4. 5. 16:37

2023.03.30 - [Etc] - 타 도메인에 쿠키 생성하기

 

타 도메인에 쿠키 생성하기

✅ 문제 직면 현재 개발하는 서비스에서 다른 사이트의 로그인 정보를 받아야 하는 상황 속에서 SSO (Single-Sign-On)를 활용하지 않아본인이 직접 API를 통해 사용자 정보를 입력 받고 Session을 생성해

magicmk.tistory.com

이전 포스팅에서 Interceptor를 통해 Session을 체크하는 로직을 구현했었는데

Session을 체크하는 것 자체는 문제가 없었지만 다른 부분에서 약간의 문제가 발생하였는데

 

Ajax를 통해 접근 시 Redirect가 안된다는 것이었다.

 

그래서 Interceptor에서 Ajax 요청인지를 체크하고 로직을 다르게 구현하였다.


🟧 Interceptor & Ajax

⏹️ SessionInterceptor.java

public class SessionCheckInterceptor implements HandlerInterceptor {

    private static final String AJAX_HEADER_NAME = "X-Requested-With";
    private static final String AJAX_HEADER_VALUE = "XMLHttpRequest";
    private static final String REDIRECT_URL = "/permissionDenied"; // 세션 만료시 리다이렉트 할 URL

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HttpSession session = request.getSession(false);
        if (session == null || session.getAttribute("user") == null) {
            if (isAjaxRequest(request)) {
                // Ajax 요청일 경우, "SESSION_EXPIRED" 라는 값을 Response Header에 추가한다.
                response.setHeader("SESSION_EXPIRED", "true");
                return false;
            } else {
                // 일반 요청일 경우, 세션이 만료되었다는 페이지로 리다이렉트한다.
                response.sendRedirect(request.getContextPath() + REDIRECT_URL);
                return false;
            }
        }
        return true;
    }

    // Ajax 요청인지 체크하는 메소드
    private boolean isAjaxRequest(HttpServletRequest request) {
        return AJAX_HEADER_VALUE.equals(request.getHeader(AJAX_HEADER_NAME));
    }
}

위와 같이 Interceptor에서 들어오는 요청이 Ajax를 통한 요청인지를 확인한다.

 

⏹️ client.js

$.ajax({
    type: "POST",
    url: "/myPage",
    data: {},
    dataType: "json",
    success: function (data, textStatus, jqXHR) {
        // Ajax 요청이 성공한 경우, 처리할 코드 작성
        if (jqXHR.getResponseHeader("SESSION_EXPIRED") === "true") {
            alert("세션이 만료되었습니다.");
            window.location.href = "/permissionDenied";
        }
    },
    error: function (jqXHR, textStatus, errorThrown) {
    }
});

예상대로라면 Session이 존재하지 않을 경우 error를 통해 로직이 흘러갈 것 같은데

예상과는 다르게 Session이 존재하지 않아도 success로 떨어진다.

 

명확한 이유는 모르겠으나 Interceptor에서 데이터를 전달받았기 때문에 Ajax에서는 요청이 성공했다고 판단하는 것 같다. 혹시 이유를 알고 계신 분이 있다면 답글 부탁드립니다.


위와 같이 처리하면 Session이 만료가 된 뒤에 새로고침이나 URL로 이동할 때뿐만 아니라 Ajax를 통한 요청에서도 내가 원하는 특정 페이지로 리다이렉트 처리를 할 수 있다.